Перемещение спрайтов между плитками в Изометрическом мире
Я ищу информацию о том, как перемещать (и анимировать) 2D-спрайты по изометрическому игровому миру, но их движение плавно анимируется, как при перемещении от плитки к плитке, в отличие от того, чтобы они прыгали из границ одной плитки, чтобы границы следующего.
Примером этого может служить игра "Транспортный магнат", где поезда и вагоны часто наполовину в одной клетке, а наполовину в другой.
3 ответа
Рисование спрайтов в нужном месте не так уж сложно. Формула проекции:
screen_x = sprite_x - sprite_y
screen_y = (sprite_x + sprite_y) / 2 + sprite_z
sprite_x и sprite_y являются значениями с фиксированной точкой (или плавающей точкой, если хотите). Как правило, точность фиксированной точки - это количество пикселей на плитке, поэтому, если размер вашего мозаичного изображения составляет 32x16 (квадрат проекции 32x32), у вас будет 5 бит точности, т.е. 1/32 от плитки.
Действительно сложная часть состоит в том, чтобы отсортировать спрайты в порядке, который отображается правильно. Если вы используете OpenGL для рисования, вы можете использовать z-буфер, чтобы сделать это действительно легко. Используя GDI, DirectX и т. Д., Это действительно сложно. Транспортный магнат не правильно отображает спрайты во всех случаях. У оригинального Transport Tycoon был самый ужасный движок рендеринга, который вы когда-либо видели. В нем реализованы три уровня масштабирования - три экземпляра массивного макроса masm. ТТ была написана полностью на ассемблере. Я знаю, потому что я портировал его на Mac много лет назад (и также сделал классную версию для комплекта разработчика PS1, хотя для этого потребовалось 6 Мб).
PS Одна из маленьких графических фигур в бунгало в игре была основана на доме, в котором жил Крис Сойер в то время. У нас возник соблазн добавить Ferrari, припаркованный на подъездной дорожке, для версии для Mac, поскольку именно эту машину он купил с гонорарами.
Посмотрите, как выполнить линейную интерполяцию (это довольно простая формула). Затем вы можете использовать это для параметризации перехода в одном диапазоне [0, 1]. Тогда у вас просто есть состояние в ваших спрайтах для хранения фактов:
- Что они движутся
- Начальная и конечная точки
- Время начала и окончания (или время начала и продолжительность
и затем каждый кадр вы можете нарисовать его в правильном положении, используя интерполяцию от начальной точки до конечной точки. Как только вы превысили длительность, спрайт обновляется, чтобы не двигаться и позиционироваться в конечной точке / плитке.
Почему вы думаете, что он будет прыгать с плитки на плитку? Вы можете расположить свой спрайт в любой координате x,y.
Сначала создайте свой фоновый буфер экрана, а затем поместите свои спрайты поверх него.