Плавное перемещение объектов с заданой скоростью
| |
8Observer8 | Дата: Понедельник, 02 Февраля 2015, 13:15 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Привет
Никак не могу придумать, как перемещать объект с постоянной скоростью. У меня есть объект, который перемещается с помощью стрелок. При удержании клавиши объект будет плавно перемещаться с определённой скоростью. Подскажите идеи, как это можно реализовать?
Что-то вроде: я нажимаю кнопку -> запускается время -> объект перемещается на шаг -> сцена перерисовывается. Напишите логику на псевдокоде
На всякий случай, использую фреймворк Qt и OpenGL, но мне хочется почитать общие идеи, как сделать плавное перемещение. Объект у меня есть, но он движется отрывисто. Я могу менять скорость, но мой вариант меня не устраивает. Вот exe для Win7
На данный момент у меня логика такая:
- запускаю часы в милисекундах - при нажатии на кнопку, я считываю количество милисекунд в переменную t и перезапускаю таймер - я заметил, что если не отпускать кнопку, то t будет примерно равна 38 мсек - Если t больше 100 мсек, я выхожу из функции обработки нажатия клавиши, в противном случае, я перемещаю объект на 0.1 * t
|
|
| |
last2424 | Дата: Понедельник, 02 Февраля 2015, 13:49 | Сообщение # 2 |
30 мл. блоков
Сейчас нет на сайте
| 8Observer8, ничего не понял? Почему нельзя ежесекундно прибавлять скорость?
Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
|
|
| |
CaptainHunt | Дата: Понедельник, 02 Февраля 2015, 14:13 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| У меня плавно перемещается. Только стартует (в т.ч. после остановки) не сразу, где-то через 0.5 - 1 секунду.
WorldSim3D: сделай 3D игру на С++/FreeBasic/D для PC Windows/Linux. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain! Ознакомиться
Сообщение отредактировал Tyr_Anassazi - Понедельник, 02 Февраля 2015, 14:13 |
|
| |
8Observer8 | Дата: Понедельник, 02 Февраля 2015, 18:31 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Цитата Tyr_Anassazi ( ) У меня плавно перемещается. Только стартует (в т.ч. после остановки) не сразу, где-то через 0.5 - 1 секунду Пока не придумал, как убрать задержку. Мне всё же кажется, что объект движется с небольшими рывками
Цитата last2424 ( ) 8Observer8, ничего не понял? Почему нельзя ежесекундно прибавлять скорость? В общем ситуация такая. У меня есть часы, которые тикаю миллисекундами. Есть функция инициализации, в которой я запускаю часы. Есть обработчик кнопки, то есть функция, которая срабатывает, когда я нажимаю на кнопку. В этом обработчике я меняю положение объекта на небольшой шаг и вызываю фукнцию для перерисовки
Позже подробнее напишу, кая я делаю и мысли по поводу движения
|
|
| |
CaptainHunt | Дата: Понедельник, 02 Февраля 2015, 20:00 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Цитата Есть функция инициализации, в которой я запускаю часы. Есть обработчик кнопки, то есть функция, которая срабатывает, когда я нажимаю на кнопку. В этом обработчике я меняю положение объекта на небольшой шаг и вызываю фукнцию для перерисовки Возможно, из-за такого алгоритма система (главный цикл) не успевает отрисовывать (рендерить) сцену, а именно движущийся объект каждую 1/60 сек. Для плавного отображения, как известно отрисовка должна происходить каждую 1/60 сек. или около того; но вероятно, по какой-то причине этого не происходит, насколько можно судить по описанию алгоритма, например, если функция перерисовки находится внутри этого обработчика. На движке, котором я работаю, отрисовка сцены находится в главном цикле, а не внутри других циклов, поэтому рендеринг плавный, если не мешают др. факторы.
WorldSim3D: сделай 3D игру на С++/FreeBasic/D для PC Windows/Linux. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain! Ознакомиться
Сообщение отредактировал Tyr_Anassazi - Понедельник, 02 Февраля 2015, 20:04 |
|
| |
8Observer8 | Дата: Понедельник, 02 Февраля 2015, 23:08 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| На фреймворке, с которым я работаю, уже есть специальный класс для рисования. Там принцип такой: есть функция для инициализации, которая вызывается один раз. Есть resizeGL(), которая вызывается, когда пользователь меняет размер окна. Есть функция paintGL(), которая вызывается гарантированно, когда это нужно (например, её вызывает автоматически resizeGL()). Функцию paintGL() можно вызвать самому с помощью вызова update(). Например, если я изменил координаты объекта, то я должен вызвать update()
Ещё у меня есть функция-обработчик нажатия кнопки, который вызывается автоматически, когда я нажал клавишу. В ней я меняю координаты объекта и вызываю update(), которая вызывает paintGL()
Я могу создать таймер. Или часы (в милисекундах) запустить в функции инициализации
Заметил, что если я нажму клавишу и буду держать, то обработчик вызывается, примерно, каждые 38 милисекунд. Я подозреваю, что на разных машинах будет разное время
Мне просто логика нужна. Может общие время должно считаться, а я должен считать дельту. Каша в голове, нужно поспать
|
|
| |
Archido | Дата: Вторник, 03 Февраля 2015, 12:15 | Сообщение # 7 |
Сэнсэй
Сейчас нет на сайте
| Цитата 8Observer8 ( ) Заметил, что если я нажму клавишу и буду держать, то обработчик вызывается, примерно, каждые 38 милисекунд. Я подозреваю, что на разных машинах будет разное время Конечно так и будет, нужно считать время между кадрами (та самая дельта) и использовать его при расчетах в апдейте. А чтобы все было чуть более плавно можно вместо конечной дельты брать некое среднее арифметическое, используя результаты дельт из предыдущих кадров.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
8Observer8 | Дата: Вторник, 03 Февраля 2015, 20:06 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Цитата Archido ( ) нужно считать время между кадрами (та самая дельта) Что такое "время между кадрами"?Добавлено (03 февраля 2015, 20:06) --------------------------------------------- Дело в том что у меня обновление по автомату (например, свернули и развернули окно) и когда изменили координаты объекта при нажатии на клавишу
|
|
| |
|