package gl8080.physics.domain;
import java.util.Objects;
public class Time {
private final World world;
private static final double FRAME_LATE = 1.0 / 30.0;
private boolean isContinued = true;
private int speed;
private Runnable tick = () -> {};
public Time(World world, int speed) {
Objects.requireNonNull(world);
this.world = world;
this.speed = speed;
}
public Time(World world) {
this(world, 1);
}
public void start() {
while (this.isContinued) {
long s = System.currentTimeMillis();
for (int i=0; i<this.speed; i++) {
this.world.next(FRAME_LATE);
}
long time = System.currentTimeMillis() - s;
this.tick.run();
if (FRAME_LATE * 1000 < time) {
// 計算に sleep する時間以上かかっている場合は、 sleep 省略
continue;
}
this.sleep(FRAME_LATE);
}
}
public void setTick(Runnable tick) {
Objects.requireNonNull(tick);
this.tick = tick;
}
public void stop() {
this.isContinued = false;
}
private void sleep(double sec) {
try {
Thread.sleep((long)(sec * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}