Šio vadovo tikslas yra išmokyti 2D žaidimų programavimą ir C kalbą per pavyzdžius. Autorius programavo žaidimus devintojo dešimtmečio viduryje ir 90-ųjų metų metus buvo žaidimų dizaineris „MicroProse“. Nors didžioji to dalis nėra aktuali šių dienų didžiųjų 3D žaidimų programavimui, mažiems kasdieniams žaidimams tai bus naudinga įžanga.
Įgyvendinanti gyvatę
Tokie žaidimai kaip gyvatė, kai objektai juda per 2D lauką, gali vaizduoti žaidimo objektus arba 2D tinklelyje, arba kaip vieno matmens objektų masyvą. „Objektas“ čia reiškia bet kokį žaidimo objektą, o ne objektą, naudojamą į objektą orientuoto programavimo metu.
Žaidimų valdikliai
Mygtukai juda W = aukštyn, A = kairėn, S = žemyn, D = dešinėn. Paspauskite Esc, kad baigtumėte žaidimą, f, kad perjungtumėte kadrų dažnį (tai nėra sinchronizuojama su ekranu, todėl tai gali būti greita), tabuliavimo klavišu, kad perjungtumėte derinimo informaciją, o p - norėdami pristabdyti. Kai pristabdoma, antraštė pasikeičia ir gyvatė mirksi,
Pagrindiniai žaidimo objektai yra gyvatėje
- Gyvatė
- Spąstai ir vaisiai
Žaidimo tikslais įnašų rinkinys talpins kiekvieną žaidimo objektą (arba jo dalį gyvatės). Tai taip pat gali padėti pateikiant objektus į ekrano buferį. Aš sukūriau žaidimo grafiką taip:
- Horizontalus gyvatės kūnas - 0
- Vertikalus gyvatės kūnas - 1
- Pasukite 4 x 90 laipsnių pasukimais 2–5
- Uodega 4 x 90 laipsnių pasukimais 6–9
- Krypties kreivės keičiasi. 10-13
- „Apple“ - 14
- Braškė - 15
- Bananas - 16
- Spąstai - 17
- Peržiūrėkite gyvatės grafikos failą snake.gif
Taigi prasminga naudoti šias reikšmes tinklelio tipo, kuris apibūdinamas kaip blokas [PLATUMAS * AUKŠTIS]. Kadangi tinklelyje yra tik 256 vietos, aš pasirinkau jį laikyti vieno matmens masyve. Kiekviena 16 x 16 lentelės koordinatė yra sveikasis skaičius 0–255. Mes naudojome intarpus, kad galėtumėte padidinti tinklelį. Viską nusako #definai, kurių plotis ir aukštis yra abu 16. Kadangi gyvatės grafika yra 48 x 48 taškų (GRWIDTH ir GRHEIGHT # apibrėžia), langas iš pradžių apibrėžiamas kaip 17 x GRWIDTH ir 17 x GRHEIGHT, kad būtų tik šiek tiek didesnis nei tinklelis.
Tai turi naudos iš žaidimo greičio, nes dviejų rodyklių naudojimas visada yra lėtesnis už vieną, tačiau tai reiškia, kad vietoj to, kad pridėtumėte ar atimtumėte 1 iš gyvatės Y koordinatės, kad judėtumėte vertikaliai, atimkite plotį. Pridėkite 1, jei norite judėti dešinėn. Nepaisant to, kad esame slapti, mes taip pat apibrėžėme makrokomandas l (x, y), kurios konvertavimo metu konvertuoja x ir y koordinates.
Kas yra makrokomanda?
#define l (X, Y) (Y * PLOTIS) + X
Pirmoji eilutė yra rodyklė 0-15, antroji 16-31 ir tt Jei gyvatė yra pirmame stulpelyje ir juda į kairę, tada, prieš eidami į kairę, patikrinkite, ar pataikėte į sieną, patikrinkite, ar koordinatė% WIDTH == 0 ir ar dešinės sienos koordinatė yra% WIDTH == WIDTH-1. % Yra C modulio operatorius (kaip laikrodžio aritmetinė) ir grąžina likusią dalį po padalijimo. 31 div 16 palieka likusią 15 dalį.
Tvarkyti gyvatę
Žaidime naudojami trys blokai (vidiniai masyvai).
- gyvatė [], žiedinis buferis
- shape [] - Turi gyvatės grafinius indeksus
- dir [] - išlaiko kiekvieno gyvatės segmento kryptį, įskaitant galvą ir uodegą.
Žaidimo pradžioje gyvatė yra dviejų segmentų ilgio su galva ir uodega. Abu gali nukreipti 4 kryptimis. Į šiaurę galva yra 3 rodyklė, uodega 7, rytinė galva 4, uodega 8, pietinė galva 5 ir uodega 9, o vakaruose galva 6 ir uodega 10. Nors gyvatė yra dviejų segmentų ilgio, galva ir uodega visada yra viena nuo kitos 180 laipsnių kampu, tačiau užaugant gyvatei jos gali būti 90 arba 270 laipsnių.
Žaidimas prasideda galva nukreipta į šiaurę 120 vietoje, o uodega nukreipta į pietus 136 vietoje, maždaug centrine dalimi. Turėdami gyvatės vietas aukščiau minėtame gyvatės [] žiede, turėdami gyvatės vietas, už nedidelę kainą - maždaug 1 600 baitų - galime pastebimai padidinti žaidimo greitį.
Kas yra žiedinis buferis?
Skambučio buferis yra atminties blokas, naudojamas fiksuoto dydžio eilėje laikyti ir turi būti pakankamai didelis, kad būtų galima laikyti visus duomenis. Šiuo atveju tai tik gyvatė. Duomenys stumiami eilės priekyje ir nuimami užpakalinėje dalyje. Jei eilės priekis atsiduria bloko gale, tada jis apvyniojamas. Kol blokas yra pakankamai didelis, eilės priekis niekada neužsuks užpakalinės dalies.
Kiekviena gyvatės vieta (t. Y. Viena vidinė koordinatė) nuo uodegos iki galvos (t. Y. Atgal) yra kaupiama žiediniame buferyje. Tai suteikia greičio pranašumų, nes nesvarbu, per kiek laiko gyvatė gauna, reikia pakeisti tik galvą, uodegą ir pirmąjį segmentą po galva (jei jis yra), kai judama.
Laikyti ją atgal taip pat naudinga, nes, gyvatei gavus maistą, gyvatė išaugs, kai kitą kartą judės. Tai atliekama perkeliant galvą viena vieta žiediniame buferyje ir keičiant seną galvos vietą, kad ji taptų segmentu. Gyvatė sudaryta iš galvos, 0-n segmentų), o paskui uodegos.
Kai gyvatė valgo maistą, atefood kintamasis nustatomas į 1 ir patikrinamas atliekant funkciją DoSnakeMove ()
Gyvatės judėjimas
Mes naudojame du rodyklės kintamuosius, headindex ir tailindex, norėdami nurodyti galvos ir uodegos vietas žiediniame buferyje. Jie prasideda nuo 1 (headindex) ir 0. Taigi 1 vieta žiediniame buferyje užima gyvatės vietą (0–255) ant lentos. 0 vieta užima uodegos vietą. Kai gyvatė juda viena vieta į priekį, tailindex ir headindex padidėja viena, apvyniojant 0, kai jos pasiekia 256. Taigi dabar galva, kur buvo galva, yra ta, kur yra uodega.
Net ir turint labai ilgą gyvatę, kuri vingiuoja ir sukasi tarkim 200 segmentų. kaskart judant keičiasi tik „headindex“, segmentas šalia galvos ir „tailindex“.
Pastaba dėl būdo SDL veikia, mes turime nupiešti visą gyvatę kiekviename kadre. Kiekvienas elementas yra įtraukiamas į rėmelio buferį, tada apverstas, kad jis būtų rodomas. Tačiau tai turi vieną pranašumą tuo, kad mes galime atkreipti gyvatės sklandų judėjimą keliais taškais, o ne visą tinklelio padėtį.