From a297661118bd843e98f74a251b583e608621c17d Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Sat, 7 May 2022 13:12:08 +0200 Subject: [PATCH] Add `destroy` method to entity and components --- .../yes/yes/behaviours/ConveyorBehaviour.java | 5 ++++ .../yes/behaviours/GeneratorBehaviour.java | 5 ++++ .../com/yes/yes/behaviours/ItemBehaviour.java | 10 +++++-- .../yes/yes/behaviours/OfferBehaviour.java | 10 +++++-- .../yes/yes/behaviours/PlaceBehaviour.java | 5 ++++ .../yes/yes/behaviours/RecieveBehaviour.java | 10 +++++-- .../com/yes/yes/behaviours/TestBehaviour.java | 7 ++++- .../com/yes/yes/managers/GameManager.java | 4 +-- .../java/com/yes/yes/utils/Component.java | 1 + src/main/java/com/yes/yes/utils/Entity.java | 28 +++++++++++++------ .../java/com/yes/yes/utils/EventHandler.java | 16 +++++------ .../com/yes/yes/utils/GlobalEventHandler.java | 8 +++--- src/main/java/com/yes/yes/world/Chunk.java | 6 +++- 13 files changed, 84 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/yes/yes/behaviours/ConveyorBehaviour.java b/src/main/java/com/yes/yes/behaviours/ConveyorBehaviour.java index 29d996d..a04d6aa 100644 --- a/src/main/java/com/yes/yes/behaviours/ConveyorBehaviour.java +++ b/src/main/java/com/yes/yes/behaviours/ConveyorBehaviour.java @@ -44,4 +44,9 @@ public class ConveyorBehaviour extends Component { isConveyed = false; } } + + @Override + public void destroy() { + + } } diff --git a/src/main/java/com/yes/yes/behaviours/GeneratorBehaviour.java b/src/main/java/com/yes/yes/behaviours/GeneratorBehaviour.java index 26036ab..fdf00cb 100644 --- a/src/main/java/com/yes/yes/behaviours/GeneratorBehaviour.java +++ b/src/main/java/com/yes/yes/behaviours/GeneratorBehaviour.java @@ -26,4 +26,9 @@ public class GeneratorBehaviour extends Component { this.parent.setData(dataKey, item.clone()); System.out.println("generate"); } + + @Override + public void destroy() { + + } } diff --git a/src/main/java/com/yes/yes/behaviours/ItemBehaviour.java b/src/main/java/com/yes/yes/behaviours/ItemBehaviour.java index d8aa829..6545507 100644 --- a/src/main/java/com/yes/yes/behaviours/ItemBehaviour.java +++ b/src/main/java/com/yes/yes/behaviours/ItemBehaviour.java @@ -23,14 +23,15 @@ public class ItemBehaviour extends Component { System.out.println("Running item update"); Platform.runLater(() -> { this.itemGroup.getChildren().clear(); - this.itemGroup.getChildren().add(item); + if (item != null) + this.itemGroup.getChildren().add(item); }); System.out.println("Finished item update"); } @Override public void initialize() { - parent.addListener(dataKey + "Changed", this::itemChanged); + parent.addListener(dataKey + "Changed", this, this::itemChanged); itemGroup = new VBox(); itemGroup.setAlignment(Pos.CENTER); @@ -45,4 +46,9 @@ public class ItemBehaviour extends Component { public void update() { System.out.println("Destroyed:" + parent.getData("destroyed")); } + + @Override + public void destroy() { + parent.removeListener(dataKey + "Changed", this, this::itemChanged); + } } diff --git a/src/main/java/com/yes/yes/behaviours/OfferBehaviour.java b/src/main/java/com/yes/yes/behaviours/OfferBehaviour.java index 82409ca..e19fcf5 100644 --- a/src/main/java/com/yes/yes/behaviours/OfferBehaviour.java +++ b/src/main/java/com/yes/yes/behaviours/OfferBehaviour.java @@ -47,8 +47,8 @@ public class OfferBehaviour extends Component { e.printStackTrace(); } - this.parent.addListener("itemAccepted", this::itemAccepted); - this.parent.addListener("placed", this::placed); + this.parent.addListener("itemAccepted", this, this::itemAccepted); + this.parent.addListener("placed", this,this::placed); } @Override @@ -60,4 +60,10 @@ public class OfferBehaviour extends Component { this.receiver.trigger("offerItem", item); } + + @Override + public void destroy() { + this.parent.removeListener("itemAccepted", this, this::itemAccepted); + this.parent.removeListener("placed", this,this::placed); + } } diff --git a/src/main/java/com/yes/yes/behaviours/PlaceBehaviour.java b/src/main/java/com/yes/yes/behaviours/PlaceBehaviour.java index f546fec..6b37193 100644 --- a/src/main/java/com/yes/yes/behaviours/PlaceBehaviour.java +++ b/src/main/java/com/yes/yes/behaviours/PlaceBehaviour.java @@ -30,4 +30,9 @@ public class PlaceBehaviour extends Component { public void update() { } + + @Override + public void destroy() { + + } } diff --git a/src/main/java/com/yes/yes/behaviours/RecieveBehaviour.java b/src/main/java/com/yes/yes/behaviours/RecieveBehaviour.java index 0182717..dc29949 100644 --- a/src/main/java/com/yes/yes/behaviours/RecieveBehaviour.java +++ b/src/main/java/com/yes/yes/behaviours/RecieveBehaviour.java @@ -36,8 +36,8 @@ public class RecieveBehaviour extends Component { e.printStackTrace(); } - this.parent.addListener("offerItem", this::receive); - this.parent.addListener("placed", this::placed); + this.parent.addListener("offerItem", this, this::receive); + this.parent.addListener("placed", this, this::placed); } void receive(Item item) { @@ -54,4 +54,10 @@ public class RecieveBehaviour extends Component { } + @Override + public void destroy() { + this.parent.removeListener("offerItem", this, this::receive); + this.parent.removeListener("placed", this, this::placed); + } + } diff --git a/src/main/java/com/yes/yes/behaviours/TestBehaviour.java b/src/main/java/com/yes/yes/behaviours/TestBehaviour.java index b534ad6..2939497 100644 --- a/src/main/java/com/yes/yes/behaviours/TestBehaviour.java +++ b/src/main/java/com/yes/yes/behaviours/TestBehaviour.java @@ -17,7 +17,7 @@ public class TestBehaviour extends Component { @Override public void initialize() { - parent.addListener("placed", this::onNeighborPlaced); + parent.addListener("placed", this, this::onNeighborPlaced); } @Override @@ -38,4 +38,9 @@ public class TestBehaviour extends Component { } }*/ } + + @Override + public void destroy() { + parent.removeListener("placed", this, this::onNeighborPlaced); + } } diff --git a/src/main/java/com/yes/yes/managers/GameManager.java b/src/main/java/com/yes/yes/managers/GameManager.java index fdaffa1..68b0a35 100644 --- a/src/main/java/com/yes/yes/managers/GameManager.java +++ b/src/main/java/com/yes/yes/managers/GameManager.java @@ -55,9 +55,9 @@ public class GameManager { System.out.println("Finished tick!"); }, 0, 1, TimeUnit.SECONDS); - GlobalEventHandler.addListener("timerTick", (__) -> { + GlobalEventHandler.addListener("timerTick", this, (__) -> { System.out.println("Tick!"); }); - GlobalEventHandler.addListener("closing", (__) -> executor.shutdown()); + GlobalEventHandler.addListener("closing", this, (__) -> executor.shutdown()); } } diff --git a/src/main/java/com/yes/yes/utils/Component.java b/src/main/java/com/yes/yes/utils/Component.java index 104becd..b263e11 100644 --- a/src/main/java/com/yes/yes/utils/Component.java +++ b/src/main/java/com/yes/yes/utils/Component.java @@ -12,4 +12,5 @@ public abstract class Component { public abstract void initialize(); public abstract void update(); + public abstract void destroy(); } diff --git a/src/main/java/com/yes/yes/utils/Entity.java b/src/main/java/com/yes/yes/utils/Entity.java index e1839b1..9904c42 100644 --- a/src/main/java/com/yes/yes/utils/Entity.java +++ b/src/main/java/com/yes/yes/utils/Entity.java @@ -12,7 +12,7 @@ public abstract class Entity extends javafx.scene.Group { private int rotation; public Entity() { - GlobalEventHandler.addListener("timerTick", (__) -> update()); + GlobalEventHandler.addListener("timerTick", this, (__) -> update()); } public final void addBehaviour(Component behaviour) { @@ -21,9 +21,13 @@ public abstract class Entity extends javafx.scene.Group { public final void removeBehaviour(Component behaviour) { ArrayList components = new ArrayList<>(); - for (Component b : behaviours) { - if (!b.getClass().equals(behaviour.getClass())) { - components.add(b); + for (Component component : behaviours) { + if (!component.getClass().equals(behaviour.getClass())) { + components.add(component); + } + else + { + component.destroy(); } } behaviours = components; @@ -41,6 +45,14 @@ public abstract class Entity extends javafx.scene.Group { behaviours.forEach(Component::initialize); } + public final void destroy() + { + GlobalEventHandler.removeListener("timerTick",this, (__) -> update()); + for (Component component : behaviours) { + component.destroy(); + } + } + public final void setData(String key, Object value) { data.put(key, value); } @@ -49,12 +61,12 @@ public abstract class Entity extends javafx.scene.Group { return (T) data.get(key); } - public final void addListener(String eventName, Consumer function) { - handler.addListener(eventName, function); + public final void addListener(String eventName, Object object, Consumer function) { + handler.addListener(eventName, object, function); } - public final void removeListener(String eventName, Consumer function) { - handler.removeListener(eventName, function); + public final void removeListener(String eventName, Object object, Consumer function) { + handler.removeListener(eventName, object, function); } public final void trigger(String eventName, Object parameter) { diff --git a/src/main/java/com/yes/yes/utils/EventHandler.java b/src/main/java/com/yes/yes/utils/EventHandler.java index b9c519d..055516e 100644 --- a/src/main/java/com/yes/yes/utils/EventHandler.java +++ b/src/main/java/com/yes/yes/utils/EventHandler.java @@ -1,34 +1,32 @@ package com.yes.yes.utils; -import java.util.ArrayList; import java.util.HashMap; import java.util.function.Consumer; -import java.util.function.Function; public class EventHandler { - private final HashMap>> events = new HashMap<>(); + private final HashMap>> events = new HashMap<>(); - public void addListener(String eventName, Consumer function) { + public void addListener(String eventName, Object object, Consumer function) { if (!events.containsKey(eventName)) { - events.put(eventName, new ArrayList<>()); + events.put(eventName, new HashMap<>()); } - events.get(eventName).add((e) -> function.accept((T) e)); + events.get(eventName).put(object, (e) -> function.accept((T) e)); } - public void removeListener(String eventName, Consumer function) throws IllegalArgumentException { + public void removeListener(String eventName, Object object, Consumer function) throws IllegalArgumentException { //NOTE: This needs to be called otherwise memory leak if (!events.containsKey(eventName)) { throw new IllegalArgumentException("Event " + eventName + " does not exist!"); } //noinspection SuspiciousMethodCalls - events.get(eventName).remove(function); + events.get(eventName).remove(object); } public void trigger(String eventName, T parameter) { if (events.containsKey(eventName)) { - events.get(eventName).forEach(e -> e.accept(parameter)); + events.get(eventName).values().forEach(e -> e.accept(parameter)); } } } diff --git a/src/main/java/com/yes/yes/utils/GlobalEventHandler.java b/src/main/java/com/yes/yes/utils/GlobalEventHandler.java index 2757b2a..64dd5ea 100644 --- a/src/main/java/com/yes/yes/utils/GlobalEventHandler.java +++ b/src/main/java/com/yes/yes/utils/GlobalEventHandler.java @@ -9,12 +9,12 @@ public class GlobalEventHandler { private GlobalEventHandler() { } - public static void addListener(String eventName, Consumer function) { - handler.addListener(eventName, function); + public static void addListener(String eventName, Object object, Consumer function) { + handler.addListener(eventName,object, function); } - public static void removeListener(String eventName, Consumer function) { - handler.removeListener(eventName, function); + public static void removeListener(String eventName, Object object, Consumer function) { + handler.removeListener(eventName, object, function); } public static void trigger(String eventName, Object parameter) { diff --git a/src/main/java/com/yes/yes/world/Chunk.java b/src/main/java/com/yes/yes/world/Chunk.java index 46107ec..d6e9e6d 100644 --- a/src/main/java/com/yes/yes/world/Chunk.java +++ b/src/main/java/com/yes/yes/world/Chunk.java @@ -45,7 +45,11 @@ public class Chunk extends GridPane { public void removeEntity(Coordinate pos) { Entity entity = getEntity(pos); - entity.setData("destroyed", true); + + if (entity != null) { + entity.setData("destroyed", true); + entity.destroy(); + } this.getChildren().remove(entity); data[pos.x + pos.y * CHUNK_SIZE] = null; }