2D програмиране на игри в учебник C: Змия

Целта на този урок е да научи 2D програмиране на игри и C-език чрез примери. Авторът използва за програмиране на игри в средата на 80-те и беше дизайнер на игри в MicroProse една година през 90-те. Въпреки че голяма част от това не е от значение за програмирането на днешните големи 3D игри, за малките ежедневни игри това ще послужи като полезно въведение.

Изпълнение на Змия

Игри като змия, при които обектите се движат над 2D поле, могат да представят обектите на играта или в 2D мрежа, или като едноизмерен масив от обекти. "Обект" тук означава всеки игрален обект, а не обект, използван в обектно-ориентираното програмиране.

Контрол на играта

Клавишите се движат с W = нагоре, A = наляво, S = надолу, D = вдясно. Натиснете Esc, за да излезете от играта, f, за да превключите честотата на кадрите (това не се синхронизира с дисплея, така че може да бъде бързо), клавиш tab, за да превключите на информацията за отстраняване на грешки и p, за да я поставите на пауза. Когато е поставена на пауза, надписът се променя и змията проблясва,

instagram viewer

В змията основните обекти на играта са

  • Змията
  • Капани и плодове

За целите на геймплея, масив от ints ще съдържа всеки обект на игра (или част за змията). Това също може да помогне, когато визуализирате обектите в буфера на екрана. Оформих графиката за играта, както следва:

  • Тяло на хоризонтална змия - 0
  • Вертикално змийско тяло - 1
  • Глава в 4 x 90-градусови ротации 2-5
  • Опашка в 4 x 90-градусови завъртания 6-9
  • Кривите за промяна на посоките. 10-13
  • Apple - 14
  • Ягода - 15
  • Банан - 16
  • Капан - 17
  • Вижте графичния файл на змията snake.gif

И така, има смисъл да използвате тези стойности във вид на решетка, дефиниран като блок [WIDTH * HEIGHT]. Тъй като има само 256 места в мрежата, аз избрах да го съхранявам в масив с една величина. Всяка координата на решетката 16 x16 е цяло число 0-255. Използвахме инчове, за да можете да увеличите решетката. Всичко се дефинира от #defines с WIDTH и HEIGHT и 16. Тъй като графиката на змията е 48 x 48 пиксела (GRWIDTH и GRHEIGHT #defines), първоначално прозорецът се дефинира като 17 x GRWIDTH и 17 x GRHEIGHT, за да бъде само малко по-голям от мрежата.

Това има предимства в скоростта на играта, тъй като използването на два индекса винаги е по-бавно от един, но това означава, че вместо да добавяте или изваждате 1 от Y координатите на змията, за да се движите вертикално, изваждате WIDTH. Добавете 1, за да се движите надясно. Въпреки че сме подъл, ние също така дефинирахме макрос l (x, y), който преобразува координатите x и y по време на компилиране.

Какво е макрос?

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

Първият ред е индекс 0-15, вторият 16-31 и т.н. Ако змията е в първата колона и се движи наляво, тогава проверката, за да се удари в стената, преди да се придвижи наляво, трябва да провери дали координата% WIDTH == 0 и за координата на дясната стена% WIDTH == WIDTH-1. % Е операторът на C модул (като аритметика на часовника) и връща остатъка след разделянето. 31 div 16 оставя остатък от 15.

Управление на Змията

В играта се използват три блока (int масиви).

  • змия [], буфер за пръстен
  • shape [] - държи графичните индекси на Snake
  • dir [] - Задържа посоката на всеки сегмент в змията, включително главата и опашката.

В началото на играта змията е с два сегмента с глава и опашка. И двете могат да сочат в 4 посоки. За север главата е индекс 3, опашката е 7, за източната глава е 4, опашката е 8, за южната глава е 5, а опашката е 9, а за запад главата е 6, а опашката е 10, Докато змията е два сегмента, главата и опашката винаги са на разстояние 180 градуса, но след като змията расте, те могат да бъдат 90 или 270 градуса.

Играта започва с главата, обърната на север, на място 120, а опашката - на юг на 136, приблизително централна. С малка цена от около 1600 байта за съхранение, можем да постигнем забележимо подобрение на скоростта в играта, като държим местоположенията на змията в буфера на змийския пръстен, споменат по-горе.

Какво е буфер за пръстени?

Буферът за звънене е блок памет, използван за съхраняване на опашка, която е с фиксиран размер и трябва да бъде достатъчно голяма, за да побере всички данни. В този случай това е само за змията. Данните се бутат от предната страна на опашката и се свалят отзад. Ако предната част на опашката удари края на блока, тогава тя се увива. Докато блокът е достатъчно голям, предната част на опашката никога няма да навакса задната част.

Всяко местоположение на змията (т.е. единичната инт координата) от опашката до главата (т.е. обратно) се съхранява в буфера на пръстена. Това дава предимства за скоростта, тъй като независимо колко дълго стига змията, само главата, опашката и първият сегмент след главата (ако съществува) трябва да се променят, докато се движи.

Съхраняването му назад също е от полза, защото когато змията получи храна, змията ще нарасне при следващата си преместване. Това става, като се премести главата на едно място в буфера на пръстена и се промени старото местоположение на главата, за да се превърне в сегмент. Змията е съставена от глава, 0-n сегменти), а след това и опашка.

Когато змията яде храна, променливата от ядене се задава на 1 и се проверява във функцията DoSnakeMove ()

Преместване на змията

Използваме две индексни променливи, headindex и tailindex, за да насочваме към местата на главата и опашката в буфера на пръстена. Те започват от 1 (headindex) и 0. Така местоположението 1 в буфера на пръстена държи местоположението (0-255) на змията на дъската. Местоположение 0 съдържа местоположението на опашката. Когато змията се придвижва с едно място напред, и tailindex, и headindex се увеличават с едно, обгръщайки се до 0, когато достигнат 256. Така че сега мястото, което беше главата, е мястото, където е опашката.

Дори и с много дълга змия, която се навива и свива в да кажем 200 сегмента. само headindex, сегментът до главата и tailindex се променят всеки път, когато се движи.

Забележете, заради начина SDL работи, трябва да нарисуваме цялата змия на всеки кадър. Всеки елемент се изтегля в буфера на рамката, след което се обръща, така че да се показва. Това има едно предимство, макар че можем да нарисуваме змията плавно, движейки се няколко пиксела, а не цяла позиция на мрежата.

instagram story viewer