diff --git a/.gitignore b/.gitignore
index 5ff6309..e26a2cc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@ target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
+mods-mvn/
### IntelliJ IDEA ###
.idea/modules.xml
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index a4e167e..01d6a46 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -17,8 +17,11 @@
+
+
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index dd5e3ad..cd44c0f 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -5,8 +5,15 @@
+
+
+
+
+
+
diff --git a/CommonAsteroids/src/main/java/dk/sdu/mmmi/cbse/common/asteroids/Asteroid.java b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/Asteroid.java
similarity index 66%
rename from CommonAsteroids/src/main/java/dk/sdu/mmmi/cbse/common/asteroids/Asteroid.java
rename to Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/Asteroid.java
index 7482802..150d6a0 100644
--- a/CommonAsteroids/src/main/java/dk/sdu/mmmi/cbse/common/asteroids/Asteroid.java
+++ b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/Asteroid.java
@@ -1,4 +1,4 @@
-package dk.sdu.mmmi.cbse.common.asteroids;
+package dk.sdu.mmmi.cbse.asteriods;
import dk.sdu.mmmi.cbse.common.data.Entity;
diff --git a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidPlugin.java b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidPlugin.java
index 1120f4a..fb7bfa1 100644
--- a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidPlugin.java
+++ b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidPlugin.java
@@ -1,6 +1,5 @@
package dk.sdu.mmmi.cbse.asteriods;
-import dk.sdu.mmmi.cbse.common.asteroids.Asteroid;
import dk.sdu.mmmi.cbse.common.data.Entity;
import dk.sdu.mmmi.cbse.common.data.GameData;
import dk.sdu.mmmi.cbse.common.data.World;
diff --git a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidProcessor.java b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidProcessor.java
index 16ec7c3..c0f4e54 100644
--- a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidProcessor.java
+++ b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidProcessor.java
@@ -1,6 +1,5 @@
package dk.sdu.mmmi.cbse.asteriods;
-import dk.sdu.mmmi.cbse.common.asteroids.Asteroid;
import dk.sdu.mmmi.cbse.common.data.Entity;
import dk.sdu.mmmi.cbse.common.data.GameData;
import dk.sdu.mmmi.cbse.common.data.World;
diff --git a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidSplitterImpl.java b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidSplitterImpl.java
index 9fc668d..1d6bdc3 100644
--- a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidSplitterImpl.java
+++ b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteriods/AsteroidSplitterImpl.java
@@ -1,12 +1,9 @@
package dk.sdu.mmmi.cbse.asteriods;
-import dk.sdu.mmmi.cbse.common.asteroids.Asteroid;
-import dk.sdu.mmmi.cbse.common.asteroids.IAsteroidSplitter;
import dk.sdu.mmmi.cbse.common.data.Entity;
import dk.sdu.mmmi.cbse.common.data.World;
-public class AsteroidSplitterImpl implements IAsteroidSplitter {
- @Override
+public class AsteroidSplitterImpl{
public void createSplitAsteroid(Entity e, World world) {
if(e.getRadius() <= 5) {
for (Entity entity : world.getEntities()) {
diff --git a/Asteroids/src/main/java/module-info.java b/Asteroids/src/main/java/module-info.java
index 5cb0067..7db2290 100644
--- a/Asteroids/src/main/java/module-info.java
+++ b/Asteroids/src/main/java/module-info.java
@@ -3,7 +3,6 @@
module Asteroid{
requires Common;
- requires CommonAsteroids;
provides IGamePluginService with dk.sdu.mmmi.cbse.asteriods.AsteroidPlugin;
provides IEntityProcessingService with dk.sdu.mmmi.cbse.asteriods.AsteroidProcessor;
}
\ No newline at end of file
diff --git a/Bullet/src/main/java/dk/sdu/mmmi/cbse/bulletsystem/BulletPlugin.java b/Bullet/src/main/java/dk/sdu/mmmi/cbse/bulletsystem/BulletPlugin.java
deleted file mode 100644
index 621fb55..0000000
--- a/Bullet/src/main/java/dk/sdu/mmmi/cbse/bulletsystem/BulletPlugin.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package dk.sdu.mmmi.cbse.bulletsystem;
-
-import dk.sdu.mmmi.cbse.common.bullet.Bullet;
-import dk.sdu.mmmi.cbse.common.data.Entity;
-import dk.sdu.mmmi.cbse.common.data.GameData;
-import dk.sdu.mmmi.cbse.common.data.World;
-import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
-
-public class BulletPlugin implements IGamePluginService {
- @Override
- public void start(GameData gameData, World world) {
-
- }
-
- @Override
- public void stop(GameData gameData, World world) {
- for(Entity e : world.getEntities()) {
- if(e.getClass() == Bullet.class) {
- world.removeEntity(e);
- }
- }
- }
-}
diff --git a/Bullet/src/main/java/module-info.java b/Bullet/src/main/java/module-info.java
index 288c581..d9fb9cc 100644
--- a/Bullet/src/main/java/module-info.java
+++ b/Bullet/src/main/java/module-info.java
@@ -5,7 +5,6 @@
module Bullet {
requires CommonBullet;
requires Common;
- provides IGamePluginService with dk.sdu.mmmi.cbse.bulletsystem.BulletPlugin;
provides BulletSPI with dk.sdu.mmmi.cbse.bulletsystem.BulletControlSystem;
provides IEntityProcessingService with dk.sdu.mmmi.cbse.bulletsystem.BulletControlSystem;
}
\ No newline at end of file
diff --git a/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/Entity.java b/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/Entity.java
index a33e691..6c9da38 100644
--- a/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/Entity.java
+++ b/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/Entity.java
@@ -6,7 +6,7 @@
public class Entity implements Serializable {
private final UUID ID = UUID.randomUUID();
- private double[] polygonCoorinates;
+ private double[] polygonCoordinates;
private double x;
private double y;
private double rotation;
@@ -16,10 +16,10 @@ public class Entity implements Serializable {
private int destroyedAsteroids;
public String getID(){return ID.toString();}
- public double[] getPolygonCoordinates(){return polygonCoorinates;}
+ public double[] getPolygonCoordinates(){return polygonCoordinates;}
public void setPolygonCoordinates(double... coorinates) {
- this.polygonCoorinates = coorinates;
+ this.polygonCoordinates = coorinates;
}
public void setX(double x) {
diff --git a/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/World.java b/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/World.java
index f454d03..9134a9f 100644
--- a/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/World.java
+++ b/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/World.java
@@ -1,6 +1,5 @@
package dk.sdu.mmmi.cbse.common.data;
-import java.lang.invoke.TypeDescriptor;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/CommonAsteroids/pom.xml b/CommonAsteroids/pom.xml
deleted file mode 100644
index ce38786..0000000
--- a/CommonAsteroids/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
- 4.0.0
-
- dk.sdu.cbse
- AsteroidsDevelop
- 1.0-SNAPSHOT
-
- CommonAsteroids
- Archetype - CommonAsteroids
- http://maven.apache.org
-
-
- dk.sdu.cbse
- Common
- 1.0-SNAPSHOT
- compile
-
-
- dk.sdu.cbse
- Common
- 1.0-SNAPSHOT
- compile
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 9
- 9
-
-
-
-
- jar
-
-
diff --git a/CommonAsteroids/src/main/java/dk/sdu/mmmi/cbse/common/asteroids/IAsteroidSplitter.java b/CommonAsteroids/src/main/java/dk/sdu/mmmi/cbse/common/asteroids/IAsteroidSplitter.java
deleted file mode 100644
index f380160..0000000
--- a/CommonAsteroids/src/main/java/dk/sdu/mmmi/cbse/common/asteroids/IAsteroidSplitter.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package dk.sdu.mmmi.cbse.common.asteroids;
-
-import dk.sdu.mmmi.cbse.common.data.Entity;
-import dk.sdu.mmmi.cbse.common.data.World;
-
-
-/**
- *
- * @author corfixen
- */
-public interface IAsteroidSplitter {
- void createSplitAsteroid(Entity e, World world);
-}
diff --git a/CommonAsteroids/src/main/java/module-info.java b/CommonAsteroids/src/main/java/module-info.java
deleted file mode 100644
index faa7e95..0000000
--- a/CommonAsteroids/src/main/java/module-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-module CommonAsteroids {
- requires Common;
- requires java.desktop;
- exports dk.sdu.mmmi.cbse.common.asteroids;
-}
\ No newline at end of file
diff --git a/CommonBullet/src/main/java/module-info.java b/CommonBullet/src/main/java/module-info.java
index 37eedf8..99739bf 100644
--- a/CommonBullet/src/main/java/module-info.java
+++ b/CommonBullet/src/main/java/module-info.java
@@ -1,4 +1,4 @@
module CommonBullet {
requires Common;
exports dk.sdu.mmmi.cbse.common.bullet;
-}
\ No newline at end of file
+}
diff --git a/Core/pom.xml b/Core/pom.xml
index ae3631c..ebcf572 100644
--- a/Core/pom.xml
+++ b/Core/pom.xml
@@ -10,7 +10,6 @@
Archetype - Core
http://maven.apache.org
-
org.openjfx
javafx-controls
@@ -26,7 +25,30 @@
javafx-base
21.0.2
-
+
+ org.springframework
+ spring-context
+
+
+ org.springframework
+ spring-core
+
+
+ org.springframework
+ spring-beans
+
+
+ org.springframework
+ spring-aop
+
+
+ org.springframework
+ spring-expression
+
+
+ org.springframework
+ spring-jcl
+
dk.sdu.cbse
Common
@@ -37,6 +59,16 @@
CommonBullet
1.0-SNAPSHOT
+
+ org.springframework
+ spring-web
+
+
+ org.slf4j
+ slf4j-api
+ 2.0.17
+ compile
+
@@ -62,7 +94,7 @@
copy-dependencies
- javafx-controls,javafx-graphics,javafx-base
+ javafx-controls,javafx-graphics,javafx-base,spring-context,spring-core,spring-beans,spring-aop,spring-expression,spring-jcl, spring-web
../mods-mvn
diff --git a/Core/src/main/java/dk/sdu/mmmi/cbse/main/Game.java b/Core/src/main/java/dk/sdu/mmmi/cbse/main/Game.java
new file mode 100644
index 0000000..6bc4f25
--- /dev/null
+++ b/Core/src/main/java/dk/sdu/mmmi/cbse/main/Game.java
@@ -0,0 +1,144 @@
+package dk.sdu.mmmi.cbse.main;
+
+import dk.sdu.mmmi.cbse.common.data.Entity;
+import dk.sdu.mmmi.cbse.common.data.GameData;
+import dk.sdu.mmmi.cbse.common.data.GameKeys;
+import dk.sdu.mmmi.cbse.common.data.World;
+import dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
+import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
+import dk.sdu.mmmi.cbse.common.services.IPostEntityProcessingService;
+import javafx.animation.AnimationTimer;
+import javafx.scene.Scene;
+import javafx.scene.input.KeyCode;
+import javafx.scene.layout.Pane;
+import javafx.scene.shape.Polygon;
+import javafx.scene.text.Text;
+import javafx.stage.Stage;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+public class Game {
+ private final GameData gameData = new GameData();
+ private final World world = new World();
+ private final Map polygons = new ConcurrentHashMap<>();
+ private final Pane gameWindow = new Pane();
+ private final List gamePluginServices;
+ private final List entityProcessingServiceList;
+ private final List postEntityProcessingServices;
+
+ Game(List gamePluginServices, List entityProcessingServiceList, List postEntityProcessingServices) {
+ this.gamePluginServices = gamePluginServices;
+ this.entityProcessingServiceList = entityProcessingServiceList;
+ this.postEntityProcessingServices = postEntityProcessingServices;
+ }
+
+ public void start(Stage window) throws Exception {
+ Text text = new Text(10, 20, "Destroyed asteroids: 0");
+ gameWindow.setPrefSize(gameData.getDisplayWidth(), gameData.getDisplayHeight());
+ gameWindow.getChildren().add(text);
+
+ Scene scene = new Scene(gameWindow);
+ scene.setOnKeyPressed(event -> {
+ if (event.getCode().equals(KeyCode.LEFT)) {
+ gameData.getKeys().setKeys(GameKeys.LEFT, true);
+ }
+ if (event.getCode().equals(KeyCode.RIGHT)) {
+ gameData.getKeys().setKeys(GameKeys.RIGHT, true);
+ }
+ if (event.getCode().equals(KeyCode.UP)) {
+ gameData.getKeys().setKeys(GameKeys.UP, true);
+ }
+ if (event.getCode().equals(KeyCode.SPACE)) {
+ gameData.getKeys().setKeys(GameKeys.SPACE, true);
+ }
+ });
+ scene.setOnKeyReleased(event -> {
+ if (event.getCode().equals(KeyCode.LEFT)) {
+ gameData.getKeys().setKeys(GameKeys.LEFT, false);
+ }
+ if (event.getCode().equals(KeyCode.RIGHT)) {
+ gameData.getKeys().setKeys(GameKeys.RIGHT, false);
+ }
+ if (event.getCode().equals(KeyCode.UP)) {
+ gameData.getKeys().setKeys(GameKeys.UP, false);
+ }
+ if (event.getCode().equals(KeyCode.SPACE)) {
+ gameData.getKeys().setKeys(GameKeys.SPACE, false);
+ }
+
+ });
+
+ // Lookup all Game Plugins using ServiceLoader
+ for (IGamePluginService iGamePlugin : getGamePluginServices()) {
+ iGamePlugin.start(gameData, world);
+ }
+ for (Entity entity : world.getEntities()) {
+ Polygon polygon = new Polygon(entity.getPolygonCoordinates());
+ polygons.put(entity, polygon);
+ gameWindow.getChildren().add(polygon);
+ }
+ window.setScene(scene);
+ window.setTitle("ASTEROIDS");
+ window.show();
+ }
+
+ public void render() {
+ new AnimationTimer() {
+ @Override
+ public void handle(long now) {
+ update();
+ draw();
+ gameData.getKeys().update();
+ }
+
+ }.start();
+ }
+
+ private void update() {
+ for (IEntityProcessingService entityProcessorService : getEntityProcessingServices()) {
+ entityProcessorService.process(gameData, world);
+ }
+ for (IPostEntityProcessingService postEntityProcessorService : getPostEntityProcessingServices()) {
+ postEntityProcessorService.process(gameData, world);
+ }
+ }
+
+ private void draw() {
+ for (Entity polygonEntity : polygons.keySet()) {
+ if(!world.getEntities().contains(polygonEntity)){
+ Polygon removedPolygon = polygons.get(polygonEntity);
+ polygons.remove(polygonEntity);
+ gameWindow.getChildren().remove(removedPolygon);
+ }
+ }
+
+ for (Entity entity : world.getEntities()) {
+ Polygon polygon = polygons.get(entity);
+ if (polygon == null) {
+ polygon = new Polygon(entity.getPolygonCoordinates());
+ polygons.put(entity, polygon);
+ gameWindow.getChildren().add(polygon);
+ }
+ polygon.setTranslateX(entity.getX());
+ polygon.setTranslateY(entity.getY());
+ polygon.setRotate(entity.getRotation());
+ }
+
+ }
+
+ public List getGamePluginServices() {
+ return gamePluginServices;
+ }
+
+ public List getEntityProcessingServices() {
+ return entityProcessingServiceList;
+ }
+
+ public List getPostEntityProcessingServices() {
+ return postEntityProcessingServices;
+ }
+
+}
diff --git a/Core/src/main/java/dk/sdu/mmmi/cbse/main/SpringConfig.java b/Core/src/main/java/dk/sdu/mmmi/cbse/main/SpringConfig.java
new file mode 100644
index 0000000..319069f
--- /dev/null
+++ b/Core/src/main/java/dk/sdu/mmmi/cbse/main/SpringConfig.java
@@ -0,0 +1,42 @@
+package dk.sdu.mmmi.cbse.main;
+
+
+import dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
+import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
+import dk.sdu.mmmi.cbse.common.services.IPostEntityProcessingService;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.List;
+import java.util.ServiceLoader;
+
+import static java.util.stream.Collectors.toList;
+
+@Configuration
+public class SpringConfig {
+
+ public SpringConfig() {
+ }
+
+ @Bean
+ public Game game(){
+ return new Game(gamePluginServices(), entityProcessingServiceList(), postEntityProcessingServices());
+ }
+
+ @Bean
+ public List entityProcessingServiceList(){
+ return ServiceLoader.load(IEntityProcessingService.class).stream().map(ServiceLoader.Provider::get).collect(toList());
+ }
+
+ @Bean
+ public List gamePluginServices() {
+ return ServiceLoader.load(IGamePluginService.class).stream().map(ServiceLoader.Provider::get).collect(toList());
+ }
+
+ @Bean
+ public List postEntityProcessingServices() {
+ return ServiceLoader.load(IPostEntityProcessingService.class).stream().map(ServiceLoader.Provider::get).collect(toList());
+ }
+
+
+}
diff --git a/Core/src/main/java/module-info.java b/Core/src/main/java/module-info.java
index cd6bb8e..d2d4d54 100644
--- a/Core/src/main/java/module-info.java
+++ b/Core/src/main/java/module-info.java
@@ -2,8 +2,12 @@
requires Common;
requires CommonBullet;
requires javafx.graphics;
- requires javafx.controls;
- opens dk.sdu.mmmi.cbse.main to javafx.graphics;
+ requires spring.context;
+ requires spring.core;
+ requires spring.beans;
+ requires spring.web;
+ exports dk.sdu.mmmi.cbse.main;
+ opens dk.sdu.mmmi.cbse.main to javafx.graphics,spring.core;
uses dk.sdu.mmmi.cbse.common.services.IGamePluginService;
uses dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
uses dk.sdu.mmmi.cbse.common.services.IPostEntityProcessingService;
diff --git a/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceship.java b/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceShip.java
similarity index 68%
rename from EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceship.java
rename to EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceShip.java
index 8996684..1c5cf6d 100644
--- a/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceship.java
+++ b/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceShip.java
@@ -3,6 +3,6 @@
import dk.sdu.mmmi.cbse.common.data.Entity;
-public class EnemySpaceship extends Entity {
+public class EnemySpaceShip extends Entity {
}
diff --git a/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceshipSystem.java b/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceShipControlSystem.java
similarity index 92%
rename from EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceshipSystem.java
rename to EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceShipControlSystem.java
index 9362d66..7fd8cc1 100644
--- a/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceshipSystem.java
+++ b/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceShipControlSystem.java
@@ -5,7 +5,6 @@
import dk.sdu.mmmi.cbse.common.data.GameData;
import dk.sdu.mmmi.cbse.common.data.World;
import dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
-import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
import java.util.Collection;
import java.util.Random;
@@ -13,14 +12,14 @@
import static java.util.stream.Collectors.toList;
-public class EnemySpaceshipSystem implements IEntityProcessingService {
+public class EnemySpaceShipControlSystem implements IEntityProcessingService {
private final Random random = new Random();
@Override
public void process(GameData gameData, World world) {
// Loop through all entities in the world that are enemies
- for (Entity enemySpaceship : world.getEntity(EnemySpaceship.class)) {
+ for (Entity enemySpaceship : world.getEntity(EnemySpaceShip.class)) {
if (random.nextDouble() < 0.05) { // 5% chance per frame to change direction
enemySpaceship.setRotation(random.nextInt(360)); // Random rotation between 0 and 359 degrees
diff --git a/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceshipPlugin.java b/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceShipPlugin.java
similarity index 81%
rename from EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceshipPlugin.java
rename to EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceShipPlugin.java
index a67552e..5b28fa0 100644
--- a/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceshipPlugin.java
+++ b/EnemySpaceShip/src/main/java/dk/sdu/mmmi/cbse/enemyspaceshipsystem/EnemySpaceShipPlugin.java
@@ -1,6 +1,5 @@
package dk.sdu.mmmi.cbse.enemyspaceshipsystem;
-import dk.sdu.mmmi.cbse.common.bullet.Bullet;
import dk.sdu.mmmi.cbse.common.data.Entity;
import dk.sdu.mmmi.cbse.common.data.GameData;
import dk.sdu.mmmi.cbse.common.data.World;
@@ -8,23 +7,22 @@
import java.util.Random;
-public class EnemySpaceshipPlugin implements IGamePluginService {
+public class EnemySpaceShipPlugin implements IGamePluginService {
private final Random random = new Random();
private Entity enemySpaceship;
- public EnemySpaceshipPlugin() {
- }
-
@Override
public void start(GameData gameData, World world) {
+ // enemySpaceship-entety to the world
+
enemySpaceship = createEnemySpaceship(gameData);
world.addEntity(enemySpaceship);
}
private Entity createEnemySpaceship(GameData gameData) {
- enemySpaceship = new EnemySpaceship();
+ enemySpaceship = new EnemySpaceShip();
float x = random.nextFloat(gameData.getDisplayWidth());
float y = random.nextFloat(gameData.getDisplayHeight());
@@ -40,7 +38,7 @@ private Entity createEnemySpaceship(GameData gameData) {
@Override
public void stop(GameData gameData, World world) {
for(Entity e : world.getEntities()) {
- if(e.getClass() == EnemySpaceship.class) {
+ if(e.getClass() == EnemySpaceShip.class) {
world.removeEntity(e);
}
}
diff --git a/EnemySpaceShip/src/main/java/module-info.java b/EnemySpaceShip/src/main/java/module-info.java
index cb1aded..1dcc7fc 100644
--- a/EnemySpaceShip/src/main/java/module-info.java
+++ b/EnemySpaceShip/src/main/java/module-info.java
@@ -1,12 +1,8 @@
-
-import dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
-import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
-
module EnemySpaceship {
requires Common;
requires CommonBullet;
uses dk.sdu.mmmi.cbse.common.bullet.BulletSPI;
- provides IGamePluginService with dk.sdu.mmmi.cbse.enemyspaceshipsystem.EnemySpaceshipPlugin;
- provides IEntityProcessingService with dk.sdu.mmmi.cbse.enemyspaceshipsystem.EnemySpaceshipSystem;
+ provides dk.sdu.mmmi.cbse.common.services.IGamePluginService with dk.sdu.mmmi.cbse.enemyspaceshipsystem.EnemySpaceShipPlugin;
+ provides dk.sdu.mmmi.cbse.common.services.IEntityProcessingService with dk.sdu.mmmi.cbse.enemyspaceshipsystem.EnemySpaceShipControlSystem;
}
diff --git a/IntegrationTest/pom.xml b/IntegrationTest/pom.xml
new file mode 100644
index 0000000..6f5fe72
--- /dev/null
+++ b/IntegrationTest/pom.xml
@@ -0,0 +1,20 @@
+
+ 4.0.0
+
+ dk.sdu.cbse
+ AsteroidsDevelop
+ 1.0-SNAPSHOT
+
+ IntegrationTest
+ Archetype - IntegrationTest
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 4.13.2
+ test
+
+
+
diff --git a/CommonAsteroids/src/main/resources/META-INF/maven/archetype.xml b/IntegrationTest/src/main/resources/META-INF/maven/archetype.xml
similarity index 86%
rename from CommonAsteroids/src/main/resources/META-INF/maven/archetype.xml
rename to IntegrationTest/src/main/resources/META-INF/maven/archetype.xml
index 6922cce..c3d4c04 100644
--- a/CommonAsteroids/src/main/resources/META-INF/maven/archetype.xml
+++ b/IntegrationTest/src/main/resources/META-INF/maven/archetype.xml
@@ -1,5 +1,5 @@
- CommonAsteroids
+ IntegrationTest
src/main/java/App.java
diff --git a/CommonAsteroids/src/main/resources/archetype-resources/pom.xml b/IntegrationTest/src/main/resources/archetype-resources/pom.xml
similarity index 85%
rename from CommonAsteroids/src/main/resources/archetype-resources/pom.xml
rename to IntegrationTest/src/main/resources/archetype-resources/pom.xml
index 34db82d..4f06269 100644
--- a/CommonAsteroids/src/main/resources/archetype-resources/pom.xml
+++ b/IntegrationTest/src/main/resources/archetype-resources/pom.xml
@@ -1,8 +1,8 @@
4.0.0
- $dk.sdu.mmmi.cbse
- $CommonAsteroids
+ $dk.sdu.cbse
+ $IntegrationTest
$1.0-SNAPSHOT
diff --git a/CommonAsteroids/src/main/resources/archetype-resources/src/main/java/App.java b/IntegrationTest/src/main/resources/archetype-resources/src/main/java/App.java
similarity index 85%
rename from CommonAsteroids/src/main/resources/archetype-resources/src/main/java/App.java
rename to IntegrationTest/src/main/resources/archetype-resources/src/main/java/App.java
index 893546a..6779cad 100644
--- a/CommonAsteroids/src/main/resources/archetype-resources/src/main/java/App.java
+++ b/IntegrationTest/src/main/resources/archetype-resources/src/main/java/App.java
@@ -1,4 +1,4 @@
-package $dk.sdu.mmmi.cbse;
+package $dk.sdu.cbse;
/**
* Hello world!
diff --git a/CommonAsteroids/src/main/resources/archetype-resources/src/test/java/AppTest.java b/IntegrationTest/src/main/resources/archetype-resources/src/test/java/AppTest.java
similarity index 95%
rename from CommonAsteroids/src/main/resources/archetype-resources/src/test/java/AppTest.java
rename to IntegrationTest/src/main/resources/archetype-resources/src/test/java/AppTest.java
index a1a8a35..226f596 100644
--- a/CommonAsteroids/src/main/resources/archetype-resources/src/test/java/AppTest.java
+++ b/IntegrationTest/src/main/resources/archetype-resources/src/test/java/AppTest.java
@@ -1,4 +1,4 @@
-package $dk.sdu.mmmi.cbse;
+package $dk.sdu.cbse;
import junit.framework.Test;
import junit.framework.TestCase;
diff --git a/IntegrationTest/src/test/java/dk/sdu/mmmi/cbse/integrationtests/DeletePlayerModuleTest.java b/IntegrationTest/src/test/java/dk/sdu/mmmi/cbse/integrationtests/DeletePlayerModuleTest.java
new file mode 100644
index 0000000..e452e58
--- /dev/null
+++ b/IntegrationTest/src/test/java/dk/sdu/mmmi/cbse/integrationtests/DeletePlayerModuleTest.java
@@ -0,0 +1,50 @@
+package dk.sdu.mmmi.cbse.integrationtests;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class DeletePlayerModuleTest {
+ //Points to root directory
+ private static final String PROJECT_ROOT = new File(System.getProperty("user.dir")).getParent();
+
+ @Test
+ public void testRemovalOfPlayer() throws IOException, InterruptedException {
+ //Specify the JAR file, Player
+ File original = new File(PROJECT_ROOT, "/mods-mvn/Player-1.0-SNAPSHOT.jar");
+
+ //Delete the JAR file
+ assertTrue(original.delete());
+
+ int exitCodeNoPlayer = runMain();
+ assertEquals(0, exitCodeNoPlayer);
+
+ //Rebuild Player module after the test
+ ProcessBuilder mvnProcessBuilder = new ProcessBuilder("mvn", "install", "-pl", "Player", "-am");
+ mvnProcessBuilder.directory(new File(PROJECT_ROOT));
+ Process mvnProcess = mvnProcessBuilder.start();
+ assertEquals(0, mvnProcess.waitFor());
+
+ int exitCodeWithPlayer = runMain();
+ assertEquals(0, exitCodeWithPlayer);
+ }
+
+ private int runMain() throws IOException, InterruptedException {
+ //Execute the system
+ ProcessBuilder processBuilder = new ProcessBuilder(
+ "java",
+ "--module-path", "mods-mvn",
+ "--class-path", "libs/*",
+ "--module", "Core/dk.sdu.mmmi.cbse.main.Main"
+ );
+ processBuilder.directory(new File(PROJECT_ROOT));
+ processBuilder.redirectErrorStream(true);
+ Process process = processBuilder.start();
+
+ return process.waitFor();
+ }
+}
diff --git a/Player/pom.xml b/Player/pom.xml
index 568bb21..6c54ef2 100644
--- a/Player/pom.xml
+++ b/Player/pom.xml
@@ -16,6 +16,24 @@
1.0-SNAPSHOT
compile
+
+ junit
+ junit
+ 4.13.2
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter
+ RELEASE
+ test
+
+
+ org.mockito
+ mockito-core
+ 5.11.0
+ test
+
diff --git a/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/PlayerControlSystem.java b/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/PlayerControlSystem.java
index 5033f0d..589aac1 100644
--- a/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/PlayerControlSystem.java
+++ b/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/PlayerControlSystem.java
@@ -54,7 +54,7 @@ public void process(GameData gameData, World world) {
}
}
- private Collection extends BulletSPI> getBulletSPIs() {
+ protected Collection extends BulletSPI> getBulletSPIs() {
return ServiceLoader.load(BulletSPI.class).stream().map(ServiceLoader.Provider::get).collect(toList());
}
diff --git a/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/PlayerPlugin.java b/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/PlayerPlugin.java
index 6d6e1d9..b547fc0 100644
--- a/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/PlayerPlugin.java
+++ b/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/PlayerPlugin.java
@@ -1,6 +1,5 @@
package dk.sdu.mmmi.cbse.playersystem;
-import dk.sdu.mmmi.cbse.common.bullet.Bullet;
import dk.sdu.mmmi.cbse.common.data.Entity;
import dk.sdu.mmmi.cbse.common.data.GameData;
import dk.sdu.mmmi.cbse.common.data.World;
diff --git a/Player/src/main/java/module-info.java b/Player/src/main/java/module-info.java
index 88d6765..a0ce09f 100644
--- a/Player/src/main/java/module-info.java
+++ b/Player/src/main/java/module-info.java
@@ -1,11 +1,11 @@
import dk.sdu.mmmi.cbse.common.bullet.BulletSPI;
+import dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
-import dk.sdu.mmmi.cbse.common.services.IPostEntityProcessingService;
module Player {
requires Common;
requires CommonBullet;
uses BulletSPI;
provides IGamePluginService with dk.sdu.mmmi.cbse.playersystem.PlayerPlugin;
- provides IPostEntityProcessingService with dk.sdu.mmmi.cbse.playersystem.PlayerControlSystem;
+ provides IEntityProcessingService with dk.sdu.mmmi.cbse.playersystem.PlayerControlSystem;
}
\ No newline at end of file
diff --git a/Player/src/test/java/dk/sdu/mmmi/cbse/playersystem/PlayerControlSystemTest.java b/Player/src/test/java/dk/sdu/mmmi/cbse/playersystem/PlayerControlSystemTest.java
new file mode 100644
index 0000000..20d1cff
--- /dev/null
+++ b/Player/src/test/java/dk/sdu/mmmi/cbse/playersystem/PlayerControlSystemTest.java
@@ -0,0 +1,123 @@
+package dk.sdu.mmmi.cbse.playersystem;
+
+import dk.sdu.mmmi.cbse.common.bullet.Bullet;
+import dk.sdu.mmmi.cbse.common.bullet.BulletSPI;
+import dk.sdu.mmmi.cbse.common.data.Entity;
+import dk.sdu.mmmi.cbse.common.data.GameData;
+import dk.sdu.mmmi.cbse.common.data.GameKeys;
+import dk.sdu.mmmi.cbse.common.data.World;
+import org.junit.jupiter.api.*;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.ServiceLoader;
+
+import static java.util.stream.Collectors.toList;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class PlayerControlSystemTest {
+ private GameData gameData;
+ private World world;
+ private Entity player;
+ private PlayerControlSystem playerControlSystem;
+ //private GameKeys gameKeys;
+
+ @BeforeEach
+ void setUp() {
+ player = new Player();
+ gameData = new GameData();
+ world = new World();
+ playerControlSystem = new PlayerControlSystem();
+ //gameKeys = new GameKeys();
+
+ player.setPolygonCoordinates(-5, -5, 10, 0, -5, 5);
+ player.setX(100);
+ player.setY(100);
+ player.setRadius(8);
+
+ world.addEntity(player);
+ }
+
+ @AfterEach
+ void tearDown() {
+ }
+
+ @Test
+ void testRotateLeft() {
+ //Describing initial position
+ System.out.println("Initial rotation: " + world.getEntities().iterator().next().getRotation());
+
+ //Processing
+ GameKeys.setKeys(GameKeys.LEFT, true);
+ playerControlSystem.process(gameData, world);
+
+ //Output and assertion
+ System.out.println("Post process rotation: " + world.getEntities().iterator().next().getRotation());
+ assertEquals(-5, world.getEntities().iterator().next().getRotation());
+ }
+
+ @Test
+ void testRotateRight() {
+ //Describing initial position
+ System.out.println("Initial rotation: " + world.getEntities().iterator().next().getRotation());
+
+ //Processing
+ GameKeys.setKeys(GameKeys.LEFT, true);
+ playerControlSystem.process(gameData, world);
+
+ //Output and assertion
+ System.out.println("Post process rotation: " + world.getEntities().iterator().next().getRotation());
+ assertEquals(-5, world.getEntities().iterator().next().getRotation());
+ }
+
+ @Test
+ void testShooting() {
+ Entity bullet = new Bullet();
+
+ // Creating a mock of the BulletSPI, returning the bullet
+ BulletSPI mockBulletSPI = mock(BulletSPI.class);
+ when(mockBulletSPI.createBullet(player, gameData)).thenReturn(bullet);
+
+ playerControlSystem = new PlayerControlSystem() {
+ @Override
+ protected Collection extends BulletSPI> getBulletSPIs(){
+ return List.of(mockBulletSPI);
+ }
+ };
+
+ //The initial amount of entities
+ int initialEntityCount = world.getEntities().size();
+
+ // Processing
+ GameKeys.setKeys(GameKeys.SPACE, true);
+ playerControlSystem.process(gameData, world);
+
+ //Asserting amount of entities
+ int newEntityCount = world.getEntities().size();
+ assertEquals(initialEntityCount + 1, newEntityCount);
+ assertTrue(world.getEntities().contains(bullet));
+ }
+
+ @Test
+ void testMoveUp() {
+ //Describing initial position
+ System.out.println("Initial X: " + player.getX());
+ System.out.println("Initial Y: " + player.getY());
+
+ //Processing
+ GameKeys.setKeys(GameKeys.UP, true);
+ playerControlSystem.process(gameData, world);
+
+ //Output and assertion
+ System.out.println("Post process X: " + player.getX());
+ System.out.println("Post process Y: " + player.getY());
+ assertEquals(101, player.getX());
+ assertEquals(100, player.getY());
+ }
+
+
+}
+
diff --git a/pom.xml b/pom.xml
index 2d5c617..7609641 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,12 +16,51 @@
UTF-8
1.9
1.9
+ 6.1.3
-
-
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+ org.springframework
+ spring-core
+ ${spring.version}
+
+
+ org.springframework
+ spring-beans
+ ${spring.version}
+
+
+ org.springframework
+ spring-aop
+ ${spring.version}
+
+
+ org.springframework
+ spring-expression
+ ${spring.version}
+
+
+ org.springframework
+ spring-jcl
+ ${spring.version}
+
+
+ org.springframework.integration
+ spring-integration-core
+ ${spring.version}
+
+
+ org.springframework
+ spring-web
+ ${spring.version}
+
@@ -138,9 +177,9 @@
Bullet
Collision
Common
- CommonAsteroids
CommonBullet
EnemySpaceShip
Player
+ IntegrationTest