Мое решение состояло бы в том, чтобы рассматривать каждый физический объект в игровой карте как узел дерева , а саму карту как корневой узел . Узлы могут содержать другие узлы. Каждый узел содержится (прямо или косвенно) внутри узла карты.
Например, скажем, ваш персонаж стоит на платформе. Узел платформы содержит узел персонажа. Таким образом, всякий раз, когда платформа перемещается, узлы, которые она содержит (в данном случае персонаж), также будут перемещаться.
Для этого каждый узел должен иметь (x, y) позицию относительно родительского узла . Например, ваш персонаж может быть расположен в (1,0) относительно платформы, которая сама может быть расположена в (10,10) относительно игровой карты. Таким образом, если платформа движется, ваш персонаж будет двигаться неявно.
В этом иерархическом дереве позиция каждого узла равна сумме его позиции плюс каждой позиции его родительских узлов. Допустим, мы хотим получить положение персонажа на карте. Мы рассчитываем:
(позиция персонажа) + (позиция родительского узла) + (позиция корневого узла) = (1,0) + (10,10) + (0,0) = (11,0)
Итак, все это время ваш персонаж стоял на платформе. А как насчет прыжков? Ну, в тот момент, когда он прыгает, вы отрываете его от платформы и прикрепляете его к узлу, в котором находится платформа ; в этом случае карта (корневой узел).
Когда он приземлится снова, прикрепите его к любому узлу, на котором он приземлился.
Я бы предложил рассматривать это как проблему псевдофизики и решать ее, используя трение о землю.
Вы уже используете гравитацию, чтобы удерживать персонажа на земле, это обрабатывает ситуации, когда платформы движутся вверх и вниз. Чтобы справиться с левым и правым движением, земля должна оказывать сильное трение на персонажа. Обычно этот уровень трения составляет 1,0 или 100%.
Если персонаж стоит на месте, то его скорость равна 0, и вместо этого он наследует 100% скорости платформы из-за трения. Что-то вроде следующего:
Преимущество этого подхода заключается в том, что он легко поддается дополнительной механике платформера, такой как способность преодолевать трение на крутых склонах, позволяя вашему персонажу скользить. Это также позволяет вам легко уменьшить трение, чтобы создать лед, по которому персонаж будет скользить.
Также легче справиться с такими проблемами, как низко висящие стены, которые могут сбить игрока с движущейся платформы. Если вы просто относитесь к персонажу как к дочернему элементу родительской платформы, есть большая вероятность, что он не будет очень легко взаимодействовать с остальной частью вашего обнаружения столкновений без большой работы.
источник
Вы можете зафиксировать положение игрока не «абсолютно на уровне», а «относительно платформы», а затем иметь функцию, которая определяет его фактическую позицию. Мне не нравится это все же.
Вероятно, было бы лучше (и проще) привязать игрока к платформе, чтобы при перемещении платформы на + x / + y игрок двигался так же.
источник