прыжки в игре - PullRequest
       61

прыжки в игре

3 голосов
/ 01 апреля 2012

Я делаю 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 Ответ

4 голосов
/ 01 апреля 2012

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

Вот некоторый код для основ игры.

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

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 являются постоянными значениями, если не изменяется гравитация или трение.

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

...