Мнения о игровой платформе актер / разрешение фоновых коллизий - PullRequest
3 голосов
/ 16 июня 2010

Представьте себе следующий сценарий: у меня есть уровень, физическая структура которого построена из набора ограничивающих прямоугольников в сочетании с предварительно обработанными растровыми фонами. У моих актеров, включая персонажа игрока, есть свой ограничивающий прямоугольник. Если актеру удастся застрять в блоке уровня, частично или иным образом, его нужно будет снова сдвинуть, чтобы он был заподлицо с блоком.

Непроверенная техника, которую я придумал во время биоразрыва, выглядит следующим образом:

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

Мнения по этому поводу? Предложения по лучшим методам?

На самом деле ограничивающие риты - это XNA BoundingBoxes с Z-диапазоном от -1 до 1, но это все же 2D-геймплей.

Ответы [ 4 ]

5 голосов
/ 17 июня 2010

Читали ли вы N учебники ?Это замечательное введение, дополненное небольшими демонстрациями, Теорема о разделении осей на основе обнаружения столкновений и простой реакции проекции.(Они на самом деле используются в игре N с большим эффектом.) Учебные пособия охватывают больше, чем вам нужно, но они очень общие (расширяемые многими другими формами) и начинают затрагивать вопросы, связанные сбыстро движущиеся объекты и другие методы реагирования.

Даже если вы решите пойти с чем-то более простым, чем реализация SAT, это может дать вам много хороших идей.

(Когда вы 'покончите с этим, и если вы хотите, чтобы ваш ум был потрясен, попробуйте заглянуть в некоторые презентации из учебного дня по физике на конференции разработчиков игр, включая публикации realtimecollisiondetection.net , essentialmath.com слайды учебника , и эти книги, и / или другие материалы, связанные с этими сайтами. Я бы также настоятельно рекомендовал сам сеанс GDC. Хотя нам все еще не нужен или особенно не нужен модный GJK для простых оболочек на платформах для портативных игрс которыми мы работаем, некоторые из более простых понятий, таких как «пространства конфигурации» и суммы и различия Минковскогосильно повлияло на то, как я думаю о физике и обнаружении столкновений и как мы ее реализуем.)

1 голос
/ 17 июня 2010

Что «настоящие» физические движки делают, так это находят минимальный вектор проникновения.То есть - наименьший вектор, который представляет, как далеко друг от друга проникают два объекта.

Для AABB (ограничивающий прямоугольник) это очень легко вычислить.Ваша собственная 2D-структура AABB будет меньше и, следовательно, лучше для производительности.)

Как только у вас будет минимальный вектор проникновения, вы сможете выполнить реакцию на столкновение.И самый простой ответ - просто разделить два объекта по этому вектору (или отделить один объект, если другой является статическим).

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

0 голосов
/ 17 июня 2010

Другой возможный подход состоит в том, чтобы вместо ожидания столкновения, а затем сдвига, проверять возможные столкновения перед перемещением объектов и, если произойдет столкновение, перемещать игрока только до края блока.

То есть, как Adventure сталкивается со стенами: http://www.youtube.com/watch?v=I6-zN_eaRd8 с тем, как большинство игр NES сталкиваются со стенами.

0 голосов
/ 17 июня 2010

Многое зависит от деталей.Полное решение может принимать во внимание скорости или другие проблемы.Но относиться к этому просто ...

Вы не хотите всегда сначала разрешать по вертикали.Представьте, что актер толкает горизонтально в блок.Если вы сначала разрешите по вертикали, тогда актер появится над этим блоком, когда было бы достаточно небольшого горизонтального перемещения.

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

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

Возможно, если твое последнее движение все еще оставляет тебя в столкновении, ты можешь просто усреднить последние два движения и оставить его там.*

...