Namen te vadnice je skozi primere poučiti 2D programiranje iger in jezik C. Avtor je sredi osemdesetih let programiral igre, v 90-ih je bil eno leto oblikovalec iger v MicroProseu. Čeprav veliko tega ni pomembno za programiranje današnjih velikih 3D iger, bo za majhne priložnostne igre koristen uvod.
Izvajanje Kača
Igre, kot so kača, pri katerih se predmeti premikajo čez 2D polje, lahko predmete igre predstavljajo bodisi v 2D mreži ali kot enorazsežni niz predmetov. "Predmet" tukaj pomeni kateri koli predmet igre, ne pa objekt, ki se uporablja v objektno usmerjenem programiranju.
Nadzor igre
Tipke se premikate z W = navzgor, A = levo, S = dol, D = desno. Pritisnite tipko Esc, da zapustite igro, f, da preklopite hitrost sličic (ta ni sinhronizirana z zaslonom, zato je lahko hitra), tipko za zavihek, da preklopite informacije o odpravljanju napak in p, da jo zaustavite. Ko je zaustavljen, se napis spreminja in kača utripa,
Pri kači so glavni predmeti igre
- Kača
- Pasti in sadje
Za namene igranja bo matrika intov vsebovala vsak igralni predmet (ali del za kačo). To lahko pomaga tudi pri upodabljanju predmetov v medpomnilnik zaslona. Grafiko za igro sem zasnoval na naslednji način:
- Telo vodoravne kače - 0
- Vertikalno telo kače - 1
- Glavo v 4 x 90-stopinjskih rotacijah 2-5
- Rep v 4 x 90-stopinjskih rotacijah 6-9
- Krivulje za smer se spreminjajo. 10-13
- Apple - 14
- Jagoda - 15
- Banana - 16
- Pasti - 17
- Oglejte si grafično datoteko kače snake.gif
Torej, smiselno je te vrednosti uporabiti v vrsti mreže, ki je definirana kot blok [ŠIRINA * HEIGHT]. Ker je v omrežju samo 256 lokacij, sem se odločil, da ga shranim v enodimenzionalni niz. Vsaka koordinata na mreži 16 x16 je celo število 0-255. Uporabili smo vmesnike, da boste lahko povečali mrežo. Vse je definirano s #defines s ŠIRINO in VIŠINO oba 16. Ker je slika kače 48 x 48 slikovnih pik (GRWIDTH in GRHEIGHT #defines), je okno na začetku določeno kot 17 x GRWIDTH in 17 x GRHEIGHT, da je le nekoliko večje od omrežja.
To ima prednosti pri hitrosti igre, saj je uporaba dveh indeksov vedno počasnejša od enega, vendar pomeni, da se navpično premikate ali odštejete 1 od kačinih koordinat Y, če odštejete ŠIRENO. Dodajte 1, da se premaknete desno. Kljub temu, da smo zahrbtni, smo definirali tudi makro l (x, y), ki ob prevajanju pretvori koordinate x in y.
Kaj je makro?
#define l (X, Y) (Y * ŠIRINA) + X
Prva vrstica je kazalo 0-15, druga 16-31 itd. Če je kača v prvem stolpcu in se premika levo, potem mora ček, ki zadene steno, preden se premaknete v levo, preveriti, če je koordinata% WIDTH == 0 in koordinata desne stene% WIDTH == WIDTH-1. % Je operator modula C (kot je aritmetika ure) in preostanek vrne po delitvi. 31 div 16 pusti preostanek 15.
Upravljanje s kačo
V igri so trije bloki (int nizi).
- kača [], obroček za obroče
- oblika [] - Drži grafične kazalce Snake
- dir [] - Drži smer vsakega segmenta kače, vključno z glavo in repom.
Kača je na začetku igre dolga dva segmenta z glavo in repom. Oboje lahko kaže v 4 smereh. Za sever je glava indeks 3, rep 7, za vzhod glavo 4, rep 8, za jug glava 5 in rep 9, za zahod pa glava 6 in rep 10. Medtem ko sta kača dva segmenta, sta glava in rep vedno narazen na 180 stopinj, a po tem, ko kača raste, sta lahko 90 ali 270 stopinj.
Igra se začne tako, da je glava obrnjena proti severu na lokaciji 120 in rep obrnjen proti jugu na 136, približno osrednji. Z majhnimi stroški približno 1600 bajtov za shranjevanje lahko v igri dobimo opazno izboljšanje hitrosti, če zadržujemo lokacije kače v zgoraj omenjenem medpomnilnem obroču kače [].
Kaj je obroč za prstan?
Medpomnilnik je blok pomnilnika, ki se uporablja za shranjevanje čakalne vrste, ki je določene velikosti in mora biti dovolj velika, da lahko shrani vse podatke. V tem primeru gre samo za kačo. Podatki se potisnejo na sprednji del čakalne vrste in se odstranijo od zadaj. Če sprednji del čakalne vrste zadene konec bloka, potem se ovije. Dokler je blok dovolj velik, sprednji del čakalne vrste ne bo dohiteval hrbta.
Vsaka lokacija kače (tj. Enojna cela koordinata) od repa do glave (t.j. nazaj) je shranjena v obročnem medpomnilniku. To daje hitrostne koristi, saj ne glede na to, koliko časa kača dobi, je treba med premikanjem spreminjati samo glavo, rep in prvi segment po glavi (če obstaja).
Hranjenje nazaj je koristno tudi zato, ker kača dobi hrano, ko bo naslednja premaknjena. To dosežemo tako, da glavo pomaknemo na eno mesto v obročnem obroču in spremenimo staro mesto glave, da postane segment. Kača je sestavljena iz glave, 0-n segmentov) in nato repa.
Ko kača poje hrano, spremenljivko atefood nastavimo na 1 in preverimo v funkciji DoSnakeMove ()
Premikanje kače
Za kazanje na mesta glave in repa v medpomnilnem obroču uporabljamo dve indeksni spremenljivki, headindex in tailindex. Te se začnejo pri 1 (headindex) in 0. Torej lokacija 1 v obročnem medpomnilniku vsebuje lokacijo (0-255) kače na plošči. Lokacija 0 vsebuje lokacijo repa. Ko se kača premakne za eno lokacijo naprej, se tudi repa in headindex povečata za eno, tako da se zaokroži na 0, ko doseže 256. Zdaj je lokacija, ki je bila glava, tam, kjer je rep.
Tudi z zelo dolgo kačo, ki se vije in zvija v recimo 200 segmentih. le headindex, segment poleg glave in tailindex se spremeni vsakič, ko se premika.
Opomba zaradi načina SDL deluje, vsak okvir moramo narisati celotno kačo. Vsak element je vstavljen v medpomnilnik okvirja in nato obrnjen, tako da je prikazan. To ima eno prednost, čeprav lahko kačo gladko potegnemo z nekaj pikami, ne pa celotnega položaja mreže.