diff --git a/src/main/java/cz/jzitnik/config/PlayerConfig.java b/src/main/java/cz/jzitnik/config/PlayerConfig.java new file mode 100644 index 0000000..0356345 --- /dev/null +++ b/src/main/java/cz/jzitnik/config/PlayerConfig.java @@ -0,0 +1,11 @@ +package cz.jzitnik.config; + +import cz.jzitnik.annotations.Config; +import lombok.Getter; + +@Getter +@Config +public class PlayerConfig { + private final double playerReach = 20; + private final int playerMoveDistance = 3; +} diff --git a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java index db560eb..26583e4 100644 --- a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java @@ -6,6 +6,7 @@ import cz.jzitnik.annotations.injectors.InjectConfig; import cz.jzitnik.annotations.injectors.InjectDependency; import cz.jzitnik.annotations.injectors.InjectState; import cz.jzitnik.config.Debugging; +import cz.jzitnik.config.PlayerConfig; import cz.jzitnik.events.MouseAction; import cz.jzitnik.events.MouseMoveEvent; import cz.jzitnik.events.RerenderScreen; @@ -55,6 +56,24 @@ public class MouseMoveEventHandler extends AbstractEventHandler @InjectConfig private Debugging debugging; + @InjectConfig + private PlayerConfig playerConfig; + + private double distancePointToRect( + double px, double py, + double left, double top, + double right, double bottom) { + + // Clamp point to rectangle + double closestX = Math.max(left, Math.min(px, right)); + double closestY = Math.max(top, Math.min(py, bottom)); + + double dx = px - closestX; + double dy = py - closestY; + + return Math.sqrt(dx * dx + dy * dy); + } + @Override public void handle(MouseMoveEvent event) { MouseAction mouseAction = event.getMouseAction(); @@ -63,6 +82,10 @@ public class MouseMoveEventHandler extends AbstractEventHandler GameRoom currentRoom = gameState.getCurrentRoom(); BufferedImage room = resourceManager.getResource(currentRoom.getTexture()); + Player player = gameState.getPlayer(); + RoomCords playerCords = player.getPlayerCords(); + BufferedImage playerTexture = RerenderUtils.getPlayer(resourceManager, player); + var start = RerenderUtils.getStart(room, terminalState.getTerminalScreen().getTerminalSize()); int startX = start.getX(); int startY = start.getY(); @@ -71,11 +94,32 @@ public class MouseMoveEventHandler extends AbstractEventHandler if (!gameObject.isSelectable()) return false; BufferedImage texture = gameObject.getTexture(); RoomCords cords = gameObject.getCords(); + + int relativeMouseX = mouseX - startX; + int relativeMouseY = (mouseY * 2 - startY); + int objXStart = cords.getX(); + int objYStart = cords.getY(); + int objXEnd = cords.getX() + texture.getWidth(); + int objYEnd = cords.getY() + texture.getHeight(); + + int playerMiddleX = playerCords.getX() + (playerTexture.getWidth() / 2); + int playerMiddleY = playerCords.getY() + (playerTexture.getHeight() / 3); // This is not middle but whatever + + double distance = distancePointToRect( + playerMiddleX, playerMiddleY, + objXStart, objYStart, + objXEnd, objYEnd + ); + + if (distance > playerConfig.getPlayerReach()) { + return false; + } + return - mouseX - startX >= cords.getX() && - mouseX - startX < cords.getX() + texture.getWidth() && - (mouseY * 2 - startY) >= cords.getY() && - (mouseY * 2 - startY) < cords.getY() + texture.getHeight(); + relativeMouseX >= cords.getX() && + relativeMouseX < cords.getX() + texture.getWidth() && + relativeMouseY >= cords.getY() && + relativeMouseY < cords.getY() + texture.getHeight(); }).collect(Collectors.toSet()); Set changedObjects = new HashSet<>(); @@ -95,8 +139,6 @@ public class MouseMoveEventHandler extends AbstractEventHandler for (GameObject object : changedObjects) { RoomCords cords = object.getCords(); BufferedImage objectTexture = object.getTexture(); - Player player = gameState.getPlayer(); - BufferedImage playerTexture = RerenderUtils.getPlayer(resourceManager, player); int forStartX = cords.getX(); int forStartY = cords.getY(); diff --git a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java index c9e6ccc..f662e45 100644 --- a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java @@ -7,6 +7,7 @@ import cz.jzitnik.annotations.injectors.InjectConfig; import cz.jzitnik.annotations.injectors.InjectDependency; import cz.jzitnik.annotations.injectors.InjectState; import cz.jzitnik.config.Debugging; +import cz.jzitnik.config.PlayerConfig; import cz.jzitnik.events.PlayerMoveEvent; import cz.jzitnik.events.RerenderScreen; import cz.jzitnik.events.RoomChangeEvent; @@ -50,6 +51,9 @@ public class PlayerMoveEventHandler extends AbstractEventHandler