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 getBulletSPIs() { + protected Collection 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 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