Реализация оси z в 2D боковой скроллере - PullRequest
1 голос
/ 15 января 2010

Я делаю боковой скроллер, похожий на Castle Crashers, и сейчас я использую SAT для обнаружения столкновений. Это прекрасно работает, но я хочу имитировать «глубину» уровня, позволяя объектам перемещаться вверх и вниз по экрану, в основном вдоль оси z (как на этом скриншоте http://favoniangamers.files.wordpress.com/2009/07/castle-crashers-ps3.jpg). Это не изометрическая игра, но скорее использует параллаксную прокрутку.

Я добавил компонент z в свой векторный класс и планирую отбирать столкновения на основе «толщины» фигуры и ее положения по z. Я просто не уверен, как рассчитать положение фигур для рендеринга или как добавить прыжок с гравитацией. Как рассчитать максимальное значение y (для земли) при изменении положения z? По сути, меня смущают отношения оси Z и Y.

Буду признателен за ссылки на ресурсы, если кто-нибудь знает эту тему.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 15 января 2010
  1. Фактически возможно сделать ваш алгоритм обнаружения столкновений независимым от размеров. Просто имейте детектор столкновений, который работает по одному измерению, используйте его для проверки каждого измерения, и ваш ответ «сталкиваются они или нет» - это логическое И обнаружения столкновения по каждому из измерений.

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

Вид прочитает местоположение всех игровых объектов и спроецирует их на экран, используя определение камеры. Для этой части вам не нужен полный движок 3D рендеринга. Правильный технический термин для перспективы, о которой вы говорите, является «косым», и его можно увидеть на многих древних китайских и японских свитках и картинах, в частности ищите изображения «Сказки о Гэндзи».

Положение объекта на экране (включая поверхность земли!) Выглядит примерно так:

DEPTH_RATIO=0.5;
view_x=model_x-model_z*DEPTH_RATIO-camera_x;
view_y=model_y+model_z*DEPTH_RATIO-camera_y;

Вы можете изменить для прямой ортографической проекции:

DEPTH_RATIO=0.5;
view_x=model_x-camera_x;
view_y=model_y+model_z*DEPTH_RATIO-camera_y;

И, конечно же, не забывайте отбирать объекты за пределы объема, определенного камерой.

Вы также можете использовать этот механизм для управления позиционированием слоев параллакса. Это, конечно, вопрос смены камеры на перспективную 1-точечную проекцию вместо ортографической проекции. Вам не нужно использовать это, чтобы изменить размер рендеринга ваших спрайтов, но это поможет вам реалистично управлять положением x объектов. если вы готовы принять вызов, вы можете даже смешать проекции - используйте 1-точечную перспективу для глубокого фона и орфографические элементы для переднего плана.

1 голос
/ 15 января 2010

Вы должны отделить вашу концептуальную ось Y, используемую вами при физическом расчете (обнаружение столкновений и т. Д.), И ось Y, которую вы фактически рисуете на экране. Таким образом, это становится менее запутанным.

Просто делайте расчеты для нормального представления, делая вид, что между осью Y и Z нет никакой связи, тогда, когда вы фактически рисуете объект на экране, вы моделируете ось Z с использованием оси Y:

screen_Y = Y + Z/some_fudge_factor;

Собственно, так работают настоящие 3d движки. После того, как все мировые вычисления выполнены, координаты X, Y и Z отображаются на screen_X и screen_Y с помощью функции (обычно немного более сложной, чем приведенное выше уравнение, но чуть-чуть).

Например, для реализации псевдо-изометрического представления в вашей игре вы даже можете применить Z к оси screen_X, чтобы объекты смещались по диагонали, а не по вертикали.

...