diff --git a/src/main/java/xyz/valnet/engine/Game.java b/src/main/java/xyz/valnet/engine/Game.java index 4ba06a1..fe9055f 100644 --- a/src/main/java/xyz/valnet/engine/Game.java +++ b/src/main/java/xyz/valnet/engine/Game.java @@ -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) { diff --git a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java index 641a90e..b1a3424 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java @@ -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); diff --git a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java index d89b962..6104026 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java @@ -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(); } diff --git a/src/main/java/xyz/valnet/hadean/HadeanGame.java b/src/main/java/xyz/valnet/hadean/HadeanGame.java index 9a880be..086196c 100644 --- a/src/main/java/xyz/valnet/hadean/HadeanGame.java +++ b/src/main/java/xyz/valnet/hadean/HadeanGame.java @@ -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 strings = new ArrayList(); - 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); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java index 089eadb..e79681c 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java @@ -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); }