From de03ede0c42c57aa42f6b970524258089b1dd5e2 Mon Sep 17 00:00:00 2001
From: ms622 <ms622@hdm-stuttgart.de>
Date: Mon, 11 Dec 2023 13:38:05 +0100
Subject: [PATCH] update: exports in module-info.java, fix: collisions with map
 not detected, fix: missing methods in IEntity.java #34

---
 .../Controller/GameSceneController.java       | 13 +++++-
 .../Model/Entity/CollisionHandler.java        | 46 ++++++++++++++++++-
 .../Model/Entity/EnemyHandler.java            |  9 ++++
 .../Model/Entity/EntityFactory.java           |  5 +-
 .../battlearena/Model/Entity/IEntity.java     |  4 ++
 .../battlearena/Model/Entity/Player.java      | 18 ++++++--
 .../battlearena/Model/Map/TileManager.java    |  8 ++++
 src/main/java/module-info.java                |  1 +
 8 files changed, 93 insertions(+), 11 deletions(-)

diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java
index 9594f016..513c8c60 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java
@@ -60,6 +60,7 @@ public class GameSceneController implements Initializable {
     int horizontalTileCount = 18;
     int verticalTileCount = 18;
     int diffTileCount = 5;
+    int scaledTileSize = 48;
 
 
     @Override
@@ -67,8 +68,8 @@ public class GameSceneController implements Initializable {
         graphicsContext2D = canvas2D.getGraphicsContext2D();
         graphicsContext2D.setImageSmoothing(false);
 
-        player = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler, playerClass);
-        enemy = EntityFactory.createEntity(EntityType.ENEMY_PLAYER, graphicsContext2D, inputHandler, enemyClass);
+        player = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler, playerClass, this);
+        enemy = EntityFactory.createEntity(EntityType.ENEMY_PLAYER, graphicsContext2D, inputHandler, enemyClass, this);
 
         tileManager = new TileManager(graphicsContext2D, diffTileCount, horizontalTileCount, verticalTileCount, mapString);
 
