У меня есть программа, которая запускает метод tick()
для каждого кадра. Я хочу, чтобы объект падал в соответствии с установленной константой силы тяжести, поэтому я создал объект Ball
, который обновит свое положение до положения на предыдущем кадре минус скорость y. Скорость y будет уменьшаться на постоянную силы тяжести каждого клеща. Но падение слишком быстрое, потому что тики не переводят напрямую на секунды. Я думаю, что мне не хватает базовой математики, но я жонглирую так много переменных, что не вижу, что это такое.Как сделать время независимо от FPS?
EDIT: Добавлен код
@Override
public void run(){
init();
long lastTime=System.nanoTime(), timer=System.currentTimeMillis();
final double ticks=60.0;
double ns=1000000000/ticks, delta=0;
int updates=0, frames=0;
while(running){
long now=System.nanoTime();
delta+=(now-lastTime)/ns;
lastTime=now;
if(delta>=1){
tick();
updates++;
delta--;
}
render();
frames++;
if((System.currentTimeMillis()-timer)>1000){
timer+=1000;
System.out.println(updates+" ticks, FPS "+frames);
frame.setTitle("Ball -- "+SCALEWIDTH+"x"+SCALEHEIGHT+" at "+frames+" FPS");
updates=0;
frames=0;
}
}
stop();
}
Функция 'tick()' может возвращать временную дельта (время, прошедшее с последнего тика). Тогда вы можете использовать это при вычислении новой y-скорости. – freshtop
Мне кажется, мне нужно повторить программу. Он был изменен из учебника. В общих чертах, что я должен искать? Разделите частоту кадров на время между тиками, чтобы получить «в реальном времени»? – Insederec
Для Java вы ничего не делите. Вы просто вызываете 'System.nanotime()' и используете разницу, чтобы определить, сколько времени прошло с момента последнего вызова. Эта разница - ваш временной шаг. – markspace