diff --git a/src/main/java/cz/jzitnik/config/Debugging.java b/src/main/java/cz/jzitnik/config/Debugging.java new file mode 100644 index 0000000..1f46f8b --- /dev/null +++ b/src/main/java/cz/jzitnik/config/Debugging.java @@ -0,0 +1,11 @@ +package cz.jzitnik.config; + +import cz.jzitnik.annotations.Config; +import lombok.Getter; + +@Getter +@Config +public class Debugging { + private final boolean renderColliders = false; + private final boolean renderPlayerCollider = false; +} diff --git a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java b/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java index 8974455..7d938c3 100644 --- a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java @@ -5,8 +5,10 @@ import com.googlecode.lanterna.TerminalSize; import com.googlecode.lanterna.TextColor; import com.googlecode.lanterna.screen.TerminalScreen; import cz.jzitnik.annotations.EventHandler; +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.events.FullRoomDraw; import cz.jzitnik.events.RerenderScreen; import cz.jzitnik.events.TerminalTooSmallEvent; @@ -54,6 +56,9 @@ public class FullRoomDrawHandler extends AbstractEventHandler { @InjectState private RenderState renderState; + @InjectConfig + private Debugging debugging; + public enum DoorPosition { TOP, LEFT, @@ -89,7 +94,7 @@ public class FullRoomDrawHandler extends AbstractEventHandler { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - RerenderUtils.PixelResult pixelResult = RerenderUtils.getPixel(currentRoom, room, doors, doorPositions, player, playerTexture, x, y); + RerenderUtils.PixelResult pixelResult = RerenderUtils.getPixel(currentRoom, room, doors, doorPositions, player, playerTexture, x, y, debugging); int pixel = pixelResult.pixel(); int red = (pixel >> 16) & 0xff; int green = (pixel >> 8) & 0xff; diff --git a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java index 24c18d4..db560eb 100644 --- a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java @@ -2,8 +2,10 @@ package cz.jzitnik.events.handlers; import com.googlecode.lanterna.TerminalPosition; import cz.jzitnik.annotations.EventHandler; +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.events.MouseAction; import cz.jzitnik.events.MouseMoveEvent; import cz.jzitnik.events.RerenderScreen; @@ -50,6 +52,9 @@ public class MouseMoveEventHandler extends AbstractEventHandler @InjectDependency private EventManager eventManager; + @InjectConfig + private Debugging debugging; + @Override public void handle(MouseMoveEvent event) { MouseAction mouseAction = event.getMouseAction(); @@ -110,7 +115,8 @@ public class MouseMoveEventHandler extends AbstractEventHandler player, playerTexture, screenBuffer, - resourceManager + resourceManager, + debugging ); parts.add(new RerenderScreen.ScreenPart( diff --git a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java index 794b568..8a0df17 100644 --- a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java @@ -3,8 +3,10 @@ package cz.jzitnik.events.handlers; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.input.KeyStroke; import cz.jzitnik.annotations.EventHandler; +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.events.PlayerMoveEvent; import cz.jzitnik.events.RerenderScreen; import cz.jzitnik.events.RoomChangeEvent; @@ -45,11 +47,15 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { if (originalPlayerX <= 30) { @@ -72,7 +78,7 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { if (originalPlayerY >= 110) { @@ -81,7 +87,7 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { if (originalPlayerX >= 155) { @@ -90,7 +96,7 @@ public class PlayerMoveEventHandler extends AbstractEventHandler objects = new ArrayList<>(); + private final List colliders = new ArrayList<>(); public GameRoom(ResourceManager.Resource texture) { this.texture = texture; @@ -35,12 +37,14 @@ public class GameRoom { this.overrideBuffer = overrideBuffer; } - private final List objects = new ArrayList<>(); - public void addObject(GameObject gameObject) { objects.addFirst(gameObject); } + public void addCollider(GameRoomPart collider) { + colliders.add(collider); + } + public void setLeft(GameRoom left) { setLeft(left, true); } diff --git a/src/main/java/cz/jzitnik/game/GameRoomPart.java b/src/main/java/cz/jzitnik/game/GameRoomPart.java new file mode 100644 index 0000000..8407ac7 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/GameRoomPart.java @@ -0,0 +1,22 @@ +package cz.jzitnik.game; + +import cz.jzitnik.game.utils.RoomCords; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.ToString; + +@Data +@AllArgsConstructor +@ToString +public class GameRoomPart { + private RoomCords start; + private RoomCords end; + + public boolean isWithin(RoomCords cords) { + return + cords.getX() >= start.getX() && + cords.getX() <= end.getX() && + cords.getY() >= start.getY() && + cords.getY() <= end.getY(); + } +} diff --git a/src/main/java/cz/jzitnik/game/objects/Chest.java b/src/main/java/cz/jzitnik/game/objects/Chest.java index 4852748..8ba2148 100644 --- a/src/main/java/cz/jzitnik/game/objects/Chest.java +++ b/src/main/java/cz/jzitnik/game/objects/Chest.java @@ -3,8 +3,10 @@ package cz.jzitnik.game.objects; import com.google.common.collect.Lists; import com.googlecode.lanterna.TerminalPosition; import com.googlecode.lanterna.TextColor; +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.events.MouseAction; import cz.jzitnik.events.RerenderScreen; import cz.jzitnik.game.GameRoom; @@ -60,6 +62,9 @@ public final class Chest extends GameObject implements Interactable, UIClickHand @InjectState private TerminalState terminalState; + @InjectConfig + private Debugging debugging; + public Chest(DependencyManager dm, ResourceManager resourceManager, RoomCords cords, GameItem[] items) { super(resourceManager.getResource(ResourceManager.Resource.CHEST), cords, true); this.items = Lists.newArrayList(items); @@ -145,7 +150,8 @@ public final class Chest extends GameObject implements Interactable, UIClickHand player, playerTexture, screenBuffer, - resourceManager + resourceManager, + debugging ); RerenderScreen.ScreenPart sp = new RerenderScreen.ScreenPart(guiStart, guiEnd); @@ -188,7 +194,8 @@ public final class Chest extends GameObject implements Interactable, UIClickHand player, playerTexture, x, - y + y, + debugging ).pixel(); buffer[y + start.getY()][x + start.getX()] = pixelToColored(pixel); diff --git a/src/main/java/cz/jzitnik/game/setup/GameSetup.java b/src/main/java/cz/jzitnik/game/setup/GameSetup.java index 0b07fa7..4013788 100644 --- a/src/main/java/cz/jzitnik/game/setup/GameSetup.java +++ b/src/main/java/cz/jzitnik/game/setup/GameSetup.java @@ -3,10 +3,7 @@ package cz.jzitnik.game.setup; import cz.jzitnik.annotations.Dependency; import cz.jzitnik.annotations.injectors.InjectDependency; import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.game.GameRoom; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; +import cz.jzitnik.game.*; import cz.jzitnik.game.items.GameItem; import cz.jzitnik.game.items.WoodenSword; import cz.jzitnik.game.objects.Chest; @@ -25,7 +22,7 @@ public class GameSetup { private DependencyManager dependencyManager; public void setup() { - gameState.setScreen(new IntroScene(dependencyManager)); + //gameState.setScreen(new IntroScene(dependencyManager)); GameRoom mainRoom = new GameRoom(ResourceManager.Resource.ROOM1); GameRoom rightRoom = new GameRoom(ResourceManager.Resource.ROOM2); @@ -44,6 +41,10 @@ public class GameSetup { new WoodenSword(resourceManager), }); mainRoom.addObject(chest); + mainRoom.addCollider(new GameRoomPart( + new RoomCords(60, 10), + new RoomCords(135, 15) + )); gameState.setCurrentRoom(mainRoom); diff --git a/src/main/java/cz/jzitnik/game/utils/RoomCords.java b/src/main/java/cz/jzitnik/game/utils/RoomCords.java index b113a63..cac45af 100644 --- a/src/main/java/cz/jzitnik/game/utils/RoomCords.java +++ b/src/main/java/cz/jzitnik/game/utils/RoomCords.java @@ -1,8 +1,13 @@ package cz.jzitnik.game.utils; +import cz.jzitnik.game.GameRoomPart; import lombok.Getter; import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import java.util.List; + +@Slf4j @ToString @Getter public class RoomCords { @@ -17,4 +22,14 @@ public class RoomCords { this.x = x; this.y = y; } + + public void updateCordsWithColliders(List colliders, int x, int y) { + log.debug("Collider: {}", colliders.get(0)); + log.debug("x: {}, y: {}", x, y); + + if (colliders.stream().anyMatch(collider -> collider.isWithin(new RoomCords(x, y)))) { + return; + } + updateCords(x, y); + } } diff --git a/src/main/java/cz/jzitnik/utils/RerenderUtils.java b/src/main/java/cz/jzitnik/utils/RerenderUtils.java index dc0dc74..54a22e0 100644 --- a/src/main/java/cz/jzitnik/utils/RerenderUtils.java +++ b/src/main/java/cz/jzitnik/utils/RerenderUtils.java @@ -2,6 +2,7 @@ package cz.jzitnik.utils; import com.googlecode.lanterna.TerminalSize; import com.googlecode.lanterna.TextColor; +import cz.jzitnik.config.Debugging; import cz.jzitnik.events.handlers.FullRoomDrawHandler; import cz.jzitnik.game.GameRoom; import cz.jzitnik.game.Player; @@ -31,14 +32,14 @@ public class RerenderUtils { return new RoomCords(x, y); } - public static void rerenderPart(int startX, int endX, int startY, int endY, int screenStartX, int screenStartY, GameRoom currentRoom, BufferedImage room, Player player, BufferedImage playerTexture, ScreenBuffer screenBuffer, ResourceManager resourceManager) { + public static void rerenderPart(int startX, int endX, int startY, int endY, int screenStartX, int screenStartY, GameRoom currentRoom, BufferedImage room, Player player, BufferedImage playerTexture, ScreenBuffer screenBuffer, ResourceManager resourceManager, Debugging debugging) { var buffer = screenBuffer.getRenderedBuffer(); var overrideBuffer = currentRoom.getOverrideBuffer(); BufferedImage doors = resourceManager.getResource(ResourceManager.Resource.DOORS); Set doorPositions = RerenderUtils.getDoorPositions(currentRoom); for (int x = startX; x <= endX; x++) { for (int y = startY; y <= endY; y++) { - PixelResult pixelResult = getPixel(currentRoom, room, doors, doorPositions, player, playerTexture, x, y); + PixelResult pixelResult = getPixel(currentRoom, room, doors, doorPositions, player, playerTexture, x, y, debugging); int pixel = pixelResult.pixel(); int red = (pixel >> 16) & 0xff; @@ -57,9 +58,21 @@ public class RerenderUtils { public record PixelResult(int pixel, boolean isPlayer) {} - public static PixelResult getPixel(GameRoom currentRoom, BufferedImage room, BufferedImage doors, Set doorPositions, Player player, BufferedImage playerTexture, int x, int y) { + public static PixelResult getPixel(GameRoom currentRoom, BufferedImage room, BufferedImage doors, Set doorPositions, Player player, BufferedImage playerTexture, int x, int y, Debugging debugging) { + if (debugging.isRenderColliders() && currentRoom.getColliders().stream().anyMatch(collider -> collider.isWithin(new RoomCords(x, y)))) { + return new PixelResult(0xFFFF0000, false); + } + if (x >= player.getPlayerCords().getX() && x < player.getPlayerCords().getX() + playerTexture.getWidth() - 1 && y >= player.getPlayerCords().getY() && y <= player.getPlayerCords().getY() + playerTexture.getHeight() - 1) { - int pixel = playerTexture.getRGB(x - player.getPlayerCords().getX(), y - player.getPlayerCords().getY()); + int relativeX = x - player.getPlayerCords().getX(); + int relativeY = y - player.getPlayerCords().getY(); + + + if (debugging.isRenderPlayerCollider() && relativeX == 0 && relativeY == 0){ + return new PixelResult(0xFFFF0000, false); + } + + int pixel = playerTexture.getRGB(relativeX, relativeY); int alpha = (pixel >> 24) & 0xff; if (alpha != 0) {