Účelom tohto tutoriálu je výučba programovania 2D hier a jazyka C pomocou príkladov. Autor pracoval na programovaní hier v polovici osemdesiatych rokov a v 90. rokoch bol hercom na MicroProse. Aj keď väčšina z toho nie je relevantná pre programovanie dnešných veľkých 3D hier, pre malé príležitostné hry bude slúžiť ako užitočný úvod.
Implementácia hada
Hry ako had, kde sa objekty pohybujú po 2D poli, môžu predstavovať herné objekty v 2D mriežke alebo ako jednorozmerné pole objektov. „Objekt“ znamená akýkoľvek herný objekt, nie objekt používaný v objektovo orientovanom programovaní.
Ovládanie hry
Klávesy sa pohybujú pomocou W = hore, A = doľava, S = dole, D = doprava. Stlačením klávesu Esc ukončíte hru, f prepínate obnovovací kmitočet (nie je synchronizovaný s displejom, takže môže byť rýchly), kláves Tab prepína ladiace informácie a p ho pozastavuje. Keď je pauza pozastavená, názov sa zmení a had bliká,
Na hada sú hlavné herné objekty
- Had
- Pasce a ovocie
Kvôli hrateľnosti bude mať každý herný objekt (alebo jeho časť) hada rad mravcov. Môže to tiež pomôcť pri vykresľovaní objektov do vyrovnávacej pamäte obrazovky. Grafiku pre hru som navrhol nasledovne:
- Horizontálne telo hada - 0
- Vertikálne telo hada - 1
- Hlava v rotácii 4 x 90 stupňov 2-5
- Chvost v rotácii 4 x 90 stupňov 6-9
- Krivky pre zmenu smeru. 10-13
- Apple - 14
- Jahoda - 15
- Banán - 16
- Trap - 17
- Zobraziť grafický súbor hada snake.gif
Preto má zmysel používať tieto hodnoty v type mriežky definovanej ako blok [WIDTH * HEIGHT]. Pretože v mriežke je iba 256 miest, rozhodol som sa uložiť ich do jedného rozmerového poľa. Každá súradnica na mriežke 16 x 16 je celé 0-255. Použili sme mravce, aby ste mohli zväčšiť mriežku. Všetko je definované #definovaním s obojsmernou šírkou a výškou 16. Pretože hadí grafika má 48 x 48 pixelov (GRWIDTH a GRHEIGHT #definované), okno je pôvodne definované ako 17 x GRWIDTH a 17 x GRHEIGHT, aby bolo iba o niečo väčšie ako mriežka.
To má výhody v rýchlosti hry, pretože použitie dvoch indexov je vždy pomalšie ako jeden, ale znamená to, že namiesto pridávania alebo odčítania 1 z hadích súradníc Y sa budete pohybovať vertikálne, odčítate WIDTH. Pridajte 1, aby ste sa posunuli doprava. Napriek tomu, že sme záludní, definovali sme tiež makro l (x, y), ktoré prevádza súradnice xay v čase kompilácie.
Čo je to makro?
# definovať 1 (X, Y) (Y * WIDTH) + X
Prvý riadok je index 0-15, druhý 16-31 atď. Ak je had v prvom stĺpci a pohybuje sa vľavo, potom kontrola, či sa dotkne steny, pred pohybom vľavo musí skontrolovať, či je súradnica% WIDTH == 0 a pre pravú stenu súradnice% WIDTH == WIDTH-1. % Je operátor modulu C (podobne ako aritmetika hodín) a po rozdelení vráti zvyšok. 31 div 16 ponecháva zvyšok 15.
Spravovanie hada
V hre sa používajú tri bloky (int polia).
- snake [], kruhový buffer
- shape [] - Obsahuje grafické hada Snake
- dir [] - Zachytáva smer každého segmentu hada vrátane hlavy a chvosta.
Na začiatku hry má had dva segmenty s hlavou a chvostom. Oba môžu ukazovať v 4 smeroch. Pre sever je hlava 3, chvost je 7, pre východ je 4, chvost je 8, pre južnú hlavu je 5 a chvost je 9 a pre západ je to hlava 6 a chvost je 10, Zatiaľ čo had je dva segmenty dlhá, hlava a chvost sú od seba vždy 180 stupňov, ale po tom, čo had rastie, môžu byť 90 alebo 270 stupňov.
Hra začína hlavou smerom na sever na mieste 120 a chvostom smerom na juh na 136, približne v strede. Pri nepatrných nákladoch na približne 1600 bajtov úložného priestoru môžeme dosiahnuť výrazné zlepšenie rýchlosti v hre tak, že budeme držať polohy hadíc v snake [] krúžkovom bufferi uvedenom vyššie.
Čo je to Ring Buffer?
Prstencová vyrovnávacia pamäť je blok pamäte používaný na ukladanie frontu, ktorý má pevnú veľkosť a musí byť dostatočne veľký na to, aby uchovával všetky údaje. V tomto prípade je to len pre hada. Dáta sa tlačia na prednú časť frontu a odoberú sa zozadu. Ak predná strana frontu zasiahne koniec bloku, omotá sa okolo. Pokiaľ je blok dostatočne veľký, predná strana frontu nikdy nezachytí chrbtom.
Každé miesto hada (t. J. Súradnice jediného int) od chvosta po hlavu (t.j. dozadu) je uložené v prstencovej vyrovnávacej pamäti. Toto poskytuje výhody rýchlosti, pretože bez ohľadu na to, ako dlho sa had dostane, je potrebné pri pohybe meniť iba hlavu, chvost a prvý segment po hlave (ak existuje).
Jeho uloženie dozadu je tiež prospešné, pretože keď sa hadovi dostane jedlo, had sa pri ďalšom pohybe rozrastie. To sa dosiahne presunutím hlavy o jedno miesto do kruhového nárazníka a zmenou starého umiestnenia hlavy na segment. Had sa skladá z hlavy, 0-n segmentov) a potom z chvosta.
Keď had zje jedlo, premenná atefood sa nastaví na 1 a skontroluje sa vo funkcii DoSnakeMove ()
Pohybovanie hadom
Používame dve indexové premenné, headindex a tailindex, aby ukazovali na umiestnenie hlavy a chvosta v kruhovom bufferi. Začínajú sa od 1 (headindex) a 0. Takže miesto 1 v ringovom bufferi drží miesto (0-255) hada na doske. Poloha 0 drží miesto chvosta. Keď had posunie o jedno miesto vpred, chvostový a čelný index sa zvýšia o jedno, pri dosiahnutí 256 sa zaokrúhlia na 0. Takže teraz je miestom, kde bola hlava, chvost.
Aj pri veľmi dlhom hadi, ktorý sa navíja a spletie, povedzme 200 segmentov. pri každom pohybe sa zmení iba headindex, segment vedľa hlavy a tailindex.
Poznámka kvôli spôsobu SDL práce, musíme nakresliť celý had každý rám. Každý prvok sa nakreslí do vyrovnávacej pamäte snímok a potom sa vyklopí, aby sa zobrazil. To má jednu výhodu, ale v tom, že by sme mohli hada nakresliť hladko a pohybovať sa niekoľkými pixelmi, nie celou pozíciou mriežky.