Побитов начин за показване на карти с елементи
Техника за автоматично избиране на желаната плочка от карта с плочки.
Предизвикателство: Създадохме красиво платформено ниво и искаме да можем автоматично да поставяме плочки върху него, като вземаме предвид съседите, така че да изглеждат правилно.
Плочки, които вземат предвид своите съседи
Плочките в Super Mario не броят своите съседи: каменният блок винаги изглежда по един и същи начин, или като отделна част, или като част от стена.
Това е добре за много игри, но когато създавате по-хармоничен дизайн, може да изглежда неестествено. Плочките, които считат своите съседи, решават този проблем, като съпоставят външния си вид със съседните плочки.
Еднобитова карта
Нека си представим, че с някои хитри техники създадохме схема на ниво на платформинг, състояща се само от каменни блокове и "въздух" между тях. Нивото може да се разглежда като еднобитово изображение, в което състоянието на всеки пиксел се определя от един бит (1 - каменен блок, 0 - "въздух"). Ето уголемен пример на част от такова ниво с добавени линии на мрежата:
Комплект плочки (плочки)
Tileset е набор от графики, които могат да се използват за попълване на карта. Наборът от плочки Mario е доста ограничен, състоящ се от няколко вида блокове и „декорации“, но нашият комплект ще съдържа много изображения за всеки тип плочки:
Оценяване на съседи
За да определим коя плочка трябва да бъде в определена точка на картата, трябва да изследваме непосредствените съседи на тази точка (засега игнорираме диагоналните съседи). За да избегнем писането на големи if/else-if конструкции за обработка на всички възможни комбинации от съседи, ние използваме система, която присвоява стойности във всяка посока.
Значение завсяка точка се намира чрез изследване на нейните съседи и добавяне на стойностите за тези, които съдържат камък. Например, ако горният съсед на изследваната точка също е запълнен с камък, тогава му се присвоява стойност 1. Ако съседите отгоре и отдолу са запълнени с камък, тогава на точката се присвоява стойност 1 + 4, тоест 5.
Може да се види, че зададените стойности на посоката са същите като стойностите в позициите в двоични числа и това не е изненадващо: и двата типа стойности са начини за представяне на възможни комбинации от четири позиции, всяка от които може да бъде в състояние "включено" или "изключено" (камък или "въздух").
Ето сегмент от картата с попълнени стойности на всички плочки. Можете да опитате ръчно да изчислите стойността за чифт плочки, за да видите как работи.
Добавяне на плочки
Начинът, по който наборът от плочки е позициониран в изображението, не е случаен: той е позициониран по такъв начин, че всяка плочка съответства на плочка от карта, на която трябва да бъде присвоена стойност. След като присвоим стойности на всички точки на картата, ние просто търсим стойността в набора от плочки и поставяме подходяща плочка в тази точка:
преместване на
Част първа: да се отървем от "въздуха"
Примерът по-горе работи добре за плаващи платформи, но всъщност не се справя напълно с двата вида плочки.
Нека си представим, че вместо платформена игра, работим върху 2D стратегическа игра отгоре надолу, която има два вида плочки – трева и вода. В този случай изображението на плочката ще присъства във всяка точка на картата, в него няма да има празни места, както в платформинг. Това означава, че за да се определи подходяща плочка, всяка точка от картата трябва да има стойност, генерирана въз основа на нейните съседи.
Можем да използваме точносъщата система за оценка на съседите, както преди, но се нуждаем от начин да определим, когато изучаваме точка, дали е трева или вода. Това е много лесно за изпълнение - просто добавете още една стойност към самата точка, според същия модел "2 на степен n" от други стойности:
Нека решим, че ако има вода, ще добавим точки към стойността, но ако има трева, няма да го направим. Тоест тревна плочка, заобиколена от всички страни с трева, ще има стойност 0. Тревна плочка с вода отгоре и вдясно има стойност 1 + 8 = 9. Водна плочка, заобиколена от трева от всички страни, ще има стойност 16. Водна плочка, заобиколена от вода от всички страни, ще има стойност 1 + 2 + 4 + 8 + 16 = 31
Част втора: Добавяне на вариации
Как да осигурим обработката на други видове терени?
Да кажем, че има три типа терен в игра отгоре надолу: вода, трева и гора. Вече обработваме водни и тревни граници, сега трябва да се научим как да боравим с водни и горски граници, както и с трева и гори.
Преди това имахме две опции за плочки за всяка съседна позиция (трева или вода), така че използвахмедвоичната бройна система. Сега има три опции, така че трябва да използваметроичната система. Необходимо е да промените системата за оценяване на съседите, за да съответства на новата бройна система:
Двоичната система използва модела "2 на степен n", в новата ще използваме модела "3 на степен n".
В тройната система всяка позиция има три възможни състояния: трева, вода, гора или 0, 1, 2. Когато тревата е в текущата точка, ние игнорираме стойността (умножаваме я по 0). Когато в точката има вода, добавяме дадената стойност (умножаваме я по 1). В случая с гората добавяме два пътистойност (умножете я по 2).
Тоест, в случай на горска плочка, отгоре и вдясно от която има вода, отдолу е гора, а отляво е трева: 81 * 3 + 1 * 2 + 3 * 1 + 9 * 3 + 27 * 0 = 275
Както можете да видите, на този етап, за да покриете всички комбинации на карта с три типа терен, вече трябва да са начертани 324 изображения на плочки. Ако се направи ръчно, това ще отнеме много време. Силно препоръчвам да научите поне частично автоматизирани начини за създаване на толкова много комбинации.
Разбира се, по същия начин системата може да бъде разширена до повече видове релеф, но броят на изображенията на плочки ще се увеличи значително. Затова препоръчвам да се наложат ограничения върху това кои плочки могат да бъдат съседни една на друга. Например, ако горските и водните плочки никога не могат да граничат една с друга, тогава в горния пример ще са необходими няколкостотин изображения на плочки по-малко.
Hardcore conf в C++. Каним само професионалисти.