From 22c4518675be5ce272af0e56dce3cd3c8aaef925 Mon Sep 17 00:00:00 2001 From: Valerie Date: Sat, 28 May 2022 22:15:18 -0400 Subject: [PATCH] new abstraction, scenegraph. moved to engine. refactor game code. --- .../valnet/engine/scenegraph/GameObject.java | 6 +- .../scenegraph/IMouseCaptureArea.java} | 4 +- .../valnet/engine/scenegraph/SceneGraph.java | 149 ++++++++++++++++++ .../valnet/hadean/gameobjects/Selection.java | 4 +- .../hadean/gameobjects/SelectionUI.java | 4 +- .../java/xyz/valnet/hadean/input/Button.java | 3 +- .../xyz/valnet/hadean/input/GOButton.java | 3 +- .../xyz/valnet/hadean/scenes/GameScene.java | 133 +--------------- 8 files changed, 165 insertions(+), 141 deletions(-) rename src/main/java/xyz/valnet/{hadean/input/IMouseListener.java => engine/scenegraph/IMouseCaptureArea.java} (75%) create mode 100644 src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java diff --git a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java index 809ea78..4ab30f1 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java @@ -2,12 +2,10 @@ package xyz.valnet.engine.scenegraph; import java.util.List; -import xyz.valnet.hadean.scenes.GameScene; - public class GameObject implements IRenderable, ITickable { - private GameScene scene; + private SceneGraph scene; - public void link(GameScene scene) { + public void link(SceneGraph scene) { this.scene = scene; } diff --git a/src/main/java/xyz/valnet/hadean/input/IMouseListener.java b/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java similarity index 75% rename from src/main/java/xyz/valnet/hadean/input/IMouseListener.java rename to src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java index 7a0fc58..3769ad2 100644 --- a/src/main/java/xyz/valnet/hadean/input/IMouseListener.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/IMouseCaptureArea.java @@ -1,8 +1,8 @@ -package xyz.valnet.hadean.input; +package xyz.valnet.engine.scenegraph; import xyz.valnet.engine.math.Vector4f; -public interface IMouseListener { +public interface IMouseCaptureArea { public void mouseEnter(); public void mouseLeave(); public boolean mouseDown(int button); diff --git a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java new file mode 100644 index 0000000..aaf47d0 --- /dev/null +++ b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java @@ -0,0 +1,149 @@ +package xyz.valnet.engine.scenegraph; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import xyz.valnet.engine.App; + +public abstract class SceneGraph implements IScene { + protected final List objects = new ArrayList(); + private final List newObjects = new ArrayList(); + private final List removeObjects = new ArrayList(); + + private IMouseCaptureArea hoveredMouseListener = null; + + public T get(Class clazz) { + for(GameObject obj : objects) { + if(clazz.isInstance(obj)) { + return clazz.cast(obj); + } + } + return null; + } + + public List getAll(Class clazz) { + List stuff = new ArrayList(); + for(GameObject obj : objects) { + if(clazz.isInstance(obj)) { + stuff.add(clazz.cast(obj)); + } + } + return stuff; + } + + @Override + public void update(float dTime) { + // ADD OBJECTS + if(!newObjects.isEmpty()) { + List added = new ArrayList(); + + for(GameObject obj : newObjects) { + objects.add(obj); + added.add(obj); + } + newObjects.clear(); + + for(GameObject obj : added) { + obj.start(); + } + } + + // REMOVE OBJECTS + if(!removeObjects.isEmpty()) { + for(GameObject obj : removeObjects) { + objects.remove(obj); + } + removeObjects.clear(); + } + + // TICK OBJECTS + for(GameObject obj : objects) { + obj.update(dTime); + } + + // DO MOUSE UPDATES! + List mouseListeners = getAll(IMouseCaptureArea.class); + mouseListeners.sort(new Comparator() { + @Override + public int compare(IMouseCaptureArea a, IMouseCaptureArea b) { + int al = a.getLayer(); + int bl = b.getLayer(); + return al < bl ? 1 : bl < al ? -1 : 0; + } + }); + for(IMouseCaptureArea listener : mouseListeners) { + boolean currentlyEntered = listener.getBox().contains(App.mouseX, App.mouseY); + if(currentlyEntered) { + if(listener != hoveredMouseListener) { + if(hoveredMouseListener != null) { + hoveredMouseListener.mouseLeave(); + } + hoveredMouseListener = listener; + listener.mouseEnter(); + } + break; + } else if(listener == hoveredMouseListener) { + // this is the one that is currently hovered, but it isnt! + // turn that shit OFF + hoveredMouseListener.mouseLeave(); + hoveredMouseListener = null; + } + } + } + + @Override + public void enable() { + this.construct(); + + for(GameObject obj : objects) { + obj.link(this); + } + + for(GameObject obj : objects) { + obj.start(); + } + } + + @Override + public void render() { + for(GameObject obj : objects) { + obj.render(); + } + } + + protected abstract void construct(); + + + @Override + public void disable() { + objects.clear(); + } + + public void add(GameObject obj) { + newObjects.add(obj); + obj.link(this); + } + + public void remove(GameObject obj) { + removeObjects.add(obj); + } + + public boolean inScene(GameObject gameObject) { + return objects.contains(gameObject); + } + + @Override + public void mouseDown(int button) { + for(IMouseCaptureArea iml : getAll(IMouseCaptureArea.class)) { + iml.mouseDown(button); + } + } + + @Override + public void mouseUp(int button) { + for(IMouseCaptureArea iml : getAll(IMouseCaptureArea.class)) { + iml.mouseUp(button); + } + } +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java b/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java index cf57b58..b9773d6 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java @@ -8,13 +8,13 @@ import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.engine.scenegraph.IMouseCaptureArea; import xyz.valnet.hadean.Layers; -import xyz.valnet.hadean.input.IMouseListener; import xyz.valnet.hadean.util.Assets; import static xyz.valnet.engine.util.Math.lerp; -public class Selection extends GameObject implements IMouseListener { +public class Selection extends GameObject implements IMouseCaptureArea { public Vector2f initialCoords; private Camera camera; diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java index 5fda511..08991bf 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java @@ -6,15 +6,15 @@ import java.util.List; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.engine.scenegraph.IMouseCaptureArea; import xyz.valnet.hadean.Layers; import xyz.valnet.hadean.input.Button; import xyz.valnet.hadean.input.IButtonListener; -import xyz.valnet.hadean.input.IMouseListener; import xyz.valnet.hadean.input.SimpleButton; import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Assets; -public class SelectionUI extends GameObject implements ISelectionChangeListener, IButtonListener, IMouseListener { +public class SelectionUI extends GameObject implements ISelectionChangeListener, IButtonListener, IMouseCaptureArea { private String name = ""; private int count = 0; diff --git a/src/main/java/xyz/valnet/hadean/input/Button.java b/src/main/java/xyz/valnet/hadean/input/Button.java index 3eba980..5c1c423 100644 --- a/src/main/java/xyz/valnet/hadean/input/Button.java +++ b/src/main/java/xyz/valnet/hadean/input/Button.java @@ -7,9 +7,10 @@ import xyz.valnet.engine.graphics.Tile9; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4i; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.engine.scenegraph.IMouseCaptureArea; import xyz.valnet.hadean.util.Assets; -public class Button extends GameObject implements IMouseListener { +public class Button extends GameObject implements IMouseCaptureArea { private int x, y, width, height; private String text; diff --git a/src/main/java/xyz/valnet/hadean/input/GOButton.java b/src/main/java/xyz/valnet/hadean/input/GOButton.java index 12ce414..522784a 100644 --- a/src/main/java/xyz/valnet/hadean/input/GOButton.java +++ b/src/main/java/xyz/valnet/hadean/input/GOButton.java @@ -3,9 +3,10 @@ package xyz.valnet.hadean.input; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.engine.scenegraph.IMouseCaptureArea; import xyz.valnet.hadean.util.Assets; -public class GOButton extends GameObject implements IMouseListener { +public class GOButton extends GameObject implements IMouseCaptureArea { private boolean hovered = false; public int layer = 1; diff --git a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java index 800f89b..741d2fb 100644 --- a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java +++ b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java @@ -6,7 +6,9 @@ import java.util.List; import xyz.valnet.engine.App; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.engine.scenegraph.IMouseCaptureArea; import xyz.valnet.engine.scenegraph.IScene; +import xyz.valnet.engine.scenegraph.SceneGraph; import xyz.valnet.hadean.gameobjects.BottomBar; import xyz.valnet.hadean.gameobjects.Camera; import xyz.valnet.hadean.gameobjects.Pawn; @@ -15,7 +17,6 @@ import xyz.valnet.hadean.gameobjects.SelectionUI; import xyz.valnet.hadean.gameobjects.Terrain; import xyz.valnet.hadean.gameobjects.tabs.ArchitectTab; import xyz.valnet.hadean.gameobjects.tabs.MenuTab; -import xyz.valnet.hadean.input.IMouseListener; // TODO BIG IDEAS // have caches of types that ill need (Like IMouseListener) @@ -26,106 +27,18 @@ import xyz.valnet.hadean.input.IMouseListener; // IE: all objects will be linked and able to be `get`ed // at their start call! :D -public class GameScene implements IScene { +public class GameScene extends SceneGraph { // generic - private List objects = new ArrayList(); - private List newObjects = new ArrayList(); - private List removeObjects = new ArrayList(); // private List renderables = new ArrayList(); - private IMouseListener hoveredMouseListener = null; // specific - public T get(Class clazz) { - for(GameObject obj : objects) { - if(clazz.isInstance(obj)) { - return clazz.cast(obj); - } - } - return null; - } - public List getAll(Class clazz) { - List stuff = new ArrayList(); - for(GameObject obj : objects) { - if(clazz.isInstance(obj)) { - stuff.add(clazz.cast(obj)); - } - } - return stuff; - } @Override - public void render() { - for(GameObject obj : objects) { - obj.render(); - } - } - - @Override - public void update(float dTime) { - // ADD OBJECTS - if(!newObjects.isEmpty()) { - List added = new ArrayList(); - - for(GameObject obj : newObjects) { - objects.add(obj); - added.add(obj); - } - newObjects.clear(); - - for(GameObject obj : added) { - obj.start(); - } - } - - // REMOVE OBJECTS - if(!removeObjects.isEmpty()) { - for(GameObject obj : removeObjects) { - objects.remove(obj); - } - removeObjects.clear(); - } - - // TICK OBJECTS - for(GameObject obj : objects) { - obj.update(dTime); - } - - // DO MOUSE UPDATES! - List mouseListeners = getAll(IMouseListener.class); - mouseListeners.sort(new Comparator() { - @Override - public int compare(IMouseListener a, IMouseListener b) { - int al = a.getLayer(); - int bl = b.getLayer(); - return al < bl ? 1 : bl < al ? -1 : 0; - } - }); - for(IMouseListener listener : mouseListeners) { - boolean currentlyEntered = listener.getBox().contains(App.mouseX, App.mouseY); - if(currentlyEntered) { - if(listener != hoveredMouseListener) { - if(hoveredMouseListener != null) { - hoveredMouseListener.mouseLeave(); - } - hoveredMouseListener = listener; - listener.mouseEnter(); - } - break; - } else if(listener == hoveredMouseListener) { - // this is the one that is currently hovered, but it isnt! - // turn that shit OFF - hoveredMouseListener.mouseLeave(); - hoveredMouseListener = null; - } - } - } - - @Override - public void enable() { + protected void construct() { objects.add(new Terrain()); for(int i = 0; i < 5; i ++) { objects.add(new Pawn()); @@ -138,45 +51,7 @@ public class GameScene implements IScene { objects.add(new ArchitectTab()); objects.add(new MenuTab()); - for(GameObject obj : objects) { - obj.link(this); - } - - for(GameObject obj : objects) { - obj.start(); - } } - @Override - public void disable() { - objects.clear(); - } - - public void add(GameObject obj) { - newObjects.add(obj); - obj.link(this); - } - - public void remove(GameObject obj) { - removeObjects.add(obj); - } - - public boolean inScene(GameObject gameObject) { - return objects.contains(gameObject); - } - - @Override - public void mouseDown(int button) { - for(IMouseListener iml : getAll(IMouseListener.class)) { - iml.mouseDown(button); - } - } - - @Override - public void mouseUp(int button) { - for(IMouseListener iml : getAll(IMouseListener.class)) { - iml.mouseUp(button); - } - } }