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 6d0c7fe104b1d1573dd550ebac22f5b9e8a4e51b..9c8b490df483b17ae295a4ecfe3f275f4c34990e 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java @@ -54,6 +54,7 @@ public class GameSceneController implements Initializable { private void updateContent() { player.updateEntityMovement(this); enemy.updateEntityMovement(this); + player.attack(enemy, graphicsContext2D); } private void renderContent(GraphicsContext graphicsContext) { 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 82574019fe27c171750003bb112063f7fe7cd1db..030f3cc715602f835b7db2e95fb3552d76968dac 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,6 +1,6 @@ package de.hdm_stuttgart.battlearena.Model.Entity; -import javafx.scene.shape.Rectangle; +import javafx.geometry.BoundingBox; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; @@ -13,68 +13,15 @@ public class 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; + public boolean handleBoxCollision(BoundingBox colliderA, BoundingBox colliderB) { + return colliderA.getMaxX() > colliderB.getMinX() && + colliderA.getMinX() < colliderB.getMaxX() && + colliderA.getMaxY() > colliderB.getMinY() && + colliderA.getMinY() < colliderB.getMaxY(); + } - switch (player.getEntityDirection()) { - case UP: - nextPlayerYPos = playerColliderTopY - playerSpeed; - return nextPlayerYPos <= entityColliderBottomY && - playerColliderTopY > entityColliderBottomY && - playerColliderLeftX >= entityColliderLeftX && - playerColliderLeftX <= entityColliderRightX || - nextPlayerYPos <= entityColliderBottomY && - playerColliderTopY > entityColliderBottomY && - playerColliderRightX >= entityColliderLeftX && - playerColliderRightX <= entityColliderRightX; - case DOWN: - nextPlayerYPos = playerColliderBottomY + playerSpeed; - return nextPlayerYPos >= entityColliderTopY && - playerColliderBottomY < entityColliderTopY && - playerColliderLeftX >= entityColliderLeftX && - playerColliderLeftX <= entityColliderRightX || - nextPlayerYPos >= entityColliderTopY && - playerColliderBottomY < entityColliderTopY && - playerColliderRightX >= entityColliderLeftX && - playerColliderRightX <= entityColliderRightX; - 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; - } + public boolean handleMapCollision() { + 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 258a5e095acdc1372883a7869d23dbedde972915..1cf0347ba56791f051ee7a6c67459dca77d81982 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,9 +1,11 @@ package de.hdm_stuttgart.battlearena.Model.Entity; import de.hdm_stuttgart.battlearena.Controller.GameSceneController; + +import javafx.geometry.BoundingBox; 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; @@ -11,7 +13,7 @@ class EnemyHandler implements IEntity{ private static final Logger log = LogManager.getLogger(EnemyHandler.class); - private final Rectangle boxCollider = new Rectangle(300, 200, 48, 48); + private final BoundingBox boxCollider = new BoundingBox(300, 200, 48, 48); private EntityDirection entityDirection = EntityDirection.DOWN; @@ -32,6 +34,11 @@ class EnemyHandler implements IEntity{ } + @Override + public void attack(IEntity entity, GraphicsContext graphicsContext) { + + } + @Override public void updateEntityAnimation() { @@ -44,7 +51,7 @@ class EnemyHandler implements IEntity{ } @Override - public Rectangle getBoxCollider() { + public BoundingBox getBoxCollider() { return boxCollider; } 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 05611410257c5b1f5af16bf6dda8e04d53a0e282..5c5f3df55825b848ca8942573793ac93fac1dcd7 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,7 @@ package de.hdm_stuttgart.battlearena.Model.Entity; import de.hdm_stuttgart.battlearena.Controller.GameSceneController; +import javafx.geometry.BoundingBox; import javafx.scene.canvas.GraphicsContext; import javafx.scene.shape.Rectangle; @@ -12,11 +13,13 @@ public interface IEntity { void updateEntityMovement(GameSceneController gameScene); + void attack(IEntity entity, GraphicsContext graphicsContext); + void updateEntityAnimation(); void renderEntity(GraphicsContext graphicsContext); - Rectangle getBoxCollider(); + BoundingBox getBoxCollider(); EntityDirection getEntityDirection(); 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 4fc28e5bdf7d05fefbdffd35488a6ad11d505f2f..1c940ad4d34c939cf47bc1b81b054949100380d8 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 @@ -3,9 +3,9 @@ package de.hdm_stuttgart.battlearena.Model.Entity; import de.hdm_stuttgart.battlearena.Controller.GameSceneController; import de.hdm_stuttgart.battlearena.Model.Inputs.InputHandler; +import javafx.geometry.BoundingBox; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; -import javafx.scene.shape.Rectangle; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; @@ -21,13 +21,23 @@ class Player implements IEntity { GraphicsContext gameScene; - private Rectangle boxCollider; + private BoundingBox boxCollider; - private Image directionDownOne, directionDownTwo, directionUpOne, directionUpTwo, directionLeftOne, directionLeftTwo, directionRightOne, directionRightTwo; + private Image directionDownOne, + directionDownTwo, + directionUpOne, + directionUpTwo, + directionLeftOne, + directionLeftTwo, + directionRightOne, + directionRightTwo; private int spriteCounter = 0; private int spriteNumber = 1; + private final int playerWidth = 19; + private final int playerHeight = 35; + private int mapPosX; private int mapPosY; private int playerSpeed; @@ -45,7 +55,7 @@ class Player implements IEntity { public void initializeEntity() { mapPosX = 10; mapPosY = 10; - boxCollider = new Rectangle(mapPosX+10, mapPosY+10, 32, 32); + boxCollider = new BoundingBox(mapPosX+15,mapPosY+10, playerWidth, playerHeight); playerSpeed = 3; playerDirection = EntityDirection.DOWN; } @@ -79,9 +89,12 @@ class Player implements IEntity { playerDirection = EntityDirection.RIGHT; } - boolean isColliding = collisionHandler.handleEntityCollision(this, gameScene.getEnemy()); + boolean isMapCollision = collisionHandler.handleMapCollision(); + + int lastMapPosX = mapPosX; + int lastMapPosY = mapPosY; - if (!isColliding) { + if (!isMapCollision) { switch (playerDirection) { case UP: mapPosY -= playerSpeed; @@ -97,13 +110,71 @@ class Player implements IEntity { } } - boxCollider = new Rectangle(mapPosX + 10, mapPosY + 10, 32, 32); + boolean isEntityCollision = boxCollider.intersects(gameScene.getEnemy().getBoxCollider()); + //boolean isEntityCollision = collisionHandler.handleBoxCollision(boxCollider, gameScene.getEnemy().getBoxCollider()); + + if (isEntityCollision) { + if (playerDirection == EntityDirection.UP) { + mapPosY = lastMapPosY + 30; + } else if (playerDirection == EntityDirection.DOWN) { + mapPosY = lastMapPosY - 30; + } else if (playerDirection == EntityDirection.LEFT) { + mapPosX = lastMapPosX + 30; + } else { + mapPosX = lastMapPosX - 30; + } + } + + boxCollider = new BoundingBox(mapPosX+15,mapPosY+10, playerWidth, playerHeight); updateEntityAnimation(); } } + @Override + public void attack(IEntity entity, GraphicsContext graphicsContext) { + BoundingBox hitBox; + int attackRange = 30; + int attackWidth = 10; + + if (inputHandler.isAttack()){ + if (playerDirection == EntityDirection.UP) { + hitBox = new BoundingBox(mapPosX+playerWidth, mapPosY-10, attackWidth, attackRange); + graphicsContext.strokeRect(mapPosX+playerWidth, mapPosY-10, attackWidth, attackRange); + if (hitBox.intersects(entity.getBoxCollider())) { + //todo: implement health + graphicsContext.strokeText("Hit", 10, 10); + } + } else if (playerDirection == EntityDirection.DOWN) { + hitBox = new BoundingBox(mapPosX+playerWidth, mapPosY+playerHeight, attackWidth, attackRange); + graphicsContext.strokeRect(mapPosX+playerWidth, mapPosY+playerHeight, attackWidth, attackRange); + if (hitBox.intersects(entity.getBoxCollider())) { + //todo: implement health + graphicsContext.strokeText("Hit", 10, 10); + } + } else if (playerDirection == EntityDirection.LEFT) { + hitBox = new BoundingBox(mapPosX-attackWidth, mapPosY+((double) playerHeight /2), + attackRange, attackWidth); + graphicsContext.strokeRect(mapPosX-attackWidth, mapPosY+((double) playerHeight /2), + attackRange, attackWidth); + if (hitBox.intersects(entity.getBoxCollider())) { + //todo: implement health + graphicsContext.strokeText("Hit", 10, 10); + } + } else { + hitBox = new BoundingBox(mapPosX+playerWidth+attackWidth, mapPosY+((double) playerHeight /2), + attackRange, attackWidth); + graphicsContext.strokeRect(mapPosX+playerWidth+attackWidth, mapPosY+((double) playerHeight /2), + attackRange, attackWidth); + if (hitBox.intersects(entity.getBoxCollider())) { + //todo: implement health + graphicsContext.strokeText("Hit", 10, 10); + } + } + } + } + @Override public void updateEntityAnimation() { spriteCounter++; @@ -122,7 +193,8 @@ class Player implements IEntity { public void renderEntity(GraphicsContext graphicsContext) { Image playerSprite = null; - graphicsContext.strokeRect(boxCollider.getX(), boxCollider.getY(), boxCollider.getWidth(), boxCollider.getHeight()); + //for debugging collision + graphicsContext.strokeRect(mapPosX+15,mapPosY+10, playerWidth, playerHeight); switch (playerDirection) { case UP: @@ -163,7 +235,7 @@ class Player implements IEntity { } @Override - public Rectangle getBoxCollider() { + public BoundingBox getBoxCollider() { return boxCollider; } diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java index 883b00bc8e2618b05762cb733732f2b8334205fd..8dfd2f3d3d51063e409488e71a25814030ed2f68 100644 --- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java +++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java @@ -18,7 +18,7 @@ public class InputHandler { return inputHandler; } - private boolean moveUp, moveDown, moveLeft, moveRight; + private boolean moveUp, moveDown, moveLeft, moveRight, attack; public void handleKeyPress(KeyEvent event) { KeyCode code = event.getCode(); @@ -36,6 +36,8 @@ public class InputHandler { case D: moveRight = true; break; + case SPACE: + attack = true; } } @@ -55,6 +57,8 @@ public class InputHandler { case D: moveRight = false; break; + case SPACE: + attack = false; } } @@ -73,4 +77,8 @@ public class InputHandler { public boolean isMoveRight() { return moveRight; } + + public boolean isAttack() { + return attack; + } } \ No newline at end of file