Как мне управлять движущимися платформами в игре на платформе?


15

Я не хочу использовать box2d или что-то еще, я просто хочу простые движущиеся платформы (вверх-вниз, влево-вправо, диагональные и круговые пути). Мой вопрос заключается в том, чтобы справиться с иерархией порядка обновления / управления, чтобы игрок оставался неподвижным на платформе, без отскока или колебания?

Ответы:


16

Мое решение состояло бы в том, чтобы рассматривать каждый физический объект в игровой карте как узел дерева , а саму карту как корневой узел . Узлы могут содержать другие узлы. Каждый узел содержится (прямо или косвенно) внутри узла карты.

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

Для этого каждый узел должен иметь (x, y) позицию относительно родительского узла . Например, ваш персонаж может быть расположен в (1,0) относительно платформы, которая сама может быть расположена в (10,10) относительно игровой карты. Таким образом, если платформа движется, ваш персонаж будет двигаться неявно.

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

(позиция персонажа) + (позиция родительского узла) + (позиция корневого узла) = (1,0) + (10,10) + (0,0) = (11,0)

Итак, все это время ваш персонаж стоял на платформе. А как насчет прыжков? Ну, в тот момент, когда он прыгает, вы отрываете его от платформы и прикрепляете его к узлу, в котором находится платформа ; в этом случае карта (корневой узел).

Когда он приземлится снова, прикрепите его к любому узлу, на котором он приземлился.


1
Я бы также использовал скорость x и y от узла, чтобы повлиять на игрока. Пример 1: платформа движется очень быстро вверх и останавливается, игрок набирает обороты и запускается. Пример 2: платформа движется вниз немного медленнее, чем игрок, падающий со смертельной скоростью. Платформа должна быть безопасна для приземления вместо SPLUT
AttackingHobo

Это интересный подход, но, похоже, он полностью изменил мой двигатель, чтобы позволить двигать платформу. Может быть, если я создаю objectOnPlatform как компонент, который я могу сделать для любого объекта, который только временно дает этот эффект?
Иан

10

Я бы предложил рассматривать это как проблему псевдофизики и решать ее, используя трение о землю.

Вы уже используете гравитацию, чтобы удерживать персонажа на земле, это обрабатывает ситуации, когда платформы движутся вверх и вниз. Чтобы справиться с левым и правым движением, земля должна оказывать сильное трение на персонажа. Обычно этот уровень трения составляет 1,0 или 100%.

Если персонаж стоит на месте, то его скорость равна 0, и вместо этого он наследует 100% скорости платформы из-за трения. Что-то вроде следующего:

character_velocity = friction * platform_velocity

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

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


0

Вы можете зафиксировать положение игрока не «абсолютно на уровне», а «относительно платформы», а затем иметь функцию, которая определяет его фактическую позицию. Мне не нравится это все же.

Вероятно, было бы лучше (и проще) привязать игрока к платформе, чтобы при перемещении платформы на + x / + y игрок двигался так же.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.