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

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

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


person Sukasa    schedule 13.01.2010    source источник
comment
Я не знаю, насколько это полезно, но вам может быть интересно. simcity.ea.com/about/inside_scoop/3d1.php   -  person Zack Peterson    schedule 14.01.2010
comment
Это было определенно интересно, но вы правы, это не затронуло здесь главного вопроса. Спасибо за ссылку в любом случае!   -  person Sukasa    schedule 14.01.2010


Ответы (1)


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

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

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

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

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

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

person U62    schedule 14.01.2010