Programování 2D her ve cvičení C: Snake

Účelem tohoto tutoriálu je naučit 2D programování her a jazyk C pomocí příkladů. Autor programoval hry v polovině 80. let a byl herním návrhářem v MicroProse po dobu 90 let. Ačkoli většina z toho není relevantní pro programování dnešních velkých 3D her, pro malé příležitostné hry bude sloužit jako užitečný úvod.

Provádění hada

Hry, jako je had, kde se objekty pohybují po 2D poli, mohou představovat herní objekty v 2D mřížce nebo jako jednorozměrné pole objektů. "Objekt" zde znamená jakýkoli herní objekt, nikoli objekt používaný v objektově orientovaném programování.

Ovládání hry

Klávesy se pohybují pomocí W = nahoru, A = vlevo, S = dolů, D = vpravo. Stisknutím klávesy Esc ukončete hru, f přepínáte snímkovou frekvenci (není synchronizována s displejem, takže může být rychlá), klávesa Tab přepíná ladicí informace a p pozastavuje. Když je pauza pozastavena, titulek se změní a had bliká,

V hada jsou hlavní herní objekty

  • Had
  • Pasti a ovoce

Pro účely hraní bude řada herců držet každý herní objekt (nebo část pro hada). To může také pomoci při vykreslování objektů do vyrovnávací paměti obrazovky. Grafiku pro hru jsem navrhl následovně:

instagram viewer

  • Horizontální hadí tělo - 0
  • Svislé tělo hada - 1
  • Hlava ve 4 x 90 stupních rotace 2-5
  • Ocas v rotaci 4 x 90 stupňů 6-9
  • Křivky pro změnu směrů. 10-13
  • Apple - 14
  • Jahoda - 15
  • Banán - 16
  • Trap - 17
  • Prohlédněte si grafický soubor hadů snake.gif

Proto má smysl použít tyto hodnoty v typu mřížky definované jako blok [WIDTH * HEIGHT]. Vzhledem k tomu, že v mřížce je pouze 256 míst, rozhodl jsem se ji uložit do jednoho pole dimenzí. Každá souřadnice na mřížce 16 x 16 je celé 0-255. Použili jsme Ints, takže můžete zvětšit mřížku. Všechno je definováno #definováním s šířkou i výškou 16. Vzhledem k tomu, že hadí grafika je 48 x 48 pixelů (GRWIDTH a GRHEIGHT #defines), je okno původně definováno jako 17 x GRWIDTH a 17 x GRHEIGHT, aby bylo o něco větší než mřížka.

To má výhody v rychlosti hry, protože použití dvou indexů je vždy pomalejší než jeden, ale to znamená, že místo přidání nebo odečtení 1 z hadích souřadnic Y se budete pohybovat svisle, odečtete WIDTH. Přidejte 1 pro pohyb doprava. Přestože jsme záludní, definovali jsme také makro l (x, y), které převádí souřadnice xay v době kompilace.

Co je to makro?

 #definovat 1 (X, Y) (Y * WIDTH) + X

První řádek je index 0-15, druhý 16-31 atd. Pokud je had v prvním sloupci a pohybuje se doleva, pak kontrola, zda udeří na zeď, musí před kontrolou doleva zkontrolovat, zda souřadnice% WIDTH == 0 a pro pravou stěnu% WIDTH == WIDTH-1. % Je operátor modulu C (jako aritmetika hodin) a zbytek po rozdělení vrací. 31 div 16 ponechává zbytek 15.

Správa hada

Ve hře jsou použity tři bloky (int pole).

  • snake [], prstencový buffer
  • shape [] - Drží Snake grafické indexy
  • dir [] - Drží směr každého segmentu hada včetně hlavy a ocasu.

Na začátku hry je had dlouhý dva segmenty s hlavou a ocasem. Oba mohou ukazovat ve 4 směrech. Pro sever je hlava 3, ocas 7, pro východní hlava 4, ocas 8, pro jižní hlavu 5 a ocas 9 a pro západ je 6 hlav a 10. Zatímco had je dva segmenty dlouhý, hlava a ocas jsou vždy 180 stupňů od sebe, ale poté, co had roste, mohou být 90 nebo 270 stupňů.

Hra začíná hlavou směřující na sever na místě 120 a ocasem směřující na jih na 136, zhruba uprostřed. Při mírných nákladech na přibližně 1600 bytů úložiště můžeme dosáhnout znatelného zlepšení rychlosti ve hře tím, že přidržíme polohy hada v prstencové vyrovnávací paměti hadů [] uvedené výše.

Co je to Ring Buffer?

Prstencová vyrovnávací paměť je blok paměti používaný k ukládání fronty, která má pevnou velikost a musí být dostatečně velká, aby pojala všechna data. V tomto případě je to jen pro hada. Data jsou tlačena na přední stranu fronty a stažena zezadu. Pokud přední strana fronty zasáhne konec bloku, pak se omotá. Dokud je blok dostatečně velký, nebude přední strana fronty nikdy dohonit záda.

Každé umístění hada (tj. Souřadnice jednoho int) od ocasu k hlavě (tj. Dozadu) je uloženo v prstencovém bufferu. To přináší výhody rychlosti, protože bez ohledu na to, jak dlouho se had dostane, je třeba při pohybu změnit pouze hlavu, ocas a první segment za hlavou (pokud existuje).

Uložení zpět dozadu je také výhodné, protože když had dostane jídlo, bude hada růst, když se bude dál pohybovat. To se provádí přesunutím hlavy o jedno místo do prstencové vyrovnávací paměti a změnou starého umístění hlavy, aby se stal segmentem. Had se skládá z hlavy, 0-n segmentů) a poté z ocasu.

Když had jí jídlo, proměnná atefood je nastavena na 1 a zaškrtnuta ve funkci DoSnakeMove ()

Pohybem hada

Používáme dvě proměnné indexu, headindex a tailindex, abychom ukázali na umístění hlavy a ocasu v kruhovém bufferu. Začínají na 1 (headindex) a 0. Takže umístění 1 v prstencové vyrovnávací paměti drží umístění (0-255) hada na desce. Poloha 0 drží umístění ocasu. Když hada posune o jedno místo dopředu, oba ocasy a headindex se zvýší o jedno, když dosáhnou 256, omotají se kolem 0. Takže teď je místo, kde byla hlava, tam, kde je ocas.

I s velmi dlouhým hadem, který se vine a spleti řekněme 200 segmentů. pouze headindex, segment vedle hlavy a tailindex se mění pokaždé, když se pohybuje.

Poznámka: kvůli způsobu SDL funguje, musíme nakreslit celý had každý snímek. Každý prvek se nakreslí do vyrovnávací paměti snímků a poté se převrátí, aby se zobrazil. To má jednu výhodu, i když v tom, že bychom mohli hadem hladce nakreslit několik pixelů, ne celou polohu mřížky.

instagram story viewer