Платформенный движок плиток - совет, что делать с длинными плитками
Я ищу совет больше, чем прямую помощь.
Я работаю над 8-битной платформерной игрой в XNA. Я, вероятно, уже потратил на это 160 часов, и у меня начинаются проблемы с двигателем, который у меня есть. Это в основном адаптированная / модифицированная версия демоверсии платформ XNA. Все или большинство моих плиток имеют размер 32x32, но некоторые имеют ширину 64 и 32 пикселя, как у стола. Некоторые из них 32 в ширину и 64 в высоту, как растение.
Я отправляю их в gpu только по одному.png за раз, аналогично тому, как автор учебника по XNA выполняет отображение листов. Для анимированных спрайтов я использую карту тайлов разных фреймов персонажа. Что касается данных карты тайла, я читаю в текстовом файле, как учебник по XNA.
Как мне приспособиться к широким и высоким плиткам? Должен ли я создать двухслойную систему плиток (я решил, что должен соблюдать правило "оставайся простым")?
Прямо сейчас я использую прозрачные плитки, чтобы расширить широкие плитки.
Стол со стулом:
http://dl.dropbox.com/u/8446900/game_screen_desk.png
.....
...h.
..d".
#####
Завод и стул:
http://dl.dropbox.com/u/8446900/game_screen_plant.png
..p...h.
..,...,.
########
Стул - "h", "d" - для рабочего стола, "p" - "растение", а "," - для прозрачного фона (без взаимодействия с пользователем). "" означает прозрачную плитку, на которой пользователь может стоять (расширяя стол). Проблема, как вы можете видеть, в том, что на заднем плане видна дыра.
Должен ли я сделать реальную карту тайлов и объединить все в один большой PNG? Другой вариант, который я могу выбрать, - это нарезать каждую широкую или высокую плитку на две разные плитки. Как профессионал сделал бы это? Я не ищу быстрых и грязных решений, просто как будет работать современный платформер.
ОБНОВЛЕНИЕ: просмотрев ответ, я нашел очень полезный инструмент, который упаковывает спрайты в лист.
http://spritesheetpacker.codeplex.com/
ОБНОВЛЕНИЕ: Мой недавно обновленный движок плиток намного быстрее и почти так же прост. Совет ниже был отличным. Настоятельно рекомендуется.
1 ответ
Прежде всего - не вводите плитки специальной ширины / высоты. Заставьте художника нарезать большие объекты на отдельные плитки (и, следовательно, заново составить их в редакторе карт). Каждый тайл должен быть PNG с альфа-каналом, чтобы их можно было правильно составить.
Имея это в виду, мои рекомендации:
Ваши плитки должны состоять только из отдельных плиток, которые имеют предварительно составленные части различных объектов, например, левая часть стола - это одна плитка, правая часть без стула - другая, а еще одна со стулом позади нее. (tilevalue = "dc", возможно?)
Вы можете определить несколько слоев отдельных плиток и визуализировать их назад-вперед. Вы также можете определить коэффициент параллакса для нескольких слоев и, таким образом, довольно легко получить хороший эффект параллакса между двумя слоями. Конечно, игрок должен "существовать" в одном слое за раз, иначе вы не будете знать, какую геометрию столкновения использовать для своей текущей позиции.
Вам также не следует создавать по одной текстуре на плитку, а скомпилированную таблицу плиток (в точности как таблицу спрайтов), чтобы минимизировать количество изменений рендеринга. Вносить много изменений в каждый вызов отрисовки плохо, потому что каждый раз, когда вы вносите изменения (текущая текстура, цвет рисунка или что-то еще, что влияет на этот вызов отрисовки), API, драйвер и, возможно, сам графический процессор должны выполнять работу по обновлению своего состояния - это складывает быстро.
Обратите внимание, что это не означает, что вы должны помещать символы и уровни в ОГРОМНУЮ таблицу спрайтов - это плохо по другим причинам. Вы можете, например: поместить все связанные с уровнем плитки в один лист плиток, плитки анимации героя в другой и всех врагов в один (вместе) или что-то подобное.
Надеюсь, это поможет, в противном случае я был бы рад объяснить вещи дальше.