From 175d57290353ea8581d2992ae50341aa77f01aa0 Mon Sep 17 00:00:00 2001 From: Ivory Date: Mon, 30 Jan 2023 00:30:59 -0500 Subject: [PATCH] pausing --- .../valnet/engine/scenegraph/GameObject.java | 4 ++ .../xyz/valnet/engine/scenegraph/IPauser.java | 5 +++ .../valnet/engine/scenegraph/ITickable.java | 1 + .../valnet/engine/scenegraph/SceneGraph.java | 38 ++++++++++++++++++- .../hadean/gameobjects/SelectionUI.java | 2 +- .../inputlayer/SelectionLayer.java | 1 + .../hadean/gameobjects/ui/tabs/MenuTab.java | 23 +++++++---- .../hadean/gameobjects/ui/tabs/Tab.java | 2 +- .../java/xyz/valnet/hadean/input/Button.java | 7 +--- 9 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 src/main/java/xyz/valnet/engine/scenegraph/IPauser.java diff --git a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java index 81401b6..cf7bcb2 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java @@ -81,4 +81,8 @@ public class GameObject implements IRenderable, ITickable, Serializable { protected boolean getKey(int key) { return scene.getKey(key); } + + protected boolean isPaused() { + return scene.isPaused(); + } } diff --git a/src/main/java/xyz/valnet/engine/scenegraph/IPauser.java b/src/main/java/xyz/valnet/engine/scenegraph/IPauser.java new file mode 100644 index 0000000..88e2cbb --- /dev/null +++ b/src/main/java/xyz/valnet/engine/scenegraph/IPauser.java @@ -0,0 +1,5 @@ +package xyz.valnet.engine.scenegraph; + +public interface IPauser { + public boolean isPaused(); +} diff --git a/src/main/java/xyz/valnet/engine/scenegraph/ITickable.java b/src/main/java/xyz/valnet/engine/scenegraph/ITickable.java index fbbc58d..7da5b51 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/ITickable.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/ITickable.java @@ -2,4 +2,5 @@ package xyz.valnet.engine.scenegraph; public interface ITickable { public void update(float dTime); + public default void fixedUpdate(float dTime) {} } diff --git a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java index 531b3ec..6628a2c 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java @@ -72,9 +72,24 @@ public abstract class SceneGraph implements IScene { if(saveFlag) save(); if(loadFlag) load(); - // TICK OBJECTS + paused = false; + for(IPauser pauser : pausers) { + if(pauser.isPaused()) { + paused = true; + break; + } + } + + if(!paused) { + // TICK OBJECTS + for(GameObject obj : objects) { + obj.update(dTime); + } + } + + // fixed TICK OBJECTS for(GameObject obj : objects) { - obj.update(dTime); + obj.fixedUpdate(dTime); } mouseUpdate(); @@ -114,10 +129,20 @@ public abstract class SceneGraph implements IScene { } } + private boolean paused = false; + + public boolean isPaused() { + return paused; + } + @Override public void enable() { this.construct(); + for(GameObject obj : objects) { + addObjectToCache(obj); + } + for(GameObject obj : objects) { obj.link(this); } @@ -144,10 +169,19 @@ public abstract class SceneGraph implements IScene { objects.clear(); } + private Set pausers = new HashSet(); + public void add(GameObject obj) { newObjects.add(obj); obj.link(this); obj.addedToScene(); + addObjectToCache(obj); + } + + private void addObjectToCache(GameObject obj) { + if(obj instanceof IPauser) { + pausers.add((IPauser) obj); + } } public void remove(GameObject obj) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java index c11f0dc..9dffa06 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java @@ -56,7 +56,7 @@ public class SelectionUI extends ImmediateUI implements ISelectionChangeListener } @Override - public void update(float dTime) { + public void fixedUpdate(float dTime) { openness = lerp(openness, opened ? 1 : 0, dTime / Constants.animationSpeed); if(newSelection != null) { selectionManager.updateSelection(newSelection); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java index abf561b..6cb0bd1 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java @@ -197,6 +197,7 @@ public class SelectionLayer extends GameObject implements IMouseCaptureArea, ITr @Override public void mouseDown(int button) { if(!active) return; + if(isPaused()) return; if(button == 0) { if(initialCoords == null) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/MenuTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/MenuTab.java index 5f20120..c773171 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/MenuTab.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/MenuTab.java @@ -1,9 +1,11 @@ package xyz.valnet.hadean.gameobjects.ui.tabs; -public class MenuTab extends Tab { +import xyz.valnet.engine.scenegraph.IPauser; + +public class MenuTab extends Tab implements IPauser { private int width = 300; - private int height = 6 * 32 + 9 * 8; + private int height = 6 * 32 + 1 * 16 + 6 * 8 + 2 * 24; @Override protected void onClose() { @@ -18,12 +20,14 @@ public class MenuTab extends Tab { @Override protected void gui() { window(1024 / 2 - width / 2, animate(-height - 50, 576 / 2 - height / 2), width, height, () -> { + text(" === Paused ==="); + space(8); + if(button("Resume")) { + close(); + } + space(24); if(button("Options")) { - } - space(8); - if(button("Debug")) { - get(DebugTab.class).open(); } space(8); if(button("Save")) { @@ -36,7 +40,7 @@ public class MenuTab extends Tab { close(); } space(24); - if(button("Main Menu")) { + if(button("Quit to Menu")) { } space(8); @@ -51,4 +55,9 @@ public class MenuTab extends Tab { return "Menu"; } + @Override + public boolean isPaused() { + return opened; + } + } \ No newline at end of file diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/Tab.java b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/Tab.java index e905956..ca705b7 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/Tab.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/Tab.java @@ -21,7 +21,7 @@ public abstract class Tab extends ImmediateUI implements IBottomBarItem, ITransi private ExclusivityManager exclusivityManager; @Override - public void update(float dTime) { + public void fixedUpdate(float dTime) { animation = lerp(animation, opened ? 1 : 0, dTime / Constants.animationSpeed); } diff --git a/src/main/java/xyz/valnet/hadean/input/Button.java b/src/main/java/xyz/valnet/hadean/input/Button.java index 82fb046..2f30861 100644 --- a/src/main/java/xyz/valnet/hadean/input/Button.java +++ b/src/main/java/xyz/valnet/hadean/input/Button.java @@ -8,7 +8,6 @@ import xyz.valnet.engine.graphics.Color; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Tile9; import xyz.valnet.engine.math.Box; -import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4i; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.IMouseCaptureArea; @@ -125,12 +124,8 @@ public class Button extends GameObject implements IMouseCaptureArea, ITransient private IButtonListener listener = null; - public void update() { - update(1); - } - @Override - public void update(float dTime) { + public void fixedUpdate(float dTime) { box.x = x - (int)hPad; box.y = y - (int)vPad; box.z = width + ((int)hPad) * 2;