From 21f184450170f4d091028852972ba1114579a92e Mon Sep 17 00:00:00 2001
From: khaybar21 <143800306+khaybar21@users.noreply.github.com>
Date: Wed, 21 May 2025 13:15:24 +0200
Subject: [PATCH 1/2] pre Score
iteration before scoresystem
---
.../cbse/asteroid/AsteroidControlSystem.java | 81 ++++++++++++
.../mmmi/cbse/asteroid/AsteroidPlugin.java | 3 +
.../mmmi/cbse/asteroid/AsteroidProcessor.java | 8 +-
.../cbse/asteroid/AsteroidSplitterImpl.java | 37 +++++-
Asteroids/src/main/java/module-info.java | 18 ++-
Bullet/pom.xml | 23 ++++
.../bulletsystem/BulletControlSystem.java | 61 +++++++--
.../mmmi/cbse/bulletsystem/BulletPlugin.java | 1 +
Bullet/src/main/java/module-info.java | 21 ++--
.../test/java/BulletControlSystemTest.java | 26 ++++
Collision/pom.xml | 28 +++++
.../collisionsystem/CollisionDetector.java | 70 ++++++++---
Collision/src/main/java/module-info.java | 12 +-
Common/pom.xml | 4 +
.../dk/sdu/mmmi/cbse/common/data/Entity.java | 13 +-
.../sdu/mmmi/cbse/common/data/GameData.java | 8 +-
Common/src/main/java/module-info.java | 1 +
CommonBullet/src/main/java/module-info.java | 6 +-
Core/pom.xml | 30 +++++
.../main/java/dk/sdu/mmmi/cbse/main/Game.java | 85 +++++++++----
.../main/java/dk/sdu/mmmi/cbse/main/Main.java | 30 +++--
Core/src/main/java/module-info.java | 12 +-
EnemyShips/pom.xml | 33 +++++
.../java/dk/sdu/mmmi/cbse/enemies/Enemy.java | 6 +
.../mmmi/cbse/enemies/EnemyControlSystem.java | 118 ++++++++++++++++++
.../dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java | 75 +++++++++++
EnemyShips/src/main/java/module-info.java | 16 +++
.../playersystem/PlayerControlSystem.java | 6 +-
.../mmmi/cbse/playersystem/PlayerPlugin.java | 33 +++--
Player/src/main/java/module-info.java | 5 +-
pom.xml | 3 +
31 files changed, 751 insertions(+), 122 deletions(-)
create mode 100644 Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidControlSystem.java
create mode 100644 Bullet/src/test/java/BulletControlSystemTest.java
create mode 100644 EnemyShips/pom.xml
create mode 100644 EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/Enemy.java
create mode 100644 EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java
create mode 100644 EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java
create mode 100644 EnemyShips/src/main/java/module-info.java
diff --git a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidControlSystem.java b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidControlSystem.java
new file mode 100644
index 000000000..4824af280
--- /dev/null
+++ b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidControlSystem.java
@@ -0,0 +1,81 @@
+package dk.sdu.mmmi.cbse.asteroid;
+
+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;
+import dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
+
+import java.util.Random;
+
+public class AsteroidControlSystem implements IEntityProcessingService {
+
+ private final Random random = new Random();
+ private final int maxAsteroids = 10; // max asteroids
+ private final float spawnInterval = 1.5f; // Seconds between spawn of asteroid.
+ private float spawnTimer = 0;
+
+ @Override
+ public void process(GameData gameData, World world) {
+ spawnTimer += gameData.getDelta();
+
+ int currentCount = world.getEntities(Asteroid.class).size();
+
+ while (spawnTimer >= spawnInterval && currentCount < maxAsteroids) {
+ Entity asteroid = createAsteroid(gameData);
+ world.addEntity(asteroid);
+ spawnTimer -= spawnInterval;
+ currentCount++;
+ }
+ }
+
+ private Entity createAsteroid(GameData gameData) {
+ Entity asteroid = new Asteroid();
+
+ int size = random.nextInt(20) + 10; // size range
+ asteroid.setPolygonCoordinates(
+ size, -size,
+ -size, -size,
+ -size, size,
+ size, size
+ );
+
+ // spawn point to avoid asteroids spawning anywhere
+ int side = random.nextInt(4);
+ float x, y, rotation;
+ switch (side) {
+ case 0: // Left
+ x = 0;
+ y = random.nextInt(gameData.getDisplayHeight());
+ rotation = random.nextInt(120) - 60;
+ break;
+ case 1: // Right
+ x = gameData.getDisplayWidth();
+ y = random.nextInt(gameData.getDisplayHeight());
+ rotation = 180 + random.nextInt(120) - 60;
+ break;
+ case 2: // Top
+ x = random.nextInt(gameData.getDisplayWidth());
+ y = 0;
+ rotation = 90 + random.nextInt(120) - 60;
+ break;
+ case 3: // Bottom
+ x = random.nextInt(gameData.getDisplayWidth());
+ y = gameData.getDisplayHeight();
+ rotation = 270 + random.nextInt(120) - 60;
+ break;
+ default:
+ x = gameData.getDisplayWidth() / 2f;
+ y = gameData.getDisplayHeight() / 2f;
+ rotation = random.nextInt(360);
+ }
+
+ asteroid.setX(x);
+ asteroid.setY(y);
+ asteroid.setRotation(rotation);
+ asteroid.setRadius(size / 2f);
+ asteroid.setColor(javafx.scene.paint.Color.BLACK);
+
+ return asteroid;
+ }
+}
diff --git a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidPlugin.java b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidPlugin.java
index 9037dbf62..2a1c6bd42 100644
--- a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidPlugin.java
+++ b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidPlugin.java
@@ -5,6 +5,8 @@
import dk.sdu.mmmi.cbse.common.data.GameData;
import dk.sdu.mmmi.cbse.common.data.World;
import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
+import javafx.scene.paint.Color;
+
import java.util.Random;
/**
@@ -29,6 +31,7 @@ public void stop(GameData gameData, World world) {
private Entity createAsteroid(GameData gameData) {
Entity asteroid = new Asteroid();
+ asteroid.setColor(Color.BLACK);
Random rnd = new Random();
int size = rnd.nextInt(10) + 5;
asteroid.setPolygonCoordinates(size, -size, -size, -size, -size, size, size, size);
diff --git a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidProcessor.java b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidProcessor.java
index 898b314ce..daf548dc9 100644
--- a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidProcessor.java
+++ b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidProcessor.java
@@ -13,7 +13,6 @@ public class AsteroidProcessor implements IEntityProcessingService {
@Override
public void process(GameData gameData, World world) {
-
for (Entity asteroid : world.getEntities(Asteroid.class)) {
double changeX = Math.cos(Math.toRadians(asteroid.getRotation()));
double changeY = Math.sin(Math.toRadians(asteroid.getRotation()));
@@ -21,8 +20,9 @@ public void process(GameData gameData, World world) {
asteroid.setX(asteroid.getX() + changeX * 0.5);
asteroid.setY(asteroid.getY() + changeY * 0.5);
+ // ✅ FIXED: Use + instead of -
if (asteroid.getX() < 0) {
- asteroid.setX(asteroid.getX() - gameData.getDisplayWidth());
+ asteroid.setX(asteroid.getX() + gameData.getDisplayWidth());
}
if (asteroid.getX() > gameData.getDisplayWidth()) {
@@ -30,15 +30,13 @@ public void process(GameData gameData, World world) {
}
if (asteroid.getY() < 0) {
- asteroid.setY(asteroid.getY() - gameData.getDisplayHeight());
+ asteroid.setY(asteroid.getY() + gameData.getDisplayHeight());
}
if (asteroid.getY() > gameData.getDisplayHeight()) {
asteroid.setY(asteroid.getY() % gameData.getDisplayHeight());
}
-
}
-
}
/**
diff --git a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidSplitterImpl.java b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidSplitterImpl.java
index 619587ec0..9a5cd1fd5 100644
--- a/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidSplitterImpl.java
+++ b/Asteroids/src/main/java/dk/sdu/mmmi/cbse/asteroid/AsteroidSplitterImpl.java
@@ -1,17 +1,42 @@
package dk.sdu.mmmi.cbse.asteroid;
+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;
-/**
- *
- * @author corfixen
- */
public class AsteroidSplitterImpl implements IAsteroidSplitter {
@Override
- public void createSplitAsteroid(Entity e, World world) {
- }
+ public void createSplitAsteroid(Entity asteroid, World world) {
+ float currentRadius = asteroid.getRadius();
+
+ // Prevent splitting if already small
+ if (currentRadius <= 5) {
+ return;
+ }
+
+
+ float splitRadius = 4f;
+
+ for (int i = 0; i < 2; i++) {
+ Entity smallerAsteroid = new Asteroid();
+ smallerAsteroid.setX(asteroid.getX());
+ smallerAsteroid.setY(asteroid.getY());
+ smallerAsteroid.setRotation((float) (asteroid.getRotation() + (i == 0 ? 20 : -20)));
+
+ smallerAsteroid.setRadius(splitRadius);
+ smallerAsteroid.setPolygonCoordinates(
+ splitRadius, -splitRadius,
+ -splitRadius, -splitRadius,
+ -splitRadius, splitRadius,
+ splitRadius, splitRadius
+ );
+
+ smallerAsteroid.setColor(asteroid.getColor());
+
+ world.addEntity(smallerAsteroid);
+ }
+ }
}
diff --git a/Asteroids/src/main/java/module-info.java b/Asteroids/src/main/java/module-info.java
index d0c86074b..7b4a62e12 100644
--- a/Asteroids/src/main/java/module-info.java
+++ b/Asteroids/src/main/java/module-info.java
@@ -1,9 +1,15 @@
-import dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
-import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
-
module Asteroid {
requires Common;
requires CommonAsteroids;
- provides IGamePluginService with dk.sdu.mmmi.cbse.asteroid.AsteroidPlugin;
- provides IEntityProcessingService with dk.sdu.mmmi.cbse.asteroid.AsteroidProcessor;
-}
\ No newline at end of file
+ requires javafx.graphics;
+
+ provides dk.sdu.mmmi.cbse.common.services.IGamePluginService
+ with dk.sdu.mmmi.cbse.asteroid.AsteroidPlugin;
+
+ provides dk.sdu.mmmi.cbse.common.services.IEntityProcessingService
+ with dk.sdu.mmmi.cbse.asteroid.AsteroidProcessor,
+ dk.sdu.mmmi.cbse.asteroid.AsteroidControlSystem;
+
+ provides dk.sdu.mmmi.cbse.common.asteroids.IAsteroidSplitter
+ with dk.sdu.mmmi.cbse.asteroid.AsteroidSplitterImpl;
+}
diff --git a/Bullet/pom.xml b/Bullet/pom.xml
index 161296b46..e55666569 100644
--- a/Bullet/pom.xml
+++ b/Bullet/pom.xml
@@ -9,6 +9,13 @@
Bullet
jar
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.10.0
+ test
+
+
${project.groupId}
Common
@@ -19,5 +26,21 @@
CommonBullet
${project.version}
+
+ org.testng
+ testng
+ RELEASE
+ compile
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.1.2
+
+
+
+
\ No newline at end of file
diff --git a/Bullet/src/main/java/dk/sdu/mmmi/cbse/bulletsystem/BulletControlSystem.java b/Bullet/src/main/java/dk/sdu/mmmi/cbse/bulletsystem/BulletControlSystem.java
index 11cb52376..a9c158fa0 100644
--- a/Bullet/src/main/java/dk/sdu/mmmi/cbse/bulletsystem/BulletControlSystem.java
+++ b/Bullet/src/main/java/dk/sdu/mmmi/cbse/bulletsystem/BulletControlSystem.java
@@ -6,30 +6,65 @@
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 javafx.scene.paint.Color;
+
+import java.util.*;
public class BulletControlSystem implements IEntityProcessingService, BulletSPI {
+ private static final float MAX_LIFETIME = 1.5f; // Bullets disappear after 1.5 seconds
+ private static final float BULLET_SPEED = 10f; // How fast bullets move per frame
+
+ // Keeps track of how long each bullet has existed
+ private final Map bulletTimers = new HashMap<>();
+
@Override
public void process(GameData gameData, World world) {
+ List expiredBullets = new ArrayList<>();
for (Entity bullet : world.getEntities(Bullet.class)) {
- double changeX = Math.cos(Math.toRadians(bullet.getRotation()));
- double changeY = Math.sin(Math.toRadians(bullet.getRotation()));
- bullet.setX(bullet.getX() + changeX * 3);
- bullet.setY(bullet.getY() + changeY * 3);
+ // Move the bullet forward based on its direction and speed
+ double radians = Math.toRadians(bullet.getRotation());
+ bullet.setX(bullet.getX() + Math.cos(radians) * BULLET_SPEED);
+ bullet.setY(bullet.getY() + Math.sin(radians) * BULLET_SPEED);
+
+ // Update how long this bullet has been alive
+ float newLifetime = bulletTimers.getOrDefault(bullet, 0f) + gameData.getDelta();
+ bulletTimers.put(bullet, newLifetime);
+
+ // Mark bullets that lived too long for removal
+ if (newLifetime >= MAX_LIFETIME) {
+ expiredBullets.add(bullet);
+ }
+ }
+
+ // remove expired bullets
+ for (Entity expired : expiredBullets) {
+ bulletTimers.remove(expired);
+ world.removeEntity(expired);
}
}
@Override
public Entity createBullet(Entity shooter, GameData gameData) {
- Entity bullet = new Bullet();
- bullet.setPolygonCoordinates(1, -1, 1, 1, -1, 1, -1, -1);
- double changeX = Math.cos(Math.toRadians(shooter.getRotation()));
- double changeY = Math.sin(Math.toRadians(shooter.getRotation()));
- bullet.setX(shooter.getX() + changeX * 10);
- bullet.setY(shooter.getY() + changeY * 10);
- bullet.setRotation(shooter.getRotation());
- bullet.setRadius(1);
- return bullet;
+ Entity newBullet = new Bullet();
+
+ // bullet shape
+ newBullet.setPolygonCoordinates(0, -2, 1, -1, 1, 1, 0, 2, -1, 1, -1, -1);
+
+
+ double angle = Math.toRadians(shooter.getRotation());
+ newBullet.setX(shooter.getX() + Math.cos(angle) * 3);
+ newBullet.setY(shooter.getY() + Math.sin(angle) * 3);
+
+ newBullet.setRotation(shooter.getRotation());
+ newBullet.setRadius(1); // For collision detection
+
+ newBullet.setColor(Color.YELLOW); // Bullet color
+
+ // Start the bullet's lifetime timer at 0
+ bulletTimers.put(newBullet, 0f);
+
+ return newBullet;
}
}
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
index 93dced409..6ef74fa0a 100644
--- a/Bullet/src/main/java/dk/sdu/mmmi/cbse/bulletsystem/BulletPlugin.java
+++ b/Bullet/src/main/java/dk/sdu/mmmi/cbse/bulletsystem/BulletPlugin.java
@@ -20,6 +20,7 @@ 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 fc255be6f..979b96d41 100644
--- a/Bullet/src/main/java/module-info.java
+++ b/Bullet/src/main/java/module-info.java
@@ -1,11 +1,16 @@
-import dk.sdu.mmmi.cbse.common.bullet.BulletSPI;
-import dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
-import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
-
module Bullet {
requires Common;
requires CommonBullet;
- 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
+ requires javafx.graphics;
+
+ exports dk.sdu.mmmi.cbse.bulletsystem;
+
+ provides dk.sdu.mmmi.cbse.common.services.IGamePluginService
+ with dk.sdu.mmmi.cbse.bulletsystem.BulletPlugin;
+
+ provides dk.sdu.mmmi.cbse.common.bullet.BulletSPI
+ with dk.sdu.mmmi.cbse.bulletsystem.BulletControlSystem;
+
+ provides dk.sdu.mmmi.cbse.common.services.IEntityProcessingService
+ with dk.sdu.mmmi.cbse.bulletsystem.BulletControlSystem;
+}
diff --git a/Bullet/src/test/java/BulletControlSystemTest.java b/Bullet/src/test/java/BulletControlSystemTest.java
new file mode 100644
index 000000000..6fd8c1ac5
--- /dev/null
+++ b/Bullet/src/test/java/BulletControlSystemTest.java
@@ -0,0 +1,26 @@
+package dk.sdu.mmmi.cbse.bulletsystem;
+
+import dk.sdu.mmmi.cbse.common.data.Entity;
+import dk.sdu.mmmi.cbse.common.data.GameData;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+class BulletControlSystemTest {
+
+ private final BulletControlSystem system = new BulletControlSystem();
+
+ @Test
+ void createsBulletCorrectly() {
+ Entity shooter = new Entity();
+ shooter.setX(100);
+ shooter.setY(200);
+ shooter.setRotation(90);
+
+ Entity bullet = system.createBullet(shooter, new GameData());
+
+ assertNotNull(bullet);
+ assertEquals(90, bullet.getRotation(), 0.1);
+ assertEquals(1, bullet.getRadius(), 0.1);
+ assertTrue(bullet.getY() > 200); // moving down if rotation is 90 degrees
+ }
+}
diff --git a/Collision/pom.xml b/Collision/pom.xml
index 4ba9b5911..16d62e9bc 100644
--- a/Collision/pom.xml
+++ b/Collision/pom.xml
@@ -14,5 +14,33 @@
Common
${project.version}
+
+ ${project.groupId}
+ Bullet
+ ${project.version}
+
+
+ ${project.groupId}
+ CommonBullet
+ ${project.version}
+
+
+ ${project.groupId}
+ Player
+ ${project.version}
+
+
+ ${project.groupId}
+ CommonAsteroids
+ ${project.version}
+
+
+ ${project.groupId}
+ Enemy
+ 1.0.1-SNAPSHOT
+ true
+
+
+
\ No newline at end of file
diff --git a/Collision/src/main/java/dk/sdu/mmmi/cbse/collisionsystem/CollisionDetector.java b/Collision/src/main/java/dk/sdu/mmmi/cbse/collisionsystem/CollisionDetector.java
index 16ba08fdc..4fb648c81 100644
--- a/Collision/src/main/java/dk/sdu/mmmi/cbse/collisionsystem/CollisionDetector.java
+++ b/Collision/src/main/java/dk/sdu/mmmi/cbse/collisionsystem/CollisionDetector.java
@@ -1,41 +1,81 @@
package dk.sdu.mmmi.cbse.collisionsystem;
+import dk.sdu.mmmi.cbse.common.asteroids.Asteroid;
+import dk.sdu.mmmi.cbse.common.asteroids.IAsteroidSplitter;
+import dk.sdu.mmmi.cbse.common.bullet.Bullet;
import dk.sdu.mmmi.cbse.common.services.IPostEntityProcessingService;
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 java.util.ServiceLoader;
+
public class CollisionDetector implements IPostEntityProcessingService {
- public CollisionDetector() {
- }
+ private final ServiceLoader asteroidSplitterLoader = ServiceLoader.load(IAsteroidSplitter.class);
@Override
public void process(GameData gameData, World world) {
- // two for loops for all entities in the world
for (Entity entity1 : world.getEntities()) {
for (Entity entity2 : world.getEntities()) {
-
- // if the two entities are identical, skip the iteration
if (entity1.getID().equals(entity2.getID())) {
- continue;
+ continue;
}
- // CollisionDetection
- if (this.collides(entity1, entity2)) {
- world.removeEntity(entity1);
- world.removeEntity(entity2);
+ if (collides(entity1, entity2)) {
+ handleCollision(entity1, entity2, world);
}
}
}
-
}
- public Boolean collides(Entity entity1, Entity entity2) {
- float dx = (float) entity1.getX() - (float) entity2.getX();
- float dy = (float) entity1.getY() - (float) entity2.getY();
+ private boolean collides(Entity e1, Entity e2) {
+ float dx = (float) (e1.getX() - e2.getX());
+ float dy = (float) (e1.getY() - e2.getY());
float distance = (float) Math.sqrt(dx * dx + dy * dy);
- return distance < (entity1.getRadius() + entity2.getRadius());
+ return distance < (e1.getRadius() + e2.getRadius());
}
+ private void handleCollision(Entity e1, Entity e2, World world) {
+ String c1 = e1.getClass().getSimpleName();
+ String c2 = e2.getClass().getSimpleName();
+
+ boolean isBullet = e1 instanceof Bullet || e2 instanceof Bullet;
+ boolean isAsteroid = e1 instanceof Asteroid || e2 instanceof Asteroid;
+ boolean isPlayer = c1.equals("Player") || c2.equals("Player");
+ boolean isEnemy = c1.equals("Enemy") || c2.equals("Enemy");
+
+ // Bullet hits asteroid
+ if ((e1 instanceof Bullet && e2 instanceof Asteroid) || (e2 instanceof Bullet && e1 instanceof Asteroid)) {
+ Entity asteroid = e1 instanceof Asteroid ? e1 : e2;
+ createAsteroidSplit(asteroid, world);
+ world.removeEntity(asteroid);
+ world.removeEntity(e1);
+ world.removeEntity(e2);
+ }
+
+ // Bullet hits enemy or player
+ else if (isBullet && (isEnemy || isPlayer)) {
+ world.removeEntity(e1);
+ world.removeEntity(e2);
+ }
+
+ // Asteroid hits player or enemy
+ else if (isAsteroid && (isPlayer || isEnemy)) {
+ world.removeEntity(e1);
+ world.removeEntity(e2);
+ }
+
+ // Enemy hits player
+ else if (isEnemy && isPlayer) {
+ world.removeEntity(e1);
+ world.removeEntity(e2);
+ }
+ }
+
+ private void createAsteroidSplit(Entity asteroid, World world) {
+ for (IAsteroidSplitter splitter : asteroidSplitterLoader) {
+ splitter.createSplitAsteroid(asteroid, world);
+ }
+ }
}
diff --git a/Collision/src/main/java/module-info.java b/Collision/src/main/java/module-info.java
index b347302f3..e3b45cf9a 100644
--- a/Collision/src/main/java/module-info.java
+++ b/Collision/src/main/java/module-info.java
@@ -1,6 +1,14 @@
import dk.sdu.mmmi.cbse.common.services.IPostEntityProcessingService;
module Collision {
- requires Common;
- provides IPostEntityProcessingService with dk.sdu.mmmi.cbse.collisionsystem.CollisionDetector;
+ requires Common;
+ requires Bullet;
+ requires CommonBullet;
+ requires Player;
+ requires CommonAsteroids;
+
+ uses dk.sdu.mmmi.cbse.common.asteroids.IAsteroidSplitter;
+
+ provides dk.sdu.mmmi.cbse.common.services.IPostEntityProcessingService
+ with dk.sdu.mmmi.cbse.collisionsystem.CollisionDetector;
}
\ No newline at end of file
diff --git a/Common/pom.xml b/Common/pom.xml
index b8b5ad1e3..984a3160d 100644
--- a/Common/pom.xml
+++ b/Common/pom.xml
@@ -11,6 +11,10 @@
Common
+
+ org.openjfx
+ javafx-graphics
+
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 6cef2d0b4..7e199cd9d 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
@@ -2,6 +2,8 @@
import java.io.Serializable;
import java.util.UUID;
+import javafx.scene.paint.Color;
+
public class Entity implements Serializable {
@@ -12,7 +14,16 @@ public class Entity implements Serializable {
private double y;
private double rotation;
private float radius;
-
+
+ private Color color = Color.WHITE; // default is white
+
+ public Color getColor() {
+ return color;
+ }
+
+ public void setColor(Color color) {
+ this.color = color;
+ }
public String getID() {
return ID.toString();
diff --git a/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/GameData.java b/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/GameData.java
index 606185220..dcd792d51 100644
--- a/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/GameData.java
+++ b/Common/src/main/java/dk/sdu/mmmi/cbse/common/data/GameData.java
@@ -5,6 +5,7 @@ public class GameData {
private int displayWidth = 800 ;
private int displayHeight = 800;
private final GameKeys keys = new GameKeys();
+ private float delta = 0;
public GameKeys getKeys() {
@@ -26,6 +27,11 @@ public void setDisplayHeight(int height) {
public int getDisplayHeight() {
return displayHeight;
}
+ public float getDelta() {
+ return delta;
+ }
-
+ public void setDelta(float delta) {
+ this.delta = delta;
+ }
}
diff --git a/Common/src/main/java/module-info.java b/Common/src/main/java/module-info.java
index 42abfb8c8..e32d96811 100644
--- a/Common/src/main/java/module-info.java
+++ b/Common/src/main/java/module-info.java
@@ -1,4 +1,5 @@
module Common {
+ requires javafx.graphics;
exports dk.sdu.mmmi.cbse.common.services;
exports dk.sdu.mmmi.cbse.common.data;
exports dk.sdu.mmmi.cbse.common.util;
diff --git a/CommonBullet/src/main/java/module-info.java b/CommonBullet/src/main/java/module-info.java
index 37eedf885..0f98c7d2f 100644
--- a/CommonBullet/src/main/java/module-info.java
+++ b/CommonBullet/src/main/java/module-info.java
@@ -1,4 +1,6 @@
module CommonBullet {
- requires Common;
exports dk.sdu.mmmi.cbse.common.bullet;
-}
\ No newline at end of file
+ requires Common;
+
+
+}
diff --git a/Core/pom.xml b/Core/pom.xml
index 4242d55e3..b7e859563 100644
--- a/Core/pom.xml
+++ b/Core/pom.xml
@@ -24,6 +24,23 @@
+
+ dk.sdu.mmmi.cbse
+ Bullet
+ ${project.version}
+
+
+ dk.sdu.mmmi.cbse
+ Player
+ ${project.version}
+
+
+
+ dk.sdu.mmmi.cbse
+ Collision
+ ${project.version}
+
+
org.openjfx
javafx-controls
@@ -73,6 +90,19 @@
org.springframework
spring-jcl
+
+ dk.sdu.mmmi.cbse
+ Enemy
+ 1.0.1-SNAPSHOT
+ true
+
+
+
+ dk.sdu.mmmi.cbse
+ Asteroids
+ 1.0.1-SNAPSHOT
+ compile
+
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
index 9648ea4c3..08020ad74 100644
--- a/Core/src/main/java/dk/sdu/mmmi/cbse/main/Game.java
+++ b/Core/src/main/java/dk/sdu/mmmi/cbse/main/Game.java
@@ -19,16 +19,24 @@
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
+import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import java.util.Set;
+import java.util.HashSet;
/**
*
* @author jcs
*/
class Game {
+ private int enemyKills = 0;
+ private int asteroidKills = 0;
+
+ private final Text asteroidKillText = new Text(10, 20, "Asteroids destroyed: 0");
+ private final Text enemyKillText = new Text(10, 40, "Enemies destroyed: 0");
private final GameData gameData = new GameData();
private final World world = new World();
@@ -45,9 +53,8 @@ class Game {
}
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);
+ gameWindow.getChildren().addAll(asteroidKillText, enemyKillText);
Scene scene = new Scene(gameWindow);
scene.setOnKeyPressed(event -> {
@@ -77,18 +84,20 @@ public void start(Stage window) throws Exception {
if (event.getCode().equals(KeyCode.SPACE)) {
gameData.getKeys().setKey(GameKeys.SPACE, false);
}
-
});
- // Lookup all Game Plugins using ServiceLoader
- for (IGamePluginService iGamePlugin : getGamePluginServices()) {
- iGamePlugin.start(gameData, world);
+ for (IGamePluginService plugin : gamePluginServices) {
+ plugin.start(gameData, world);
}
+
for (Entity entity : world.getEntities()) {
Polygon polygon = new Polygon(entity.getPolygonCoordinates());
+ polygon.setFill(entity.getColor());
+ polygon.setStroke(Color.BLACK);
polygons.put(entity, polygon);
gameWindow.getChildren().add(polygon);
}
+
window.setScene(scene);
window.setTitle("ASTEROIDS");
window.show();
@@ -96,46 +105,73 @@ public void start(Stage window) throws Exception {
public void render() {
new AnimationTimer() {
+ private long lastUpdate = 0;
+
@Override
public void handle(long now) {
+ if (lastUpdate > 0) {
+ float deltaSeconds = (now - lastUpdate) / 1_000_000_000f;
+ gameData.setDelta(deltaSeconds);
+ }
+ lastUpdate = now;
+
update();
draw();
gameData.getKeys().update();
}
-
}.start();
}
private void update() {
- for (IEntityProcessingService entityProcessorService : getEntityProcessingServices()) {
- entityProcessorService.process(gameData, world);
+ for (IEntityProcessingService processor : entityProcessingServiceList) {
+ processor.process(gameData, world);
}
- for (IPostEntityProcessingService postEntityProcessorService : getPostEntityProcessingServices()) {
- postEntityProcessorService.process(gameData, world);
+ for (IPostEntityProcessingService postProcessor : postEntityProcessingServices) {
+ postProcessor.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);
+ Set toRemove = new HashSet<>();
+
+ for (Entity e : polygons.keySet()) {
+ if (!world.getEntities().contains(e)) {
+ String className = e.getClass().getSimpleName();
+
+ if (className.equalsIgnoreCase("Enemy")) {
+ enemyKills++;
+ enemyKillText.setText("Enemies destroyed: " + enemyKills);
+ } else if (className.equalsIgnoreCase("Asteroid")) {
+ asteroidKills++;
+ asteroidKillText.setText("Asteroids destroyed: " + asteroidKills);
+ }
+
+ Polygon p = polygons.get(e);
+ if (p != null) {
+ gameWindow.getChildren().remove(p);
+ }
+ toRemove.add(e);
}
}
- for (Entity entity : world.getEntities()) {
- Polygon polygon = polygons.get(entity);
+ for (Entity e : toRemove) {
+ polygons.remove(e);
+ }
+
+ for (Entity e : world.getEntities()) {
+ Polygon polygon = polygons.get(e);
if (polygon == null) {
- polygon = new Polygon(entity.getPolygonCoordinates());
- polygons.put(entity, polygon);
+ polygon = new Polygon(e.getPolygonCoordinates());
+ polygon.setFill(e.getColor());
+ polygon.setStroke(Color.BLACK);
+ polygons.put(e, polygon);
gameWindow.getChildren().add(polygon);
}
- polygon.setTranslateX(entity.getX());
- polygon.setTranslateY(entity.getY());
- polygon.setRotate(entity.getRotation());
- }
+ polygon.setTranslateX(e.getX());
+ polygon.setTranslateY(e.getY());
+ polygon.setRotate(e.getRotation());
+ }
}
public List getGamePluginServices() {
@@ -149,5 +185,4 @@ public List getEntityProcessingServices() {
public List getPostEntityProcessingServices() {
return postEntityProcessingServices;
}
-
}
diff --git a/Core/src/main/java/dk/sdu/mmmi/cbse/main/Main.java b/Core/src/main/java/dk/sdu/mmmi/cbse/main/Main.java
index 92c71ab7d..597ccc1be 100644
--- a/Core/src/main/java/dk/sdu/mmmi/cbse/main/Main.java
+++ b/Core/src/main/java/dk/sdu/mmmi/cbse/main/Main.java
@@ -6,25 +6,31 @@
public class Main extends Application {
-
+ private AnnotationConfigApplicationContext context;
public static void main(String[] args) {
- launch(Main.class);
+ launch(args);
}
@Override
- public void start(Stage window) throws Exception {
-
- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ModuleConfig.class);
+ public void start(Stage stage) throws Exception {
+
+
+ // Spring
+ context = new AnnotationConfigApplicationContext(ModuleConfig.class);
- for (String beanName : ctx.getBeanDefinitionNames()) {
- System.out.println(beanName);
- }
-
- Game game = ctx.getBean(Game.class);
- game.start(window);
- game.render();
+ Game game = context.getBean(Game.class);
+
+ // Start game
+ game.start(stage);
+ game.render();
}
+ @Override
+ public void stop() throws Exception {
+ if (context != null) {
+ context.close();
+ }
+ }
}
diff --git a/Core/src/main/java/module-info.java b/Core/src/main/java/module-info.java
index 8b2d21c22..69df7323d 100644
--- a/Core/src/main/java/module-info.java
+++ b/Core/src/main/java/module-info.java
@@ -1,16 +1,20 @@
module Core {
requires Common;
+ requires CommonBullet;
- requires CommonBullet;
- requires javafx.graphics;
+ requires javafx.graphics;
requires spring.context;
requires spring.core;
requires spring.beans;
+ requires CommonAsteroids;
+ requires Asteroid;
+
+
exports dk.sdu.mmmi.cbse.main;
- opens dk.sdu.mmmi.cbse.main to javafx.graphics,spring.core;
+ 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/EnemyShips/pom.xml b/EnemyShips/pom.xml
new file mode 100644
index 000000000..2b767cab2
--- /dev/null
+++ b/EnemyShips/pom.xml
@@ -0,0 +1,33 @@
+
+
+ 4.0.0
+
+ dk.sdu.mmmi.cbse
+ asteroids.jpms
+ 1.0.1-SNAPSHOT
+
+
+ Enemy
+ jar
+
+
+ dk.sdu.mmmi.cbse
+ Bullet
+ 1.0.1-SNAPSHOT
+
+
+
+ dk.sdu.mmmi.cbse
+ Common
+ 1.0.1-SNAPSHOT
+
+
+ dk.sdu.mmmi.cbse
+ CommonBullet
+ 1.0.1-SNAPSHOT
+
+
+
+
\ No newline at end of file
diff --git a/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/Enemy.java b/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/Enemy.java
new file mode 100644
index 000000000..dc060d82f
--- /dev/null
+++ b/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/Enemy.java
@@ -0,0 +1,6 @@
+package dk.sdu.mmmi.cbse.enemies;
+
+import dk.sdu.mmmi.cbse.common.data.Entity;
+
+public class Enemy extends Entity {
+}
\ No newline at end of file
diff --git a/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java b/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java
new file mode 100644
index 000000000..bd15c7ede
--- /dev/null
+++ b/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java
@@ -0,0 +1,118 @@
+package dk.sdu.mmmi.cbse.enemies;
+
+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.World;
+import dk.sdu.mmmi.cbse.common.services.IEntityProcessingService;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.ServiceLoader;
+
+import static java.util.stream.Collectors.toList;
+
+public class EnemyControlSystem implements IEntityProcessingService {
+
+ private final Random random = new Random();
+ private final int maxEnemies = 5;
+ private final float spawnInterval = 1f;
+ private float spawnTimer = 0;
+
+ // Per-enemy state tracking
+ private final Map directionChangeTimers = new HashMap<>();
+ private final Map shootCooldownTimers = new HashMap<>();
+
+ @Override
+ public void process(GameData gameData, World world) {
+ spawnTimer += gameData.getDelta();
+ spawnEnemiesAggressively(gameData, world);
+
+ for (Entity enemy : world.getEntities(Enemy.class)) {
+ handleMovement(enemy, gameData);
+ handleBounds(enemy, gameData);
+ maybeShoot(enemy, gameData, world);
+ }
+
+ // Clean up memory if enemies are destroyed
+ directionChangeTimers.keySet().removeIf(e -> !world.getEntities().contains(e));
+ shootCooldownTimers.keySet().removeIf(e -> !world.getEntities().contains(e));
+ }
+
+ private void spawnEnemiesAggressively(GameData gameData, World world) {
+ int currentCount = world.getEntities(Enemy.class).size();
+
+ while (currentCount < maxEnemies && spawnTimer >= spawnInterval) {
+ Entity newEnemy = new EnemyPlugin().createEnemy(gameData);
+ world.addEntity(newEnemy);
+
+ // Initialize per-enemy timers
+ directionChangeTimers.put(newEnemy, 0f);
+ shootCooldownTimers.put(newEnemy, 0f);
+
+ spawnTimer -= spawnInterval;
+ currentCount++;
+ }
+ }
+
+ private void handleMovement(Entity enemy, GameData gameData) {
+ float timer = directionChangeTimers.getOrDefault(enemy, 0f);
+ timer += gameData.getDelta();
+
+ // Random direction change every 1,5 seconds
+ if (timer >= 1.5f) {
+ int direction = random.nextBoolean() ? 1 : -1;
+ enemy.setRotation(enemy.getRotation() + direction * (5 + random.nextInt(6))); // 5–10 degrees
+ timer = 0f;
+ }
+ directionChangeTimers.put(enemy, timer);
+
+ // move forward
+ double radians = Math.toRadians(enemy.getRotation());
+ enemy.setX(enemy.getX() + Math.cos(radians));
+ enemy.setY(enemy.getY() + Math.sin(radians));
+ }
+
+ private void handleBounds(Entity enemy, GameData gameData) {
+ boolean bounced = false;
+
+ if (enemy.getX() < 0 || enemy.getX() > gameData.getDisplayWidth()) {
+ bounced = true;
+ enemy.setX(Math.max(0, Math.min(enemy.getX(), gameData.getDisplayWidth())));
+ }
+
+ if (enemy.getY() < 0 || enemy.getY() > gameData.getDisplayHeight()) {
+ bounced = true;
+ enemy.setY(Math.max(0, Math.min(enemy.getY(), gameData.getDisplayHeight())));
+ }
+
+ if (bounced) {
+ enemy.setRotation(enemy.getRotation() + 180);
+ }
+ }
+
+ private void maybeShoot(Entity enemy, GameData gameData, World world) {
+ float shootTimer = shootCooldownTimers.getOrDefault(enemy, 0f);
+ shootTimer += gameData.getDelta();
+
+ if (shootTimer >= 2.5f) {
+ if (random.nextDouble() < 0.2) { // 20% chance to shoot
+ getBulletSPIs().stream().findFirst().ifPresent(spi ->
+ world.addEntity(spi.createBullet(enemy, gameData))
+ );
+ }
+ shootTimer = 0f;
+ }
+
+ shootCooldownTimers.put(enemy, shootTimer);
+ }
+
+ private Collection extends BulletSPI> getBulletSPIs() {
+ return ServiceLoader.load(BulletSPI.class)
+ .stream()
+ .map(ServiceLoader.Provider::get)
+ .collect(toList());
+ }
+}
diff --git a/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java b/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java
new file mode 100644
index 000000000..5a6954740
--- /dev/null
+++ b/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java
@@ -0,0 +1,75 @@
+package dk.sdu.mmmi.cbse.enemies;
+
+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;
+import javafx.scene.paint.Color;
+
+import java.util.Random;
+
+public class EnemyPlugin implements IGamePluginService {
+
+ private Entity enemy;
+
+ @Override
+ public void start(GameData gameData, World world) {
+ enemy = createEnemy(gameData);
+ world.addEntity(enemy);
+ }
+
+ Entity createEnemy(GameData gameData) {
+ Entity enemyShip = new Enemy();
+
+ Random random = new Random();
+ float x, y;
+ float rotation;
+
+ int side = random.nextInt(4); // 0 = left, 1 = right, 2 = top, 3 = bottom
+
+ switch (side) {
+ case 0: // Left edge
+ x = 0;
+ y = random.nextInt(gameData.getDisplayHeight());
+ rotation = random.nextInt(120) - 60; // Aim rightward
+ break;
+ case 1: // Right edge
+ x = gameData.getDisplayWidth();
+ y = random.nextInt(gameData.getDisplayHeight());
+ rotation = 180 + random.nextInt(120) - 60; // Aim leftward
+ break;
+ case 2: // Top edge
+ x = random.nextInt(gameData.getDisplayWidth());
+ y = 0;
+ rotation = 90 + random.nextInt(120) - 60; // Aim downward
+ break;
+ case 3: // Bottom edge
+ x = random.nextInt(gameData.getDisplayWidth());
+ y = gameData.getDisplayHeight();
+ rotation = 270 + random.nextInt(120) - 60; // Aim upward
+ break;
+ default:
+ x = gameData.getDisplayWidth() / 2f;
+ y = gameData.getDisplayHeight() / 2f;
+ rotation = random.nextInt(360);
+ }
+
+ enemyShip.setX(x);
+ enemyShip.setY(y);
+ enemyShip.setRotation(rotation);
+ enemyShip.setRadius(10);
+
+ // enemy shape
+ enemyShip.setPolygonCoordinates(-5, -5, 10, 0, -5, 5);
+
+ // enemy color
+ enemyShip.setColor(Color.RED);
+
+ return enemyShip;
+ }
+
+ @Override
+ public void stop(GameData gameData, World world) {
+ world.removeEntity(enemy);
+ }
+}
diff --git a/EnemyShips/src/main/java/module-info.java b/EnemyShips/src/main/java/module-info.java
new file mode 100644
index 000000000..6738f35cd
--- /dev/null
+++ b/EnemyShips/src/main/java/module-info.java
@@ -0,0 +1,16 @@
+module Enemy {
+ exports dk.sdu.mmmi.cbse.enemies;
+
+ requires Common;
+ requires CommonBullet;
+ requires Bullet;
+ requires javafx.graphics;
+
+ provides dk.sdu.mmmi.cbse.common.services.IGamePluginService
+ with dk.sdu.mmmi.cbse.enemies.EnemyPlugin;
+
+ provides dk.sdu.mmmi.cbse.common.services.IEntityProcessingService
+ with dk.sdu.mmmi.cbse.enemies.EnemyControlSystem;
+
+ uses dk.sdu.mmmi.cbse.common.bullet.BulletSPI;
+}
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 4a8039f81..4d85185c3 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
@@ -32,12 +32,12 @@ public void process(GameData gameData, World world) {
player.setX(player.getX() + changeX);
player.setY(player.getY() + changeY);
}
- if(gameData.getKeys().isDown(GameKeys.SPACE)) {
+ if(gameData.getKeys().isDown(GameKeys.SPACE)) {
getBulletSPIs().stream().findFirst().ifPresent(
spi -> {world.addEntity(spi.createBullet(player, gameData));}
);
}
-
+
if (player.getX() < 0) {
player.setX(1);
}
@@ -62,3 +62,5 @@ private 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 6a0fe84e7..97cb2741b 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
@@ -4,35 +4,30 @@
import dk.sdu.mmmi.cbse.common.data.GameData;
import dk.sdu.mmmi.cbse.common.data.World;
import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
+import javafx.scene.paint.Color;
+
public class PlayerPlugin implements IGamePluginService {
private Entity player;
- public PlayerPlugin() {
- }
-
@Override
- public void start(GameData gameData, World world) {
-
- // Add entities to the world
- player = createPlayerShip(gameData);
+ public void start(GameData data, World world) {
+ player = initPlayer(data);
+ player.setColor(Color.DARKGRAY);
world.addEntity(player);
}
- private Entity createPlayerShip(GameData gameData) {
-
- Entity playerShip = new Player();
- playerShip.setPolygonCoordinates(-5,-5,10,0,-5,5);
- playerShip.setX(gameData.getDisplayHeight()/2);
- playerShip.setY(gameData.getDisplayWidth()/2);
- playerShip.setRadius(8);
- return playerShip;
- }
-
@Override
- public void stop(GameData gameData, World world) {
- // Remove entities
+ public void stop(GameData data, World world) {
world.removeEntity(player);
}
+ private Entity initPlayer(GameData data) {
+ Entity p = new Player();
+ p.setPolygonCoordinates(-6, -5, 10, 0, -6, 5);
+ p.setX(data.getDisplayWidth() * 0.5f);
+ p.setY(data.getDisplayHeight() * 0.5f);
+ p.setRadius(8);
+ return p;
+ }
}
diff --git a/Player/src/main/java/module-info.java b/Player/src/main/java/module-info.java
index 5694901da..fc9dae06a 100644
--- a/Player/src/main/java/module-info.java
+++ b/Player/src/main/java/module-info.java
@@ -3,8 +3,11 @@
import dk.sdu.mmmi.cbse.common.services.IGamePluginService;
module Player {
+
+ exports dk.sdu.mmmi.cbse.playersystem;
requires Common;
- requires CommonBullet;
+ requires CommonBullet;
+ requires javafx.graphics;
uses dk.sdu.mmmi.cbse.common.bullet.BulletSPI;
provides IGamePluginService with dk.sdu.mmmi.cbse.playersystem.PlayerPlugin;
provides IEntityProcessingService with dk.sdu.mmmi.cbse.playersystem.PlayerControlSystem;
diff --git a/pom.xml b/pom.xml
index 7b6de18c0..575a14e77 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,6 +19,9 @@
CommonAsteroids
Asteroids
Collision
+ EnemyShips
+
+
java
From 7857fdb3b09d27d040d3ec930064e72d7564eff2 Mon Sep 17 00:00:00 2001
From: khaybar21 <143800306+khaybar21@users.noreply.github.com>
Date: Sun, 1 Jun 2025 11:51:35 +0200
Subject: [PATCH 2/2] Split Package Task
---
Collision/pom.xml | 7 +------
Core/pom.xml | 7 +------
.../mmmi/cbse/playersystem/{Player.java => NewEntity.java} | 2 +-
{EnemyShips => plugins/EnemyShips}/pom.xml | 0
.../java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java | 0
.../main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java | 0
.../src/main/java/dk/sdu/mmmi/cbse/enemies/NewEntity.java | 2 +-
.../EnemyShips}/src/main/java/module-info.java | 0
plugins/EnemyShips/target/maven-archiver/pom.properties | 3 +++
.../compile/default-compile/createdFiles.lst | 4 ++++
.../compile/default-compile/inputFiles.lst | 4 ++++
pom.xml | 2 +-
12 files changed, 16 insertions(+), 15 deletions(-)
rename Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/{Player.java => NewEntity.java} (74%)
rename {EnemyShips => plugins/EnemyShips}/pom.xml (100%)
rename {EnemyShips => plugins/EnemyShips}/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java (100%)
rename {EnemyShips => plugins/EnemyShips}/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java (100%)
rename EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/Enemy.java => plugins/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/NewEntity.java (66%)
rename {EnemyShips => plugins/EnemyShips}/src/main/java/module-info.java (100%)
create mode 100644 plugins/EnemyShips/target/maven-archiver/pom.properties
create mode 100644 plugins/EnemyShips/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
create mode 100644 plugins/EnemyShips/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
diff --git a/Collision/pom.xml b/Collision/pom.xml
index 16d62e9bc..4d304651e 100644
--- a/Collision/pom.xml
+++ b/Collision/pom.xml
@@ -34,12 +34,7 @@
CommonAsteroids
${project.version}
-
- ${project.groupId}
- Enemy
- 1.0.1-SNAPSHOT
- true
-
+
diff --git a/Core/pom.xml b/Core/pom.xml
index b7e859563..f5557c778 100644
--- a/Core/pom.xml
+++ b/Core/pom.xml
@@ -90,12 +90,7 @@
org.springframework
spring-jcl
-
- dk.sdu.mmmi.cbse
- Enemy
- 1.0.1-SNAPSHOT
- true
-
+
dk.sdu.mmmi.cbse
diff --git a/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/Player.java b/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/NewEntity.java
similarity index 74%
rename from Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/Player.java
rename to Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/NewEntity.java
index 4b7590b1c..f7f84efc0 100644
--- a/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/Player.java
+++ b/Player/src/main/java/dk/sdu/mmmi/cbse/playersystem/NewEntity.java
@@ -6,6 +6,6 @@
*
* @author Emil
*/
-public class Player extends Entity {
+public class NewEntity extends Entity {
}
diff --git a/EnemyShips/pom.xml b/plugins/EnemyShips/pom.xml
similarity index 100%
rename from EnemyShips/pom.xml
rename to plugins/EnemyShips/pom.xml
diff --git a/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java b/plugins/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java
similarity index 100%
rename from EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java
rename to plugins/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java
diff --git a/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java b/plugins/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java
similarity index 100%
rename from EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java
rename to plugins/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java
diff --git a/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/Enemy.java b/plugins/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/NewEntity.java
similarity index 66%
rename from EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/Enemy.java
rename to plugins/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/NewEntity.java
index dc060d82f..38adc8b54 100644
--- a/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/Enemy.java
+++ b/plugins/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/NewEntity.java
@@ -2,5 +2,5 @@
import dk.sdu.mmmi.cbse.common.data.Entity;
-public class Enemy extends Entity {
+public class NewEntity extends Entity {
}
\ No newline at end of file
diff --git a/EnemyShips/src/main/java/module-info.java b/plugins/EnemyShips/src/main/java/module-info.java
similarity index 100%
rename from EnemyShips/src/main/java/module-info.java
rename to plugins/EnemyShips/src/main/java/module-info.java
diff --git a/plugins/EnemyShips/target/maven-archiver/pom.properties b/plugins/EnemyShips/target/maven-archiver/pom.properties
new file mode 100644
index 000000000..96970e402
--- /dev/null
+++ b/plugins/EnemyShips/target/maven-archiver/pom.properties
@@ -0,0 +1,3 @@
+artifactId=Enemy
+groupId=dk.sdu.mmmi.cbse
+version=1.0.1-SNAPSHOT
diff --git a/plugins/EnemyShips/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/plugins/EnemyShips/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 000000000..57c31418c
--- /dev/null
+++ b/plugins/EnemyShips/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,4 @@
+module-info.class
+dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.class
+dk/sdu/mmmi/cbse/enemies/EnemyPlugin.class
+dk/sdu/mmmi/cbse/enemies/Enemy.class
diff --git a/plugins/EnemyShips/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/plugins/EnemyShips/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 000000000..222194617
--- /dev/null
+++ b/plugins/EnemyShips/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,4 @@
+/Users/khaybaromar/Desktop/AsteroidsFX/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyPlugin.java
+/Users/khaybaromar/Desktop/AsteroidsFX/EnemyShips/src/main/java/module-info.java
+/Users/khaybaromar/Desktop/AsteroidsFX/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/Enemy.java
+/Users/khaybaromar/Desktop/AsteroidsFX/EnemyShips/src/main/java/dk/sdu/mmmi/cbse/enemies/EnemyControlSystem.java
diff --git a/pom.xml b/pom.xml
index 575a14e77..e60599690 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,7 +19,7 @@
CommonAsteroids
Asteroids
Collision
- EnemyShips
+