Я разрабатываю движок, похожий на fps в формате HTML5 3D, который уже выглядит довольно неплохо, но, поскольку это может быть один из худших вариантов выбора языка для создания 3D, иногда наблюдается заметная задержка.
Я запрограммировал движения (WASD), чтобы быть независимым от скорости рендеринга, поэтому иногда это довольно резко, но в других случаях работает на приемлемых 30 + кадров в секунду (в зависимости от процессора, конечно).
Единственное, что я не могу обернутьсяявляется прыжком: в настоящее время прыжок выполняется путем добавления положительной постоянной к падающей переменной (гравитация всегда отрицательна, а затем корректируется с помощью обнаружения столкновений), а затем вычитает постоянную, это вызывается каждый раз при рендеринге нового кадра, дело в том, чтокогда fps понижается, я чувствую себя на луне.Я предпочитаю рывки медленному эффекту.
Если я использую тот же метод, что и для перемещения (рассчитываю время между текущим и последним кадром), вычитаемая переменная иногда становится слишком большой, а вершина прыжка меняется (на половину)значения по сравнению с высоким fps) - это недопустимо, поскольку высота прыжка всегда должна быть одинаковой.
Вот некоторый псевдокод, помогающий понять проблему (вызывается во время одной процедуры рендеринга):
// when clicked on spacebar:
if(spacebar)
{
// this defines jumping apex
jump = 0.5
}
// constant added to y (vertical position) later in the code
cy += jump;
// terminal velocity = -2
if(jump > -2)
{
// gravity (apex multiple to get maximum height)
jump -= 0.05;
}
if(collision_with_floor)
{
// stop falling
cy = 0;
if(jump < 0)
{
jump = 0;
}
}
player.position.y += cy;
Теперь с зависимым от времени прыжком (замените в коде выше):
// terminal velocity = -2
if(jump > -2)
{
// gravity, 0.4 is an arbitrary constant
jump -= (now - last_frame)*0.4;
last_frame = now;
}
Чтобы проиллюстрировать еще лучше, вот изображение того, что происходит:
![enter image description here](https://i.stack.imgur.com/h1nN7.png)
Синие точки указывают на рендеринг кадров.
Я даже не уверен, что это правильный способ запрограммировать подпрограмму прыжка.В основном, рывок и постоянная высота прыжка лучше, чем эффект плавности и замедленного движения.