Прыжки в игре

Я делаю 2-х сторонний скроллер, и я не могу прыгнуть на работу. Вот как я двигаюсь влево и вправо:

for(var i = 0; i < time; i++)
     newVelocityX = (oldVelocityX + accelerationX) * frictionX;

затем обновить позицию игрока, я делаю

positionX = oldPositionX + newVelocityX;

Это прекрасно работает, и переменная "time" просто имеет количество мс, которое было с тех пор, как я последний раз запускал функцию. Трение прекрасно работает, и я рад, что все хорошо в направлении X. Вот что я имею в направлении Y:

for(var i = 0; i < time; i++) {
    accelerationY += gravityAccelerationY;
    newVelocityY = oldVelocityY + accelerationY;
}

Объект падает из-за силы тяжести просто отлично. Если я установлю отрицательное ускорение Y, когда пользователь нажимает стрелку вверх, я могу даже заставить игрока прыгать, но на быстром компьютере они прыгают очень высоко, а на старом компьютере они прыгают очень низко. Я не уверен, как это исправить, я думал, что уже учел это, поместив это в цикл foor, как я сделал.

1 ответ

Решение

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

Вот некоторый код, чтобы сделать основы игры.

Пример кода для прыжков:

if (jump) {
    velocityY = -jumpHeightSquared; // assuming positive Y is downward, and you are jumping upward
}
velocityY += gravityAccelerationY * time;
positionY += velocityY * time;
if (positionY > 0) {
    positionY = 0; // assuming the ground is at height 0
    velocityY = 0;
}

Пример кода для перемещения в сторону:

velocityX += accelerationX * time;
velocityX *= Math.pow(frictionX, time);
positionX += velocityX * time;

Некоторые комментарии к коду:

Переменные скорости и положения должны сохранять свои значения между кадрами (я предполагаю, что вы поняли это).

gravityAccelerationY и frictionX являются постоянными значениями, если только гравитация или трение не изменятся.

Где я заменил твои петли * timeИспользование одного умножения будет быстрее, чем цикл. Единственная разница будет в низкой частоте кадров или высоких скоростях ускорения, когда ускорение будет казаться "ускоренным" по сравнению с тем, каким оно должно быть. У вас не должно быть проблем с этим, хотя.

Другие вопросы по тегам