Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Движение объекта в четко заданных временных рамках

Движение объекта в четко заданных временных рамках

Поделиться
DurianOdourНовичокwww27 окт. 201712:23#0
Здравствуйте, я только начинающий.

Возник такой вопрос. Задача стоит в том чтобы объект двигался по времени, в зависимости от того какое время поставили. К примеру.

Есть шарик. В настройках поставили, что игровое время 40 секунд и всего шарик должен сделать 10 полных проходов пути (туда и обратно).

То есть считаем. Шарик должен пройти 1 проход (от 1 стенки к другой и обратно) за 40/10=4 секунды.

Теперь собственно как это реализовать ?

Если нельзя быть уверенным, в том что какой-то определенный фреймрейт будет.

К примеру 1 цикл игры (отрисовка и вычисление) происходит за 30мс. Соответственно можно посчитать.

4000/30 = 133 это у нас количество циклов для прохождения. Теперь допустим полное расстояние от 1 стенки к другой 1000px. Чтобы шарик сделал полный проходу нужно 2000px.

Соответственно - 2000/133 = 15, то есть каждую итерацию шарик должен проходить + 15px.

Это все хорошо, но как сделать в случае если фрейм рейт не известен + если он меняется часто и нужно коррелировать.

Желательно точно чтобы выходило время заданное в настройках. Подскажите пожалуйста алгоритм или просто идеи как это реализовать можно ?

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

Пробовал через синус сделать, но не получилось.

        distance = gameUpdateStateBundle.getGameScreen().getHeight();
        double timeElapsed = gameUpdateStateBundle.getTimeElapsed();
        double gameTime = gameUpdateStateBundle.getGameTime();
        double sin = (Math.sin((float) gameTime * Math.PI * 2f / (float) timeElapsed - Math.PI / 2f) + 1f) / 2f;
        Logger.error("SIN " + sin);
        mCenterX += (mVelocityVector.x * timeElapsed);
        mCenterY = (float) (distance * sin);

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

Спасибо

eugenelozaПостоялецwww27 окт. 201712:33#1
DurianOdour
> Если нельзя быть уверенным, в том что какой-то определенный фреймрейт будет.
Тут есть несколько подводных камней, но для начала можно ограничиться:
v := S/T;
x := v*t; (или dx := v*dt, где dt - абсолютное время фрейма)
if x>10 then begin
  v := -v;
  x := 20-x;
end
else
if x<0 then begin
  v := -v;
  x := -x;
end;
и хватит.
Хотя, если
> 40 секунд и всего шарик должен сделать 10 полных проходов пути
то
x := 10 * t mod 10;
это не правильно, но все ифы выписывать влом - суть в том, что просто привязать х шарика ко времени напрямую, тогда даже фреймрейт меньше единицы не страшен.
KumoKairoПостоялецwww27 окт. 201712:44#2
Если нельзя быть уверенным, в том что какой-то определенный фреймрейт будет.

А фреймрейт и не нужен. У вас есть аналитическая формула определения текущего положения по "глобальному" времени. В каждом кадре в эту формулу просто вставляете текущее пройденное время с начала движения и получаете правильную позицию. В 2007 или в 2006 году читал офигенную книжку "Секреты разработки игр в Macromedia Flash MX", и автор там показывал решение подобной проблемы на примере с бильярдными шарами. Аналитическое определение столкновений зная траекторию, скорость и радиус шаров. Эту книжку наверняка можно найти и скачать без проблем, очень советую посмотреть этот раздел про бильярдные шары, это именно то что вам нужно.

Правка: 27 окт. 2017 13:19

DurianOdourНовичокwww27 окт. 201713:33#3
Спасибо большое за ответы , но у меня данная формула некорректно отрабатывает, как мне подсказали нужно ограничить синус от 0 до 1. Но честно говоря не особо понимаю как она работает.

Можете пожалуйста подсказать формулу чтобы применить для получения четкой позиции объекта на поле по полному времени прошедшему от начала.

Можно конечно посчитать просто по кусочкам временным и замапить их четко на позицию, но это костыль

Буду очень благодарен

Правка: 27 окт. 2017 13:34

Iron ManПостоялецwww27 окт. 201714:50#4
eugeneloza
Блин, Дельфи :(((( у меня от него глаз выпадает, как и от Шарпов!
DurianOdourНовичокwww27 окт. 201719:22#5
Что-то не выходит все равно нормально сделать функцию, чтобы четко определяла положение по времени общему. Натолкните хотя бы на идеи. Хочу просто сделать нормально.

Спасибо

glasmПользовательwww27 окт. 201719:28#6
DurianOdour
пример на Javascript с линейной и плавной интерполяциями:
+ Показать
DurianOdourНовичокwww27 окт. 201719:45#7
glasm

Спасибо Вам огромное, работает отлично.

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


З.Ы.

Можете пожалуйста дурному растолковать, что за техника для плавного перемещения Вам была применена ?

glasmПользовательwww27 окт. 201721:42#8
DurianOdour
> чтобы четко определяла положение по времени игровому
наверное запутал, но t0 используется только для определения игрового времени dt, дальше расчёт от игрового времени
добавил задержку:
+ Показать

> что за техника для плавного перемещения
smoothstep
DurianOdourНовичокwww28 окт. 20171:28#9
glasm

Спасибо Вам огромное за такое подробное объяснение кода! Буду разбираться !

Правка: 28 окт. 2017 1:28

/ Форум / Программирование игр / Физика

2001—2017 © GameDev.ru — Разработка игр