@@ -99,4 +100,12 @@ public class GameSceneController implements Initializable {
     public IEntity getEnemy() {
         return enemy;
     }
+
+    public TileManager getTileManager() {
+        return tileManager;
+    }
+
+    public int getScaledTileSize() {
+        return scaledTileSize;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java
index 030f3cc7..9d860c1a 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java
@@ -1,5 +1,8 @@
 package de.hdm_stuttgart.battlearena.Model.Entity;
 
+import de.hdm_stuttgart.battlearena.Controller.GameSceneController;
+import de.hdm_stuttgart.battlearena.Model.Map.ITile;
+
 import javafx.geometry.BoundingBox;
 
 import org.apache.logging.log4j.Logger;
@@ -20,8 +23,47 @@ public class CollisionHandler {
                 colliderA.getMinY() < colliderB.getMaxY();
     }
 
-    public boolean handleMapCollision() {
-        return false;
+    public boolean handleMapCollision(IEntity entity, int scaledTileSize, GameSceneController gameSceneController) {
+        int playerLeftX = (int) (entity.getBoxCollider().getMinX());
+        int playerRightX = (int) (entity.getBoxCollider().getMinX() + entity.getBoxCollider().getWidth());
+        int playerTopY = (int) (entity.getBoxCollider().getMinY());
+        int playerBottomY = (int) (entity.getBoxCollider().getMinY() + entity.getBoxCollider().getHeight());
+
+        int leftColumn = playerLeftX / scaledTileSize;
+        int rightColumn = playerRightX / scaledTileSize;
+        int topRow = playerTopY / scaledTileSize;
+        int bottomRow = playerBottomY / scaledTileSize;
+
+        int nextPlayerTop = (playerTopY - entity.getEntitySpeed()) / scaledTileSize;
+        int nextPlayerBottom = (playerBottomY + entity.getEntitySpeed()) / scaledTileSize;
+        int nextPlayerLeft = (playerLeftX - entity.getEntitySpeed()) / scaledTileSize;
+        int nextPlayerRight = (playerRightX + entity.getEntitySpeed()) / scaledTileSize;
+
+        int[][] tileMap = gameSceneController.getTileManager().getTileMap();
+        ITile[] tileSet = gameSceneController.getTileManager().getTileSet();
+        int tileOne;
+        int tileTwo;
+
+        switch (entity.getEntityDirection()) {
+            case UP:
+                tileOne = tileMap[nextPlayerTop][leftColumn];
+                tileTwo = tileMap[nextPlayerTop][rightColumn];
+                return tileSet[tileOne].getCollision() || tileSet[tileTwo].getCollision();
+            case DOWN:
+                tileOne = tileMap[nextPlayerBottom][leftColumn];
+                tileTwo = tileMap[nextPlayerBottom][rightColumn];
+                return tileSet[tileOne].getCollision() || tileSet[tileTwo].getCollision();
+            case LEFT:
+                tileOne = tileMap[topRow][nextPlayerLeft];
+                tileTwo = tileMap[bottomRow][nextPlayerLeft];
+                return tileSet[tileOne].getCollision() || tileSet[tileTwo].getCollision();
+            case RIGHT:
+                tileOne = tileMap[topRow][nextPlayerRight];
+                tileTwo = tileMap[bottomRow][nextPlayerRight];
+                return tileSet[tileOne].getCollision() || tileSet[tileTwo].getCollision();
+            default:
+                return true;
+        }
     }
 
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EnemyHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EnemyHandler.java
index 75ae76e9..c8fc714c 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EnemyHandler.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EnemyHandler.java
@@ -73,5 +73,14 @@ class EnemyHandler implements IEntity{
         return health -= damageDone;
     }
 
+    @Override
+    public int getMapPosX() {
+        return 0;
+    }
+
+    @Override
+    public int getMapPosY() {
+        return 0;
+    }
 
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java
index fdc56cc2..d5b4b382 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java
@@ -1,5 +1,6 @@
 package de.hdm_stuttgart.battlearena.Model.Entity;
 
+import de.hdm_stuttgart.battlearena.Controller.GameSceneController;
 import de.hdm_stuttgart.battlearena.Model.Inputs.InputHandler;
 
 import javafx.scene.canvas.GraphicsContext;
@@ -11,10 +12,10 @@ public class EntityFactory {
 
     private static final Logger log = LogManager.getLogger(EntityFactory.class);
 
-    public static IEntity createEntity(EntityType entityType, GraphicsContext gameScene, InputHandler inputHandler, EntityClass entityClass) {
+    public static IEntity createEntity(EntityType entityType, GraphicsContext gameScene, InputHandler inputHandler, EntityClass entityClass, GameSceneController gameSceneController) {
         if (entityType == EntityType.PLAYER) {
             log.debug("Entity " + entityType + " created");
-            return new Player(gameScene, inputHandler, entityClass);
+            return new Player(gameScene, inputHandler, entityClass, gameSceneController);
         } else if (entityType == EntityType.ENEMY_PLAYER) {
             log.debug("Entity " + entityType + " created");
             return new EnemyHandler();
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java
index 8914040b..92ca5b53 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java
@@ -26,4 +26,8 @@ public interface IEntity {
 
    int gotHit(int damageDone);
 
+   int getMapPosX();
+
+   int getMapPosY();
+
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java
index 8472c377..fffccf71 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java
@@ -21,6 +21,8 @@ class Player implements IEntity {
 
     GraphicsContext gameScene;
 
+    GameSceneController gameSceneController;
+
     private BoundingBox boxCollider;
 
     private Image directionDownOne,
@@ -45,6 +47,8 @@ class Player implements IEntity {
     private final int playerWidth = 19;
     private final int playerHeight = 35;
 
+    private int scaledTileSize;
+
     private int mapPosX;
     private int mapPosY;
     private int playerSpeed;
@@ -53,10 +57,11 @@ class Player implements IEntity {
     private int health = 10;
     private int damage = 1;
 
-    public Player(GraphicsContext gameScene, InputHandler inputHandler, EntityClass entityClass) {
+    public Player(GraphicsContext gameScene, InputHandler inputHandler, EntityClass entityClass, GameSceneController gameSceneController) {
         this.gameScene = gameScene;
         this.inputHandler = inputHandler;
         this.entityClass = entityClass;
+        this.gameSceneController = gameSceneController;
 
         initializeEntity();
         loadEntitySprites();
@@ -64,8 +69,9 @@ class Player implements IEntity {
 
     @Override
     public void initializeEntity() {
-        mapPosX = 10;
-        mapPosY = 10;
+        scaledTileSize = gameSceneController.getScaledTileSize();
+        mapPosX = 60;
+        mapPosY = 60;
         boxCollider = new BoundingBox(mapPosX+15,mapPosY+10, playerWidth, playerHeight);
         playerSpeed = 5;
         playerDirection = EntityDirection.DOWN;
@@ -156,12 +162,12 @@ class Player implements IEntity {
                 playerDirection = EntityDirection.RIGHT;
             }
 
-            boolean isMapCollision = collisionHandler.handleMapCollision();
+            boolean isWalkableTile = collisionHandler.handleMapCollision(this, scaledTileSize, gameSceneController);
 
             int lastMapPosX = mapPosX;
             int lastMapPosY = mapPosY;
 
-            if (!isMapCollision) {
+            if (isWalkableTile) {
                 switch (playerDirection) {
                     case UP:
                         mapPosY -= playerSpeed;
@@ -328,10 +334,12 @@ class Player implements IEntity {
         return health -= damageDone;
     }
 
+    @Override
     public int getMapPosX() {
         return mapPosX;
     }
 
+    @Override
     public int getMapPosY() {
         return mapPosY;
     }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java
index cc320b3a..480478d5 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java
@@ -80,4 +80,12 @@ public class TileManager {
             }
         }
     }
+
+    public int[][] getTileMap() {
+        return tileMap;
+    }
+
+    public ITile[] getTileSet() {
+        return tileSet;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 012843cf..13a3d1d3 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -11,4 +11,5 @@ module gui {
     exports de.hdm_stuttgart.battlearena.Controller;
     exports de.hdm_stuttgart.battlearena.Model.Entity;
     exports de.hdm_stuttgart.battlearena.Model.Inputs;
+    exports de.hdm_stuttgart.battlearena.Model.Map;
 }
\ No newline at end of file
-- 
GitLab