Kahemõõtmeliste mängude programmeerimine C juhendis: madu

Selle õpetuse eesmärk on õpetada näidete kaudu 2D-mängude programmeerimist ja C-keelt. Autor programmeeris mänge 1980. aastate keskel ja oli 90ndatel aasta MicroProse'is mängude kujundaja. Ehkki suur osa sellest pole tänapäeva suurte 3D-mängude programmeerimisel asjakohane, on see väikeste vabaajamängude jaoks kasulik sissejuhatus.

Mao rakendamine

Mängud nagu madu, kus objektid liiguvad üle kahemõõtmelise välja, võivad mänguobjekte kujutada kas 2D ruudustikus või objektide ühemõõtmelisena massiivina. "Objekt" tähendab siin mis tahes mänguobjekti, mitte objekti, mida kasutatakse objektorienteeritud programmeerimisel.

Mängu juhtelemendid

Klahve liigutatakse W = üles, A = vasakule, S = alla, D = paremale. Mängust väljumiseks vajutage Esc, kaadrisageduse sisselülitamiseks f (see pole ekraaniga sünkroonitud, nii et see võib olla kiire), silumisteabe vahetamiseks vahekaardi klahv ja p selle peatamiseks. Kui see on peatatud, muutub pealdis ja madu vilgub,

Madus on peamised mänguobjektid

  • Madu
  • Püünised ja puuviljad
instagram viewer

Mängimise eesmärgil hoiab iga mänguobjekt (või selle osa madu) massi sees inti. See võib aidata ka objektide ekraanipuhvrisse renderdamisel. Olen mängu graafika kujundanud järgmiselt:

  • Horisontaalne madu kere - 0
  • Mao vertikaalne keha - 1
  • Pea 4 x 90-kraadise pöördega 2–5
  • Saba 4 x 90-kraadise pöördega 6-9
  • Juhiste kõverad muutuvad. 10-13
  • Õun - 14
  • Maasikas - 15
  • Banaan - 16
  • Lõks - 17
  • Vaadake madu graafikafaili snake.gif

Seega on mõistlik kasutada neid väärtusi ruudustikus, mis on määratletud kui plokk [WIDTH * HEIGHT]. Kuna ruudustikus on ainult 256 asukohta, otsustasin selle salvestada ühemõõtmelisse massiivi. Iga koordinaat 16 x 16 ruudustikul on täisarv 0–255. Oleme kasutanud intsi, et saaksite ruudustiku suuremaks muuta. Kõike määratleb #defines, mille laius ja kõrgus on mõlemad 16. Kuna mao graafika on 48 x 48 pikslit (GRWIDTH ja GRHEIGHT # määratleb), määratletakse aken algselt kui 17 x GRWIDTH ja 17 x GRHEIGHT, et see oleks ruudustikust pisut suurem.

Sellel on mängu kiiruses eeliseid, kuna kahe indeksi kasutamine on alati aeglasem kui üks, kuid see tähendab, et madu Y-koordinaatide vertikaalseks liikumiseks liitmise või lahutamise asemel lahutate WIDTH. Paremale liikumiseks lisage 1. Olles alatu, määratlesime ka makro l (x, y), mis teisendab x ja y koordinaadid kompileerimise ajal.

Mis on makro?

 #define l (X, Y) (Y * WIDTH) + X

Esimene rida on indeks 0-15, teine ​​16-31 jne. Kui madu asub esimeses veerus ja liigub vasakule, siis enne vasakule liikumist tuleb seina löömiseks kontrollida, kas koordinaat% WIDTH == 0 ja parema seina koordinaat% WIDTH == WIDTH-1. % On C-mooduli operaator (nagu kella aritmeetika) ja tagastab ülejäänud osa pärast jagamist. 31 div 16 jätab ülejäänud 15.

Madu haldamine

Mängus on kasutatud kolme blokki (int massiive).

  • madu [], rõngapuhver
  • kuju [] - hoiab Snake'i graafilisi indekseid
  • dir [] - hoiab mao iga segmendi suunda, sealhulgas pea ja saba.

Mängu alguses on madu pea ja sabaga kahe segmendi pikkune. Mõlemad võivad osutada 4 suunas. Põhja pool on pea indeks 3, saba on 7, idapea on 4, saba on 8, lõunapea on 5 ja saba on 9 ja lääne pool on pea 6 ja saba on 10. Kui madu on kahe segmendi pikkune, on pea ja saba alati 180 kraadi kaugusel, kuid pärast madu kasvu võivad need olla 90 või 270 kraadi.

Mäng algab peaga suunaga põhja suunas 120 ja saba suunaga lõuna poole 136, umbes keskpunkti. Väikese maksumusega - umbes 1600 baiti salvestusmahtu - saame mängu märgatava kiiruse paranemise, hoides madu asukohti ülalnimetatud madu [] rõngaspuhvris.

Mis on rõngaspuhver?

Helina puhver on kindla suurusega järjekorra salvestamiseks kasutatav mäluplokk, mis peab olema kõigi andmete hoidmiseks piisavalt suur. Sel juhul on see ainult madu jaoks. Andmed lükatakse järjekorra esiküljele ja võetakse tagant ära. Kui järjekorra esikülg jõuab ploki lõpuni, mähitakse see ümber. Kuni plokk on piisavalt suur, ei jõua järjekorra esiosa kunagi tagant järele.

Madu iga asukoht (s.o üksik sisemine koordinaat) sabast kuni peadeni (s.o tahapoole) on salvestatud rõngapuhvrisse. See annab kiirusele eeliseid, sest ükskõik kui kaua madu saab, tuleb liikumisel muuta ainult pead, saba ja esimest lõiku pärast pead (kui see on olemas).

Selle tagumine ladustamine on samuti kasulik, sest kui madu saab toitu, kasvab madu järgmisel liikumisel. Selleks liigutatakse pea ühte asukohta rõngapuhvris ja muudetakse vana pea asukohta segmendiks. Madu koosneb peast, 0-n segmendist) ja seejärel sabast.

Kui madu sööb toitu, seatakse atefood muutuja väärtusele 1 ja seda kontrollitakse funktsioonis DoSnakeMove ()

Madu liigutamine

Me kasutame kahte indeksimuutujat, headindex ja tailindex, et osutada pea ja saba asukohtadele ringipuhvris. Need algavad 1 (headindex) ja 0. Nii et asukoht 1 rõngapuhvris hoiab madu asukohta (0-255) laual. Asukoht 0 hoiab saba asukohta. Kui madu liigub ühte kohta ette, suurendatakse nii tailindeksi kui ka peaindeksi võrra ühte, mässides ringi 0-ni, kui nad jõuavad 256-ni. Nii et nüüd see koht, kus oli pea, on seal, kus on saba.

Isegi väga pika maduga, mis kerib ja on keerdunud umbes 200 segmenti. iga liikumise korral muutuvad ainult headindex, pea kõrval asuv segment ja tailindex.

Pange tähele, et viis SDL töötab, peame kogu kaare joonistama kogu madu. Iga element tõmmatakse raamipuhvrisse ja seejärel pööratakse, nii et see kuvatakse. Sellel on siiski üks eelis, kuna me suudame tõmmata mao sujuvalt liigutades paar pikslit, mitte kogu ruudustikku.

instagram story viewer