прыгать в игре

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

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

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

positionX = старая позицияX + новая скоростьX;

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

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

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


person David Zorychta    schedule 01.04.2012    source источник
comment
Звучит так, как будто между истечением срока действия старого таймера и запуском нового был значительный интервал. Конечно, на медленном компьютере такой интервал был бы больше. Но это просто мысль: если неактуально, пожалуйста, не обращайте внимания. Удачи.   -  person thb    schedule 01.04.2012
comment
Можем ли мы увидеть еще немного кода? Например, основной игровой цикл?   -  person Jeffrey Sweeney    schedule 01.04.2012


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

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

person Kendall Frey    schedule 01.04.2012