From 39c3de7dcbe8085256648ca657c9cf87dbd5a473 Mon Sep 17 00:00:00 2001 From: Brychan Dempsey Date: Sat, 22 May 2021 19:17:37 +1200 Subject: [PATCH] Switched from using class literal to class --- .../App.java | 34 +++++++++---------- .../ComponentManager.java | 27 ++++++++------- .../ECS.java | 29 ++++++++-------- .../LogVec2DSystem.java | 2 +- .../PhysicsSystem.java | 6 ++-- .../SystemManager.java | 19 ++++++----- 6 files changed, 60 insertions(+), 57 deletions(-) diff --git a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/App.java b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/App.java index 990eb17..1f496e1 100644 --- a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/App.java +++ b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/App.java @@ -17,44 +17,44 @@ public final class App { public static void main(String[] args) throws InterruptedException { ECS gameEngine = new ECS(); System.out.println("Hello World!"); - gameEngine.registerComponent(Vec2D.class.getName()); - gameEngine.registerComponent(RidgidBody.class.getName()); - gameEngine.registerComponent(Gravity.class.getName()); + gameEngine.registerComponent(Vec2D.class); + gameEngine.registerComponent(RidgidBody.class); + gameEngine.registerComponent(Gravity.class); PhysicsSystem physicsSystem = new PhysicsSystem(gameEngine); - gameEngine.registerSystem(PhysicsSystem.class.getName(), physicsSystem); + gameEngine.registerSystem(PhysicsSystem.class, physicsSystem); { BitSet signature = new BitSet(); - signature.set(gameEngine.getComponentIndex(Gravity.class.getName())); - signature.set(gameEngine.getComponentIndex(Vec2D.class.getName())); - signature.set(gameEngine.getComponentIndex(RidgidBody.class.getName())); - gameEngine.setSystemSignature(PhysicsSystem.class.getName(), signature); + signature.set(gameEngine.getComponentIndex(Gravity.class)); + signature.set(gameEngine.getComponentIndex(Vec2D.class)); + signature.set(gameEngine.getComponentIndex(RidgidBody.class)); + gameEngine.setSystemSignature(PhysicsSystem.class, signature); } physicsSystem.init(); LogVec2DSystem logVec2DSystem = new LogVec2DSystem(gameEngine); - gameEngine.registerSystem(LogVec2DSystem.class.getName(), logVec2DSystem); + gameEngine.registerSystem(LogVec2DSystem.class, logVec2DSystem); { BitSet signature = new BitSet(); - signature.set(gameEngine.getComponentIndex(Gravity.class.getName())); - signature.set(gameEngine.getComponentIndex(Vec2D.class.getName())); - signature.set(gameEngine.getComponentIndex(RidgidBody.class.getName())); - gameEngine.setSystemSignature(LogVec2DSystem.class.getName(), signature); + signature.set(gameEngine.getComponentIndex(Gravity.class)); + signature.set(gameEngine.getComponentIndex(Vec2D.class)); + signature.set(gameEngine.getComponentIndex(RidgidBody.class)); + gameEngine.setSystemSignature(LogVec2DSystem.class, signature); } logVec2DSystem.init(); FrameRateSystem frameRateSystem = new FrameRateSystem(); - gameEngine.registerSystem(FrameRateSystem.class.getName(), frameRateSystem); + gameEngine.registerSystem(FrameRateSystem.class, frameRateSystem); // Create components: int entity = gameEngine.createEntity(); - gameEngine.addComponent(entity, Gravity.class.getName(), new Gravity(0.0, -9.80665, -1.0, 100.0)); - gameEngine.addComponent(entity, Vec2D.class.getName(), new Vec2D(1.5, 0.0, 1)); - gameEngine.addComponent(entity, RidgidBody.class.getName(), new RidgidBody()); + gameEngine.addComponent(entity, Gravity.class, new Gravity(0.0, -9.80665, -1.0, 100.0)); + gameEngine.addComponent(entity, Vec2D.class, new Vec2D(1.5, 0.0, 1)); + gameEngine.addComponent(entity, RidgidBody.class, new RidgidBody()); diff --git a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ComponentManager.java b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ComponentManager.java index 4b69a41..fa8ebd7 100644 --- a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ComponentManager.java +++ b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ComponentManager.java @@ -9,42 +9,43 @@ package nz.ac.massey.programming_project_159333_s1_2021; * */ import java.util.Map; +import java.lang.reflect.Type; import java.util.HashMap; class ComponentManager{ - Map componentArrays = new HashMap<>(); - Map componentPosIndex = new HashMap<>(); + Map componentArrays = new HashMap<>(); + Map componentPosIndex = new HashMap<>(); int componentPos = 0; - public void registerComponent(String name){ - if (componentArrays.containsKey(name)){ - System.err.println("Component " + name + " is already registered"); + public void registerComponent(Type type){ + if (componentArrays.containsKey(type)){ + System.err.println("Component " + type.getTypeName() + " is already registered"); return; } - componentArrays.put(name, new ComponentArray()); - componentPosIndex.put(name, componentPos++); + componentArrays.put(type, new ComponentArray()); + componentPosIndex.put(type, componentPos++); } - public void addComponentToEntity(String componentName, Object componentData, int entity){ + public void addComponentToEntity(Type componentName, Object componentData, int entity){ componentArrays.get(componentName).insertData(entity, componentData); } - public void removeComponentFromEntity(String componentName, int entity){ + public void removeComponentFromEntity(Type componentName, int entity){ componentArrays.get(componentName).removeData(entity); } // Java does not allow reflective typing, so must cast this in the retrieving function. - public Object getComponent(String componentType, int entity){ + public Object getComponent(Type componentType, int entity){ return componentArrays.get(componentType).getData(entity); } public void entityDestroyed(int entity){ - for (String key : componentArrays.keySet()) { + for (Type key : componentArrays.keySet()) { componentArrays.get(key).entityDestroyed(entity); } } - public Integer getComponentIndex(String name){ - return componentPosIndex.get(name); + public Integer getComponentIndex(Type type){ + return componentPosIndex.get(type); } } \ No newline at end of file diff --git a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ECS.java b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ECS.java index 25924e5..39365a5 100644 --- a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ECS.java +++ b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ECS.java @@ -12,6 +12,7 @@ package nz.ac.massey.programming_project_159333_s1_2021; * */ +import java.lang.reflect.Type; import java.util.BitSet; /** * The ECS manager. @@ -66,12 +67,12 @@ public class ECS { * Registers the specified name in the component manager * @param name the name to register. Should be the component class name or a suitable name for primitive types */ - void registerComponent(String name){ - componentManager.registerComponent(name); + void registerComponent(Type type){ + componentManager.registerComponent(type); } - Integer getComponentIndex(String name){ - return componentManager.getComponentIndex(name); + Integer getComponentIndex(Type type){ + return componentManager.getComponentIndex(type); } /** @@ -80,7 +81,7 @@ public class ECS { * @param componentName the class name of the component to add * @param component the actual component data */ - void addComponent(int entity, String componentName, Object component){ + void addComponent(int entity, Type componentName, Object component){ componentManager.addComponentToEntity(componentName, component, entity); entityManager.registerComponent(componentManager.getComponentIndex(componentName), entity); systemManager.entitySignatureChanged(entity, entityManager.getRegistrations(entity)); @@ -91,9 +92,9 @@ public class ECS { * @param entity the entity to remove the component from * @param componentName the class name of the component */ - void removeComponent(int entity, String componentName){ - componentManager.removeComponentFromEntity(componentName, entity); - entityManager.unregisterComponent(componentManager.getComponentIndex(componentName), entity); + void removeComponent(int entity, Type componentType){ + componentManager.removeComponentFromEntity(componentType, entity); + entityManager.unregisterComponent(componentManager.getComponentIndex(componentType), entity); systemManager.entitySignatureChanged(entity, entityManager.getRegistrations(entity)); } @@ -101,11 +102,11 @@ public class ECS { * Gets the actual data of the component associated to the entity. * May require casting from Object to the known data type * @param entity the entity to retrieve the data for - * @param componentName the class name of the component + * @param componentType the class type of the component * @return the component data Object associated with the entity */ - Object getComponentData(int entity, String componentName){ - return componentManager.getComponent(componentName, entity); + Object getComponentData(int entity, Type componentType){ + return componentManager.getComponent(componentType, entity); } /** @@ -113,8 +114,8 @@ public class ECS { * @param systemName * @param action */ - void registerSystem(String systemName, ECSSystem action){ - systemManager.registerSystem(systemName, action); + void registerSystem(Type systemType, ECSSystem action){ + systemManager.registerSystem(systemType, action); } /** @@ -122,7 +123,7 @@ public class ECS { * @param system the class name of the system to set the signature of * @param signature the new signature data */ - void setSystemSignature(String system, BitSet signature){ + void setSystemSignature(Type system, BitSet signature){ systemManager.setSignature(system, signature); } } \ No newline at end of file diff --git a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/LogVec2DSystem.java b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/LogVec2DSystem.java index d953a00..b6d9df0 100644 --- a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/LogVec2DSystem.java +++ b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/LogVec2DSystem.java @@ -10,7 +10,7 @@ public class LogVec2DSystem extends ECSSystem{ void update(double dt){ for (Integer entity : entities) { - Vec2D pos = (Vec2D)gameEngine.getComponentData(entity, Vec2D.class.getName()); + Vec2D pos = (Vec2D)gameEngine.getComponentData(entity, Vec2D.class); System.out.println(String.format("X: %.6g, Y: %.6g", pos.x, pos.y)); } } diff --git a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/PhysicsSystem.java b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/PhysicsSystem.java index a560d63..4337d64 100644 --- a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/PhysicsSystem.java +++ b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/PhysicsSystem.java @@ -10,9 +10,9 @@ public class PhysicsSystem extends ECSSystem{ void update(double dt){ for (Integer entity : entities) { - Vec2D pos = (Vec2D)gameEngine.getComponentData(entity, Vec2D.class.getName()); - RidgidBody ridgidBody = (RidgidBody)gameEngine.getComponentData(entity, RidgidBody.class.getName()); - Gravity gravity = (Gravity)gameEngine.getComponentData(entity, Gravity.class.getName()); + Vec2D pos = (Vec2D)gameEngine.getComponentData(entity, Vec2D.class); + RidgidBody ridgidBody = (RidgidBody)gameEngine.getComponentData(entity, RidgidBody.class); + Gravity gravity = (Gravity)gameEngine.getComponentData(entity, Gravity.class); // Firstly, add the result of the accelerative forces to the ridgidbody ridgidBody.xdot += ridgidBody.xAcc * dt; ridgidBody.ydot += ridgidBody.yAcc * dt; diff --git a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/SystemManager.java b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/SystemManager.java index 187cf26..edd948d 100644 --- a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/SystemManager.java +++ b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/SystemManager.java @@ -9,13 +9,14 @@ package nz.ac.massey.programming_project_159333_s1_2021; * */ +import java.lang.reflect.Type; import java.util.BitSet; import java.util.Map; import java.util.HashMap; class SystemManager{ - Map signatures = new HashMap<>(); - Map systems = new HashMap<>(); + Map signatures = new HashMap<>(); + Map systems = new HashMap<>(); // Registering the system adds it to the array of systems. // In Austin Morlan's implementation, this also creates an instance of the @@ -26,28 +27,28 @@ class SystemManager{ // instance. // I.e., create an object that represents the system class; then store that class in the system // table. - public boolean registerSystem(String systemName, ECSSystem system){ - if (systems.containsKey(systemName)){ + public boolean registerSystem(Type systemType, ECSSystem system){ + if (systems.containsKey(systemType)){ System.err.println("System already registered"); return false; } - systems.put(systemName, system); - signatures.put(systemName, new BitSet()); + systems.put(systemType, system); + signatures.put(systemType, new BitSet()); return true; } - public void setSignature(String system, BitSet registrations){ + public void setSignature(Type system, BitSet registrations){ signatures.put(system, registrations); } public void entityDestroyed(int entity){ - for (String key : systems.keySet()) { + for (Type key : systems.keySet()) { systems.get(key).entities.remove(entity); } } public void entitySignatureChanged(int entity, BitSet entitySignature){ - for (String key : systems.keySet()) { + for (Type key : systems.keySet()) { // Check if the signature is null if (!entitySignature.equals(null)){ BitSet srcCpy = (BitSet)entitySignature.clone();