fps multiplier and better gameobject lifecycle

pull/1/head
Bronwen 2023-01-02 14:48:20 -05:00
parent 51eb964d49
commit 8d3535da55
5 changed files with 35 additions and 13 deletions

View File

@ -29,14 +29,19 @@ public abstract class Game {
scene.render();
}
public void update() {
scene.update(0);
private static final float ns240 = 1_000_000_000f / 240f;
protected float dTime = 0;
public void update() {
long nanoTime = System.nanoTime();
float elapsed = nanoTime - lastFrame;
dTime = elapsed / ns240;
lastFrame = nanoTime;
scene.update(dTime);
// average framerate
averageFPS = lerp(averageFPS, 1_000_000_000f / (nanoTime - lastFrame), (nanoTime - lastFrame) / 1_000_000_000f);
lastFrame = nanoTime;
averageFPS = lerp(averageFPS, 1_000_000_000f / (elapsed), (elapsed) / 1_000_000_000f);
framesSinceKeyframe ++;
if(nanoTime > lastKeyframe + 1_000_000_000) {

View File

@ -6,6 +6,8 @@ import java.util.List;
public class GameObject implements IRenderable, ITickable, Serializable {
private transient SceneGraph scene;
private boolean created = false;
public void link(SceneGraph scene) {
this.scene = scene;
}
@ -43,7 +45,21 @@ public class GameObject implements IRenderable, ITickable, Serializable {
@Override
public void update(float dTime) {}
public void start() {}
// connect is solely for ensuring links to other objects. get() and getAll()
protected void connect() {}
// create is guaranteed to only run once for an object, even after save/load
protected void create() {}
// start is called any time the object is added to a scene
protected void start() {}
public final void addedToScene() {
connect();
if(!created) {
create();
created = true;
}
start();
}
protected void remove(GameObject obj) {
scene.remove(obj);

View File

@ -112,7 +112,7 @@ public abstract class SceneGraph implements IScene {
}
for(GameObject obj : objects) {
obj.start();
obj.addedToScene();
}
}
@ -136,7 +136,7 @@ public abstract class SceneGraph implements IScene {
public void add(GameObject obj) {
newObjects.add(obj);
obj.link(this);
obj.start();
obj.addedToScene();
}
public void remove(GameObject obj) {
@ -207,7 +207,7 @@ public abstract class SceneGraph implements IScene {
objects.addAll(newObjects);
for(GameObject obj : objects) obj.link(this);
for(GameObject obj : objects) obj.start();
for(GameObject obj : objects) obj.addedToScene();
} catch (Exception e) {
e.printStackTrace();
}

View File

@ -44,14 +44,15 @@ public class HadeanGame extends Game {
long allocated = runtime.totalMemory();
long max = runtime.maxMemory();
int left = 800;
int left = 780;
int top = 10;
List<String> strings = new ArrayList<String>();
strings.add("DEBUG");
strings.add("FPS: " + Math.round(averageFPS) + "/" + measuredFPS + " | AVG/MEASURED");
strings.add("Mouse: <" + App.mouseX + ", " + App.mouseY + ">");
strings.add("=== [ DEBUG ] ===");
strings.add("FPS: " + Math.round(averageFPS) + "/" + measuredFPS + " | AVG/MEASURED");
strings.add("Mouse: <" + App.mouseX + ", " + App.mouseY + ">");
strings.add("MEMORY: " + (int)((allocated / (double)max) * 100) + "% (" + (allocated / (1024 * 1024)) + "/" + (max / (1024 * 1024)) + "MB)");
strings.add("dTime: " + dTime);
for(String str : strings) {
Assets.flat.pushColor(Vector4f.black);

View File

@ -51,7 +51,7 @@ public abstract class Agent extends WorldObject implements ISelectable {
@Override
public void start() {
super.start();
frameCounter = speed;
frameCounter = 0;
pathfinder = new AStarPathfinder(terrain);
}