Svrha ovog vodiča je podučavati programiranje 2D igara i C jezika kroz primjere. Autor je sredinom 1980-ih programirao igre, a bio je dizajner igara u MicroProseu godinu dana u 90-ima. Iako mnogo toga nije bitno za programiranje današnjih velikih 3D igara, za male casual igre to će poslužiti kao koristan uvod.
Provođenje Zmija
Igre poput zmija u kojima se predmeti kreću preko 2D polja mogu predstavljati objekte igre bilo u 2D mreži ili kao jednoznamenkasti niz objekata. "Objekt" ovdje znači bilo koji objekt igre, a ne objekt koji se koristi u objektno orijentiranom programiranju.
Kontrole igre
Tipke se pomiču s W = gore, A = lijevo, S = dolje, D = desno. Pritisnite Esc da biste izašli iz igre, f da biste prebacili brzinu kadrova (to se ne sinkronizira s prikazom pa može biti brzo), tipku s karticom da biste promijenili informacije o uklanjanju pogrešaka i p da biste je zaustavili. Kad je pauzirana, natpis se mijenja i zmija treperi,
U zmiji glavni su predmeti igre
- Zmija
- Zamke i voće
Za potrebe igre, niz int će sadržavati svaki objekt igre (ili dio za zmiju). Ovo također može pomoći pri stavljanju objekata u međuspremnik zaslona. Grafiku za igru sam dizajnirao na sljedeći način:
- Tijelo vodoravne zmije - 0
- Vertikalno zmijsko tijelo - 1
- Glavu napravite u rotacijama od 2 do 5 stupnjeva 90 stupnjeva
- Rep u rotacijama od 4 do 90 stupnjeva 6-9
- Krivulje za smjer se mijenjaju. 10-13
- Jabuka - 14
- Jagoda - 15
- Banana - 16
- Zamka - 17
- Pogledajte grafičku datoteku zmije snake.gif
Dakle, ima smisla koristiti ove vrijednosti u mreži rešetki definiranoj kao blok [WIDTH * HEIGHT]. Budući da u mreži ima samo 256 lokacija, odlučio sam je pohraniti u niz dimenzija. Svaka koordinata na mreži 16 x16 je cijeli broj 0-255. Koristili smo umetke kako biste mogli povećati mrežu. Sve je definirano s #defines sa širinom i visinom i 16. Kako je slika zmije 48 x 48 piksela (GRWIDTH i GRHEIGHT #defines), prozor se u početku definira kao 17 x GRWIDTH i 17 x GRHEIGHT, da bi bio neznatno veći od rešetke.
To ima prednosti u brzini igre jer je korištenje dva indeksa uvijek sporije od jednog, ali znači da umjesto dodavanja ili oduzimanja 1 od zmijinih Y koordinata za pomicanje okomito, oduzimate ŠIRINU. Dodajte 1 za pomicanje udesno. Međutim podmukli smo definirali i makro l (x, y) koji pretvara koordinate x i y u vrijeme sastavljanja.
Što je makro?
#define l (X, Y) (Y * ŠIRINA) + X
Prvi red je indeks 0-15, drugi 16-31 itd. Ako se zmija nalazi u prvom stupcu i kreće se lijevo, tada ček da bi udario u zid, prije pomicanja ulijevo, mora provjeriti je li koordinata% WIDTH == 0, a za desni zid koordinata% WIDTH == WIDTH-1. % Je operator modula C (poput aritmetike sata), a ostatak vraća nakon podjele. 31 div 16 ostavlja ostatak 15.
Upravljanje zmijom
U igri se koriste tri bloka (int nizovi).
- zmija [], prsten s prstenom
- shape [] - drži grafičke indekse Snake
- dir [] - drži smjer svakog segmenta u zmiji, uključujući glavu i rep.
Na početku igre zmija je dva segmenta dugačka s glavom i repom. Oboje mogu usmjeriti u 4 smjera. Za sjever je glava indeks 3, rep 7, za istok glava 4, rep 8, za jug glava 5, a rep 9, a za zapad glava 6, a rep 10, Dok su zmija u dva segmenta, glava i rep su uvijek udaljeni 180 stupnjeva, ali nakon što zmija naraste oni mogu biti 90 ili 270 stupnjeva.
Igra počinje tako da je glava okrenuta prema sjeveru na lokaciji 120 i rep okrenut prema jugu na 136, otprilike središnji. Uz neznatan trošak od oko 1.600 bajta za pohranu, možemo postići vidljivo poboljšanje brzine u igri držanjem mjesta zmija u gore navedenom međuspremniku zmijskog prstena.
Što je prstenasti pufer?
Spremnik prstena je blok memorije koji se koristi za spremanje reda koji je fiksne veličine i mora biti dovoljno velik da može primiti sve podatke. U ovom slučaju, to je samo za zmiju. Podaci se guraju na prednjoj strani reda i uklanjaju se s leđa. Ako prednji dio četa pogodi kraj bloka, onda se zamota. Sve dok je blok dovoljno velik, prednji dio čekanja nikada neće nadoknaditi stražnji dio.
Svako mjesto zmije (tj. Jednostruka int koordinata) od repa do glave (tj. Prema natrag) sprema se u prstenasti međuspremnik. To daje prednosti brzini, bez obzira koliko dugo zmija dobiva, samo se glava, rep i prvi segment nakon glave (ako postoji) moraju mijenjati kako se kreće.
Spremanje unatrag također je korisno jer kad zmija dobije hranu, zmija će rasti kad je sljedeća pomakne. To se postiže premještanjem glave na jedno mjesto u prstenu prstena i promjenom stare lokacije glave u segment. Zmija se sastoji od glave, 0-n segmenata), a zatim i repa.
Kad zmija jede hranu, varijabla atefood postavlja se na 1 i provjerava u funkciji DoSnakeMove ()
Pomicanje zmije
Koristimo dvije indeksne varijable, headindex i tailindex za upućivanje na mjesta glave i repa u međuspremniku prstena. Oni započinju s 1 (headindex) i 0. Dakle, lokacija 1 u međuspremniku prstena drži lokaciju (0-255) zmije na ploči. Lokacija 0 sadrži repu repa. Kad se zmija pomakne za jedno mjesto prema naprijed, i repni zubac i headindex povećavaju se po jedan, obavijajući krug do 0 kada dosegnu 256. Dakle, mjesto koje je bilo glava je mjesto gdje se nalazi rep.
Čak i sa vrlo dugom zmijom koja se navija i zamotava u recimo 200 segmenata. samo se headindex, segment uz glavu i tailindex, mijenjaju svaki put kad se kreće.
Napomena zbog načina SDL djela, moramo nacrtati cijelu zmiju svaki okvir. Svaki se element uvuče u međuspremnik okvira, a zatim okrene, tako da bude prikazan. To ima jednu prednost iako u tome možemo zmiju lagano pomicati nekoliko piksela, a ne cijeli položaj rešetke.