Программирование игры: убрать задержку движения (прыжки) - PullRequest
1 голос
/ 12 декабря 2011

Я разрабатываю движок, похожий на 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

Синие точки указывают на рендеринг кадров.

Я даже не уверен, что это правильный способ запрограммировать подпрограмму прыжка.В основном, рывок и постоянная высота прыжка лучше, чем эффект плавности и замедленного движения.

1 Ответ

0 голосов
/ 12 декабря 2011

Если обновления кадров идут слишком медленно, чтобы получить точную физику, то, возможно, вы можете взломать вершину прыжка, чтобы игрок всегда попадал в нее.Сигнал здесь может быть, когда скорость у изменяется с положительного на отрицательный.Если я правильно читаю ваш псевдокод, то он выглядит следующим образом:

old_cy = cy;
cy += jump;
if(old_cy > 0 && cy <= 0)
  player.position.y = jump_apex_height;

С точки зрения вашего графика идея состоит в том, что вы хотите определить синюю точку, которая достигает оранжевой линии, а затем увеличить еедо пунктирной линии.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...