From 0cef1a812de27dea7460f736e0dc8b10f53fa1cb Mon Sep 17 00:00:00 2001 From: ms622 <ms622@hdm-stuttgart.de> Date: Mon, 4 Dec 2023 14:47:15 +0100 Subject: [PATCH] add: CollisionHandler.java, update: implemented collision detection in IEntity.java and its implementations #18 --- .../Controller/GameSceneController.java | 10 ++- .../hdm_stuttgart/battlearena/Main/Main.java | 2 +- .../Model/Entity/CollisionHandler.java | 70 +++++++++++++++++++ .../Model/Entity/EnemyHandler.java | 27 ++++++- .../battlearena/Model/Entity/IEntity.java | 10 ++- .../battlearena/Model/Entity/Player.java | 30 ++++++-- 6 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java 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 c04aa065..6d0c7fe1 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java @@ -29,6 +29,7 @@ public class GameSceneController implements Initializable { InputHandler inputHandler = InputHandler.getInstance(); IEntity player; + IEntity enemy; @Override @@ -36,6 +37,7 @@ public class GameSceneController implements Initializable { graphicsContext2D = canvas2D.getGraphicsContext2D(); player = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler); + enemy = EntityFactory.createEntity(EntityType.ENEMY_PLAYER, graphicsContext2D, inputHandler); AnimationTimer gameLoop = new AnimationTimer() { @Override @@ -50,10 +52,16 @@ public class GameSceneController implements Initializable { } private void updateContent() { - player.updateEntityMovement(); + player.updateEntityMovement(this); + enemy.updateEntityMovement(this); } private void renderContent(GraphicsContext graphicsContext) { player.renderEntity(graphicsContext); + enemy.renderEntity(graphicsContext); + } + + public IEntity getEnemy() { + return enemy; } } \ No newline at end of file diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java b/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java index 171f21c3..db7be08c 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Main/Main.java @@ -24,7 +24,7 @@ public class Main extends Application { @Override public void start(Stage stage) throws Exception { - Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MainMenu.fxml"))); + Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml"))); Scene scene = new Scene(root); 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 new file mode 100644 index 00000000..2cd9e59c --- /dev/null +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java @@ -0,0 +1,70 @@ +package de.hdm_stuttgart.battlearena.Model.Entity; + +import javafx.scene.shape.Rectangle; + +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.LogManager; + +public class CollisionHandler { + + private static final Logger log = LogManager.getLogger(CollisionHandler.class); + + public CollisionHandler() { + log.debug("CollisionHandler initialized"); + } + + public boolean handleEntityCollision(IEntity player, IEntity entity) { + Rectangle playerBoxCollider = player.getBoxCollider(); + Rectangle entityBoxCollider = entity.getBoxCollider(); + + int playerColliderLeftX = (int) playerBoxCollider.getX(); + int playerColliderRightX = (int) (playerBoxCollider.getX() + playerBoxCollider.getWidth()); + int playerColliderTopY = (int) playerBoxCollider.getY(); + int playerColliderBottomY = (int) (playerBoxCollider.getY() + playerBoxCollider.getHeight()); + + int entityColliderLeftX = (int) entityBoxCollider.getX(); + int entityColliderRightX = (int) (entityBoxCollider.getX() + entityBoxCollider.getWidth()); + int entityColliderTopY = (int) entityBoxCollider.getY(); + int entityColliderBottomY = (int) (entityBoxCollider.getY() + entityBoxCollider.getHeight()); + + int playerSpeed = player.getEntitySpeed(); + int nextPlayerXPos; + int nextPlayerYPos; + + switch (player.getEntityDirection()) { + case UP: + nextPlayerYPos = playerColliderTopY - playerSpeed; + return nextPlayerYPos <= entityColliderBottomY && + playerColliderLeftX <= entityColliderRightX && + playerColliderRightX >= entityColliderLeftX; + case DOWN: + nextPlayerYPos = playerColliderBottomY + playerSpeed; + return nextPlayerYPos >= entityColliderTopY && + playerColliderLeftX <= entityColliderRightX && + playerColliderRightX >= entityColliderLeftX; + case LEFT: + nextPlayerXPos = playerColliderLeftX - playerSpeed; + return nextPlayerXPos <= entityColliderRightX && + playerColliderLeftX > entityColliderRightX && + playerColliderTopY >= entityColliderTopY && + playerColliderTopY <= entityColliderBottomY || + nextPlayerXPos <= entityColliderRightX && + playerColliderLeftX > entityColliderRightX && + playerColliderBottomY >= entityColliderTopY && + playerColliderBottomY <= entityColliderBottomY; + case RIGHT: + nextPlayerXPos = playerColliderRightX + playerSpeed; + return nextPlayerXPos >= entityColliderLeftX && + playerColliderLeftX < entityColliderLeftX && + playerColliderTopY >= entityColliderTopY && + playerColliderTopY <= entityColliderBottomY || + nextPlayerXPos >= entityColliderLeftX && + playerColliderLeftX < entityColliderLeftX && + playerColliderBottomY >= entityColliderTopY && + playerColliderBottomY <= entityColliderBottomY; + default: + return false; + } + } + +} \ 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 c8e2638a..258a5e09 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 @@ -1,6 +1,9 @@ package de.hdm_stuttgart.battlearena.Model.Entity; +import de.hdm_stuttgart.battlearena.Controller.GameSceneController; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; +import javafx.scene.shape.Rectangle; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; @@ -8,6 +11,11 @@ class EnemyHandler implements IEntity{ private static final Logger log = LogManager.getLogger(EnemyHandler.class); + private final Rectangle boxCollider = new Rectangle(300, 200, 48, 48); + + private EntityDirection entityDirection = EntityDirection.DOWN; + + private int entitySpeed = 3; @Override public void initializeEntity() { @@ -20,7 +28,7 @@ class EnemyHandler implements IEntity{ } @Override - public void updateEntityMovement() { + public void updateEntityMovement(GameSceneController gameScene) { } @@ -31,6 +39,23 @@ class EnemyHandler implements IEntity{ @Override public void renderEntity(GraphicsContext graphicsContext) { + graphicsContext.setFill(Color.BLACK); + graphicsContext.fillRect(300, 200, 48, 48); + } + @Override + public Rectangle getBoxCollider() { + return boxCollider; } + + @Override + public EntityDirection getEntityDirection() { + return entityDirection; + } + + @Override + public int getEntitySpeed() { + return 3; + } + } \ No newline at end of file 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 a8e2b2d1..05611410 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 @@ -1,6 +1,8 @@ package de.hdm_stuttgart.battlearena.Model.Entity; +import de.hdm_stuttgart.battlearena.Controller.GameSceneController; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.shape.Rectangle; public interface IEntity { @@ -8,10 +10,16 @@ public interface IEntity { void loadEntitySprites(); - void updateEntityMovement(); + void updateEntityMovement(GameSceneController gameScene); void updateEntityAnimation(); void renderEntity(GraphicsContext graphicsContext); + Rectangle getBoxCollider(); + + EntityDirection getEntityDirection(); + + int getEntitySpeed(); + } \ 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 92ad7f7d..4fc28e5b 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 @@ -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; @@ -16,10 +17,11 @@ class Player implements IEntity { private static final Logger log = LogManager.getLogger(Player.class); InputHandler inputHandler; + CollisionHandler collisionHandler = new CollisionHandler(); GraphicsContext gameScene; - private final Rectangle boxCollider = new Rectangle(8, 16, 32, 32); + private Rectangle boxCollider; private Image directionDownOne, directionDownTwo, directionUpOne, directionUpTwo, directionLeftOne, directionLeftTwo, directionRightOne, directionRightTwo; @@ -43,6 +45,7 @@ class Player implements IEntity { public void initializeEntity() { mapPosX = 10; mapPosY = 10; + boxCollider = new Rectangle(mapPosX+10, mapPosY+10, 32, 32); playerSpeed = 3; playerDirection = EntityDirection.DOWN; } @@ -64,7 +67,7 @@ class Player implements IEntity { } @Override - public void updateEntityMovement() { + public void updateEntityMovement(GameSceneController gameScene) { if (inputHandler.isMoveUp() || inputHandler.isMoveDown() || inputHandler.isMoveLeft() || inputHandler.isMoveRight()) { if (inputHandler.isMoveUp()) { playerDirection = EntityDirection.UP; @@ -76,7 +79,7 @@ class Player implements IEntity { playerDirection = EntityDirection.RIGHT; } - boolean isColliding = false; + boolean isColliding = collisionHandler.handleEntityCollision(this, gameScene.getEnemy()); if (!isColliding) { switch (playerDirection) { @@ -94,6 +97,8 @@ class Player implements IEntity { } } + boxCollider = new Rectangle(mapPosX + 10, mapPosY + 10, 32, 32); + updateEntityAnimation(); } @@ -117,6 +122,8 @@ class Player implements IEntity { public void renderEntity(GraphicsContext graphicsContext) { Image playerSprite = null; + graphicsContext.strokeRect(boxCollider.getX(), boxCollider.getY(), boxCollider.getWidth(), boxCollider.getHeight()); + switch (playerDirection) { case UP: if (spriteNumber == 1) { @@ -152,7 +159,22 @@ class Player implements IEntity { break; } - graphicsContext.drawImage(playerSprite, mapPosX, mapPosY, 128, 128); + graphicsContext.drawImage(playerSprite, mapPosX, mapPosY, 48, 48); + } + + @Override + public Rectangle getBoxCollider() { + return boxCollider; + } + + @Override + public EntityDirection getEntityDirection() { + return playerDirection; + } + + @Override + public int getEntitySpeed() { + return playerSpeed; } public int getMapPosX() { -- GitLab