2010-01-14 4 views
1

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

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

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

Спасибо!

ответ

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

  2. Ваша игра должна быть организована так, чтобы взаимодействие игровых объектов и визуализация игры на экране были полностью разделены. Вы можете думать об этих двух разделах программы как о «модели» и «представлении». В модели у вас есть полный 3D-мир с тремя осями. Вы не можете пойти на половину в этот момент без какой-либо боли. Ваша модель должна быть 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-точечную перспективу для глубокого фона и орфографический материал для переднего плана.

+0

Отличный ответ Бретон. Теперь все это получилось. Спасибо за помощь! –

1

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

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

screen_Y = Y + Z/some_fudge_factor; 

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

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

+0

Добавлены дополнительные разъяснения. – slebetman

+0

Спасибо slebetman, я определенно путал рисунок с симуляцией столкновения. –