Tämän oppaan tarkoituksena on opettaa 2D-pelien ohjelmointia ja C-kieltä esimerkkien avulla. Kirjoittaja on ohjelmoinut pelejä 1980-luvun puolivälissä ja ollut pelisuunnittelija MicroProse-ohjelmassa vuoden 1990-luvulla. Vaikka suuri osa tästä ei ole merkitystä nykypäivän suurten 3D-pelien ohjelmoinnissa, pienille rentopeleille se toimii hyödyllisenä johdannona.
Toteuttava käärme
Pelit, kuten käärme, jossa esineet liikkuvat 2D-kentän yli, voivat edustaa peliobjekteja joko 2D-ruudukossa tai yhden ulottuvuuden kohteina. "Objekti" tarkoittaa tässä mitä tahansa peliobjektia, ei kohdetta, jota käytetään olio-ohjelmoinnissa.
Pelin hallintalaitteet
Näppäimiä liikutetaan W = ylös, A = vasemmalle, S = alas, D = oikealle. Paina Esc lopettaaksesi pelin, f vaihtaaksesi ruudunopeutta (tätä ei synkronoida näyttöön, joten se voi olla nopea), sarkainnäppäintä vaihtaaksesi virheenkorjaustiedot ja p keskeyttääksesi sen. Kun se on keskeytetty, kuvateksti muuttuu ja käärme vilkkuu,
Käärmeessä pääpeliobjektit ovat
- Käärme
- Ansoja ja hedelmiä
Pelin pelaamista varten joukko inttejä pitää jokaisen peliobjektin (tai käärmeen osan). Tämä voi myös auttaa, kun objektit renderoidaan näyttöpuskuriin. Olen suunnitellut pelin grafiikat seuraavasti:
- Vaakasuora käärme runko - 0
- Pysty käärmeen runko - 1
- Pään suuntaa 4 x 90 asteen kiertoissa 2-5
- Häntä 4 x 90 asteen kiertoissa 6-9
- Suuntakäyrät muuttuvat. 10-13
- Apple - 14
- Mansikka - 15
- Banaani - 16
- Ansa - 17
- Tarkastele käärmegrafiikatiedostoa snake.gif
Joten on järkevää käyttää näitä arvoja ruudukotyypissä, joka määritetään lohkona [WIDTH * HEIGHT]. Koska ruudukossa on vain 256 sijaintia, olen valinnut tallentaa sen yhden ulottuvuuden taulukkoon. Jokainen koordinaatti 16 x16-ruudussa on kokonaisluku 0–255. Olemme käyttäneet sisääntuloja, jotta voit tehdä ruudukon isommaksi. Kaikkien määrittelee #defines sekä leveys että korkeus molemmat 16. Koska käärmegrafiikka on 48 x 48 pikseliä (GRWIDTH ja GRHEIGHT #määrittelee), ikkunaksi määritellään alun perin 17 x GRWIDTH ja 17 x GRHEIGHT, joka on vain hiukan suurempi kuin ruudukko.
Tällä on hyötyä pelin nopeudessa, koska kahden indeksin käyttö on aina hitaampaa kuin yksi, mutta se tarkoittaa, että sen sijaan, että lisääisit tai vähenisit käärmeen Y-koordinaateista liikkuaksesi pystysuunnassa, vähensi leveys. Lisää 1 siirtyäksesi oikealle. Koska olemme olleet hieno, määrittelimme myös makro l (x, y), joka muuntaa x- ja y-koordinaatit käännöshetkellä.
Mikä on makro?
#define l (X, Y) (Y * WIDTH) + X
Ensimmäinen rivi on hakemisto 0-15, toinen 16-31 jne. Jos käärme on ensimmäisessä sarakkeessa ja liikkuu vasemmalle, on seinään kohdistuvan tarkistuksen, ennen kuin siirrytään vasemmalle, on tarkistettava, onko koordinaatti% WIDTH == 0 ja oikean seinämän koordinaattina% WIDTH == WIDTH-1. % On C-moduulin operaattori (kuten kelloaritmeettinen) ja palauttaa loput jakamisen jälkeen. 31 div 16 jättää loput 15: stä.
Käärmeen hallinta
Pelissä on kolme lohkoa (int-ryhmät).
- käärme [], rengaspuskuri
- muoto [] - Pitää käärme graafisia hakemistoja
- dir [] - Pitää käärmeen kaikkien segmenttien suuntaa, mukaan lukien pää ja häntä.
Pelin alussa käärme on kaksi segmenttiä pitkä, pää ja häntä. Molemmat voivat osoittaa 4 suuntaan. Pohjoisessa pää on indeksi 3, häntä on 7, itäpään on 4, häntä on 8, eteläpään on 5 ja hännän on 9 ja lännen pään on 6 ja hännän on 10. Vaikka käärme on kaksi segmenttiä pitkä, pää ja häntä ovat aina 180 asteen päässä toisistaan, mutta käärmeen kasvamisen jälkeen ne voivat olla 90 tai 270 astetta.
Peli alkaa siitä, että pää on suunnattu pohjoiseen sijaintiin 120 ja häntä etelään suuntaan 136, suunnilleen keskeltä. Pienillä kustannuksilla, noin 1600 tavua tallennusta, voimme saavuttaa huomattavan nopeuden parannuksen pelissä pitämällä käärmeen sijainteja käärme [] -puskuripuskurissa.
Mikä on rengaspuskuri?
Soittopuskuri on muistilohko, jota käytetään jonon tallentamiseen, joka on kiinteä koko ja sen on oltava riittävän suuri kaiken datan pitämiseksi. Tässä tapauksessa se on tarkoitettu vain käärmeelle. Tiedot työnnetään jonon etuosaan ja poistetaan takaa. Jos jonon etuosa osuu lohkon päähän, se kiertyy. Niin kauan kuin lohko on tarpeeksi suuri, jonon etuosa ei koskaan tartu takaosaan.
Jokainen käärmeen sijainti (ts. Yksi sisäinen koordinaatti) hännästä päähän (ts. Taaksepäin) tallennetaan rengaspuskuriin. Tämä antaa nopeushyötyjä, koska riippumatta siitä kuinka kauan käärme saa, vain pää, häntä ja ensimmäinen segmentti pään jälkeen (jos sellainen on) on muutettava liikkuessaan.
Sen säilyttäminen taaksepäin on myös hyödyllistä, koska kun käärme saa ruokaa, käärme kasvaa seuraavan siirron aikana. Tämä tapahtuu siirtämällä päätä yksi paikka rengaspuskurissa ja muuttamalla vanha pään sijainti segmentiksi. Käärme koostuu päästä, 0-n segmentistä) ja sitten häntä.
Kun käärme syö ruokaa, atefood-muuttuja asetetaan arvoon 1 ja tarkistetaan toiminnossa DoSnakeMove ()
Käärmeen liikuttaminen
Käytämme kahta indeksimuuttujaa, headindex ja tailindex osoittaaksesi pään ja hännän paikkoihin rengaspuskurissa. Ne alkavat kohdasta 1 (headindex) ja 0. Joten sijainti 1 rengaspuskurissa pitää käärmeen sijainnin (0-255) pöydällä. Paikka 0 pitää hännän sijaintia. Kun käärme siirtyy yhden sijainnin eteenpäin, sekä tailindexiä että headindexiä lisätään yhdellä, käärettämällä ympäri 0, kun ne saavuttavat 256. Joten nyt sijainti, joka oli pää, on häntä.
Jopa hyvin pitkällä käärmeellä, joka käämyy ja kääntyy sanoen 200 segmenttiin. vain headindex, pään vieressä oleva segmentti ja tailindex muuttuvat joka kerta, kun se liikkuu.
Huomaa tien takia SDL toimii, meidän täytyy piirtää koko käärme jokaiseen kehykseen. Jokainen elementti vedetään kehyspuskuriin ja käännetään sitten se näkyviin. Tällä on kuitenkin yksi etu, koska voimme vetää käärmeen tasaisesti liikuttamalla muutamaa pikseliä, ei koko ruudukon sijaintia.