2Д програмирање игара у Ц Туториал: Снаке

Сврха овог водича је да кроз примере подучава 2Д програмирање игара и Ц језик. Аутор је средином 1980-их програмирао игре и био је дизајнер игара у МицроПросеу годину дана у 90-има. Иако много тога није битно за програмирање данашњих великих 3Д игара, за мале повремене игре то ће послужити као користан увод.

Имплементација змија

Игре попут змија у којима се предмети крећу преко 2Д поља могу представљати објекте игре било у 2Д мрежи или као једно-димензионални низ објеката. "Објект" овде значи било који објекат игре, а не објект који се користи у објектно оријентисаном програмирању.

Гаме Цонтролс

Тастери се померају са В = горе, А = лево, С = доле, Д = десно. Притисните Есц да бисте изашли из игре, ф да бисте пребацили брзину кадрова (ово се не синхронизује на екран па може бити брзо), тастер за табулатор да бисте пребацили информације о исправци и п да бисте га паузирали. Када је паузирана, натпис се мења и змија трепери,

У змији су главни играни предмети

  • Змија
  • Замке и воће

За потребе играња, низ инт ће садржавати сваки објекат игре (или део за змију). Ово такође може бити од помоћи при приказивању објеката у међуспремник екрана. Графику за игру сам дизајнирао на следећи начин:

instagram viewer

  • Тело хоризонталне змије - 0
  • Вертикално тело змија - 1
  • Главу направите у ротацијама од 2-5 степени за 90 степени
  • Реп у ротацијама од 4 до 90 степени, 6-9
  • Кривуље за промену смерова. 10-13
  • Аппле - 14
  • Јагода - 15
  • Банана - 16
  • Замка - 17
  • Погледајте графичку датотеку змије снаке.гиф

Дакле, има смисла користити ове вредности у мрежи која је дефинисана као блок [ВИДТХ * ХЕИГХТ]. Пошто је само 256 локација у мрежи решио сам да је похраним у низ димензија. Свака координата на мрежи 16 к16 је цијели број 0-255. Користили смо уметке да бисте могли да повећате мрежу. Све је дефинисано #дефинес са ШИРИНОМ и ВИСИНОМ, оба 16. Пошто је графика змије 48 к 48 пиксела (ГРВИДТХ и ГРХЕИГХТ #дефинес), прозор се у почетку дефинише као 17 к ГРВИДТХ и 17 к ГРХЕИГХТ и тек је нешто већи од решетке.

Ово има предности у брзини игре јер је коришћење два индекса увек спорије од једног, али значи да уместо додавања или одузимања 1 од змијиних И координата за вертикално померање, одузимате ШИРИНУ. Додајте 1 да бисте се померили удесно. Међутим подмукли смо дефинисали и макро л (к, и) који претвара координате к и и током компајлирања.

Шта је макро?

 #дефине л (Кс, И) (И * ШИРИНА) + Кс

Први ред је индекс 0-15, други 16-31 итд. Ако се змија налази у првом ступцу и креће се лево, тада чек да би ударио у зид, пре померања улево, мора проверити да ли је координата% ВИДТХ == 0, а десни зид координата% ВИДТХ == ВИДТХ-1. % Је оператор модула Ц (попут аритметике сата) и враћа остатак након поделе. 31 див 16 оставља остатак од 15.

Управљање змијом

У игри се користе три блока (инт низови).

  • змија [], пуфер за прстенове
  • форм [] - држи графичке индексе Снаке
  • дир [] - Држи правац сваког сегмента у змији, укључујући главу и реп.

На почетку игре змија је дугачка два сегмента са главом и репом. Обоје могу да показују у 4 смера. За север је глава индекс 3, реп 7, за исток глава 4, реп 8, за југ глава 5, а реп 9, а за запад глава 6, а реп 10. Док су змија у два сегмента, глава и реп су увек удаљени 180 степени, али након што змија нарасте, они могу бити 90 или 270 степени.

Игра почиње тако да је глава окренута према северу на локацији 120 и реп окренут према југу на 136, отприлике централно. Уз незнатан трошак од око 1.600 бајта, можемо постићи видљиво побољшање брзине у игри држећи локације змије у горе наведеном међуспремнику змијског прстена.

Шта је прстенасти прстен?

Механизам звона је блок меморије који се користи за чување реда који је фиксне величине и мора бити довољно велик да може да држи све податке. У овом случају, то је само за змију. Подаци се гурају на предњој страни реда и уклањају се са задње стране. Ако предњи део реда на крају блока, онда се он омота. Све док је блок довољно велик, предњи ред чекања никада неће надокнадити леђа.

Свака локација змије (тј. Једнострука инт координата) од репа до главе (тј. Уназад) се чува у прстенастом међуспремнику. Ово даје предност брзини, без обзира колико дуго змија добија, само се глава, реп и први сегмент након главе (ако постоји) морају мењати док се креће.

Чување уназад такође је корисно јер кад змија добије храну, змија ће расти када је крене следећа. Ово се постиже премештањем главе на једно место у прстену прстена и променом старе локације главе у сегмент. Змија се састоји од главе, 0-н сегмената), а затим и репа.

Када змија једе храну, променљива је храна 1 и проверава се у функцији ДоСнакеМове ()

Помицање змије

Користимо две индексне променљиве, хеадиндек и таилиндек да укажемо на локације главе и репа у прстену прстена. Они почињу од 1 (хеадиндек) и 0. Дакле, локација 1 у прстену за прстење држи локацију (0-255) змије на плочи. Локација 0 држи место репа. Када се змија помакне за једну локацију према напријед, и репни зубац и хеадиндек се повећавају за једну, обавијајући се на 0 када досегну 256. Дакле, место где је била глава је место где се налази реп.

Чак и са веома дугом змијом која се вијуга и савија у рецимо 200 сегмената. само се хеадиндек, сегмент уз главу и таилиндек мења сваки пут када се помера.

Напомена због начина СДЛ ради, морамо нацртати целу змију сваки оквир. Сваки елемент се увлачи у међуспремник оквира, затим се окреће, тако да је приказан. То има једну предност, иако у томе можемо змију лагано померати неколико пиксела, а не цео положај решетке.