Отсечение закадровых тайлов в изометрическом движке

StackOverflow https://stackoverflow.com/questions/2060690

Вопрос

Для университетского семестра я работаю над графическим рогаликом (я осознаю противоречие в терминах: P), в котором используется изометрическое отображение.Что я пытаюсь выяснить, так это то, что рисование всех плиток глупо дорого и ненужно, я хочу найти относительно быстрый алгоритм, чтобы определить, какие плитки следует отрисовать, чтобы они поместились в окне NxMpx, учитывая, что плитка графика — XxYpx.

Я не делаю для этого плавную прокрутку, так что это не проблема.Я также не беспокоюсь о том, чтобы быть идеальным — небольшое ненужное рисование — это нормально, я просто не хочу рисовать огромное количество ненужных тайлов, которые не будут отображаться в игре.

Это было полезно?

Решение

Вам нужно подумать о двух концепциях:Экранное пространство и мировое пространство.Они очень важны в 3D-движках, но применимы ко всем играм, кроме самых простых.В изометрическом движке ваше мировое пространство представляет собой двухмерный массив плиток.

Итак, вы ищете прежде всего способ скрыться между этими двумя координатными пространствами.Как только вы это сделаете, станет очевидно, что пространство экрана отображается на мире как прямоугольник, повернутый на 45 градусов.Вы можете определить формулу для этого, но это важно только в том случае, если вы пытаетесь определить, какая часть мирового пространства видна, поэтому вы симулируете монстров только в этой области (эффективность, необходимая на 8-битных консолях, вероятно, не на современном ПК! ).Когда дело доходит до реального рендеринга, вам на самом деле не нужно определять эту видимую область мира, потому что она неявно заложена в способе рендеринга тайлов на экране:

  1. Вы определяете, какое местоположение тайла находится в левом верхнем углу экрана, назовите это O (для начала координат) — это будет фиксированное смещение от вашей точки интереса, обычно игрока, которую вы хотите оставить в центре. экран.
  2. Как только вы это сделаете, вы красите плитки в верхнем ряду экрана, шагая +1X и -1Y в мировом пространстве для каждой плитки (если вы смотрите на северо-восток).
  3. Затем вы красите строку ниже.Это смещение минус половина ширины тайла в экранном пространстве и начинается с O-1X в мировом пространстве.
  4. Вы повторяете шаги 2 и 3, изменяя свою начальную позицию в мировом пространстве на -1 по X и Y по сравнению с тем, что вы использовали на предыдущем этапе 2, пока не достигнете верхней части экрана.

Другие советы: -

  • Очевидно, вы не рисуете плитки, находящиеся за пределами карты.Вы также можете, в зависимости от дизайна игры, не рисовать плитки за пределами конкретной комнаты, в которой находится игрок.
  • Здесь нужно рисовать не только плитки пола, но и игроков, монстров, сценарий и т. д.Правило таково: вы рисуете все в определенной локации мира за один проход.Таким образом, объекты, расположенные ближе всего к «камере», будут скрывать то, что находится за ними (именно поэтому вы начинаете рисовать в верхней части экрана).
  • Кроме того, в большинстве iso-движков есть не только напольные плитки, но и мебель и сегменты стен.Вы можете обозначить области карты как принадлежащие определенной комнате, когда фокус находится на этой комнате (например, потому что в ней находится игрок), вы не рисуете сегменты стены для стороны комнаты, ближайшей к камере. .

В любом случае, этого достаточно, надеюсь, что это будет полезно и ваш проект пойдет хорошо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top