Привет
Никак не могу придумать, как перемещать объект с постоянной скоростью. У меня есть объект, который перемещается с помощью стрелок. При удержании клавиши объект будет плавно перемещаться с определённой скоростью. Подскажите идеи, как это можно реализовать?
Что-то вроде: я нажимаю кнопку -> запускается время -> объект перемещается на шаг -> сцена перерисовывается. Напишите логику на псевдокоде
На всякий случай, использую фреймворк Qt и OpenGL, но мне хочется почитать общие идеи, как сделать плавное перемещение. Объект у меня есть, но он движется отрывисто. Я могу менять скорость, но мой вариант меня не устраивает. Вот exe для Win7
На данный момент у меня логика такая:
- запускаю часы в милисекундах
- при нажатии на кнопку, я считываю количество милисекунд в переменную t и перезапускаю таймер
- я заметил, что если не отпускать кнопку, то t будет примерно равна 38 мсек
- Если t больше 100 мсек, я выхожу из функции обработки нажатия клавиши, в противном случае, я перемещаю объект на 0.1 * t
Вектор скорости - сколько пути пройдет за например 1с.
При обновление получаешь dt умножаешь на вектор и вот тебе пройденное расстояние.
Да, без умножения на dt (delta time) никак. Точно не помню как просчитывается, если не ошибаюсь это интервал времени между вызовами Апдейта.
Объясните, пожалуйста, подробнее, при чём здесь update?
update - перерисовка сцены или интервал между срабатываниями обработчика нажатия кнопки?
8Observer8
update - тик для сцены: обновление ввода, звука, физики, игровая логика, фиксированный шаг (если есть и нужно) и т.д.
render - только отрисовка, обычно после update
8Observer8
> Никак не могу придумать, как перемещать объект с постоянной скоростью.
Не нужно придумывать. Нужно книги читать, да статьи.
У меня update (перерисовка) вызывается только в конце обработчика кнопок. Периодического обновления нет. Нужно ли по таймеру перерисовывать? Всё равно не понимаю, как решить проблему
asvp
> Не нужно придумывать. Нужно книги читать, да статьи
Дайте, пожалуйста, ссылку. Я ничего не нашёл
С каждой новой подобной темой ты в моих глазах превращаешся в тролля
8Observer8
> Дайте, пожалуйста, ссылку. Я ничего не нашёл
http://pmg.org.ru/gamedev/proggame.part1.rar
http://pmg.org.ru/gamedev/proggame.part2.rar
http://rutracker.org/forum/viewtopic.php?t=3727670
http://pmg.org.ru/nehe/nehe39.htm (только вместо физических параметров изменяющиеся от dT, изменяются координаты и ориентация).
// инициализация
double fixedTick = 1.0 / 60.0;
double gameClock = GetTimeInSeconds( dtTimer );
// ======================
// в главном цикле
// здесь рендер
double dt = GetTimeInSeconds( dtTimer ) - gameClock;
while( dt >= fixedTick ) {
dt -= fixedTick;
gameClock += fixedTick;
// здесь код игры
}Таким образом имеем фиксированный шаг времени( на него можно ничего не умножать, т.к явно задано количество апдейтов в секунду - 60 ). Этот код проверен, и используется в нескольких моих проектах. Дает стабильную скорость перемещения при любом фпс.
Valorin
> С каждой новой подобной темой ты в моих глазах превращаешся в тролля
А я всегда думал, что это ты тролль. В моей теме ничего нет тролльного
Проблема в том, что когда я нажимаю кпопку движения, то обработчик вызывается каждые 38 миллисекунд, если компьютер будет шустрее, то чаще. Наверное, при нажатии на кнопку должен запускаться таймер и останавливаться, после прохождения интервала, за этот интервал объект будет проходить расстояние разбитое на мелкие отрезки. Пока ничего более придумать не смог
asvp
mr.DIMAS
Спасибо большое за ссылки и за код! Буду думать и пробовать
8Observer8
У вас проблема в том, что вы не разобрались в работе OpenGL в Qt.
У вас события обновления OpenGL происходит от сигнала от кнопки, а нужно делать от таймера.
А сигнал кнопки использовать именно для приращения координат по dT.
Почитайте это для начала:
http://www.gamedev.ru/code/articles/OpenGL_Qt4
http://www.gamedev.ru/code/articles/opengl_qt4_part2
Идея реализации не отличается если используете Qt5.
Тема в архиве.