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 9594f016e560088fa42c59e54e4386fee2060aea..513c8c606c6b4883bc6cb67f99b187c09332bf27 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 030f3cc715602f835b7db2e95fb3552d76968dac..9d860c1af101e6002e51c846e70d219cee7772e1 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 75ae76e99d63cd951ad1ef6ec36834e015b57db2..c8fc714cc5aa2eefe30e616b5211fe76e6457ff2 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 fdc56cc2fd9580d781dbf299401d5976f8f7e6ab..d5b4b382213c197e503a598e855940aa18821998 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 8914040bf4e8122faccdb93bd431ab7b890e80bb..92ca5b53906697c1bad96c2cbb59524b7bc2c40b 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 8472c37772342b534d8807adbfc7bee41821d4f7..fffccf712e14e8a655bbc72622fae7e4c0d5d3b8 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 cc320b3a4319b544d2348a7d2cf9ae4b844a6ba1..480478d51823c0a4992de930e4eea5f2b73f82d8 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 012843cfbd2aca680928e8fb4e97d58b4018663e..13a3d1d34ef25e809dd1dd1467218739070f8357 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