ПрограммированиеФорумГрафика

Плавное перемещение объектов с заданой скоростью

Страницы: 1 2 Следующая »
#0
13:14, 2 фев 2015

Привет

Никак не могу придумать, как перемещать объект с постоянной скоростью. У меня есть объект, который перемещается с помощью стрелок. При удержании клавиши объект будет плавно перемещаться с определённой скоростью. Подскажите идеи, как это можно реализовать?

Что-то вроде: я нажимаю кнопку -> запускается время -> объект перемещается на шаг -> сцена перерисовывается. Напишите логику на псевдокоде

На всякий случай, использую фреймворк Qt и OpenGL, но мне хочется почитать общие идеи, как сделать плавное перемещение. Объект у меня есть, но он движется отрывисто. Я могу менять скорость, но мой вариант меня не устраивает. Вот exe для Win7

На данный момент у меня логика такая:

- запускаю часы в милисекундах
- при нажатии на кнопку, я считываю количество милисекунд в переменную t и перезапускаю таймер
- я заметил, что если не отпускать кнопку, то t будет примерно равна 38 мсек
- Если t больше 100 мсек, я выхожу из функции обработки нажатия клавиши, в противном случае, я перемещаю объект на 0.1 * t

#1
13:18, 2 фев 2015

Вектор скорости - сколько пути пройдет за например 1с.
При обновление получаешь dt умножаешь на вектор и вот тебе пройденное расстояние.

#2
13:26, 2 фев 2015

Да, без умножения на dt (delta time) никак. Точно не помню как просчитывается, если не ошибаюсь это интервал времени между вызовами Апдейта.

#3
13:31, 2 фев 2015

Объясните, пожалуйста, подробнее, при чём здесь update?

#4
13:33, 2 фев 2015

update - перерисовка сцены или интервал между срабатываниями обработчика нажатия кнопки?

#5
13:39, 2 фев 2015

8Observer8
update - тик для сцены: обновление ввода, звука, физики, игровая логика, фиксированный шаг (если есть и нужно) и т.д.
render - только отрисовка, обычно после update

#6
13:43, 2 фев 2015

8Observer8
> Никак не могу придумать, как перемещать объект с постоянной скоростью.
Не нужно придумывать. Нужно книги читать, да статьи.

#7
13:44, 2 фев 2015

У меня update (перерисовка) вызывается только в конце обработчика кнопок. Периодического обновления нет. Нужно ли по таймеру перерисовывать? Всё равно не понимаю, как решить проблему

#8
13:46, 2 фев 2015

asvp
> Не нужно придумывать. Нужно книги читать, да статьи

Дайте, пожалуйста, ссылку. Я ничего не нашёл

#9
13:48, 2 фев 2015

С каждой новой подобной темой ты в моих глазах превращаешся в тролля

#10
13:54, 2 фев 2015

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, изменяются координаты и ориентация).

#11
13:54, 2 фев 2015
// инициализация
double fixedTick = 1.0 / 60.0;
double gameClock = GetTimeInSeconds( dtTimer );

// ======================
// в главном цикле
// здесь рендер

double dt = GetTimeInSeconds( dtTimer ) - gameClock;
while( dt >= fixedTick ) {
   dt -= fixedTick;
   gameClock += fixedTick;         
   // здесь код игры
}

Таким образом имеем фиксированный шаг времени( на него можно ничего не умножать, т.к явно задано количество апдейтов в секунду - 60 ). Этот код проверен, и используется в нескольких моих проектах. Дает стабильную скорость перемещения при любом фпс.

#12
13:57, 2 фев 2015

Valorin
> С каждой новой подобной темой ты в моих глазах превращаешся в тролля
А я всегда думал, что это ты тролль. В моей теме ничего нет тролльного

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

#13
13:58, 2 фев 2015

asvp
mr.DIMAS
Спасибо большое за ссылки и за код! Буду думать и пробовать

#14
14:03, 2 фев 2015

8Observer8
У вас проблема в том, что вы не разобрались в работе OpenGL в Qt.

У вас события обновления OpenGL происходит от сигнала от кнопки, а нужно делать от таймера.
А сигнал кнопки использовать именно для приращения координат по dT.

Почитайте это для начала:
http://www.gamedev.ru/code/articles/OpenGL_Qt4
http://www.gamedev.ru/code/articles/opengl_qt4_part2

Идея реализации не отличается если используете Qt5.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.