From 7bcc46122c73939bf21988aa0186e3dd6d217daf Mon Sep 17 00:00:00 2001 From: Urban Modig Date: Fri, 15 Aug 2025 20:45:29 +0200 Subject: [PATCH] Refactoring to use pixel-perfect Collision check --- .../se/urmo/game/collision/CollisionChecker.java | 6 +++--- src/main/java/se/urmo/game/entities/PacMan.java | 3 +-- src/main/java/se/urmo/game/main/Game.java | 4 ++-- src/main/java/se/urmo/game/map/GameMap.java | 15 +++++++++------ 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/se/urmo/game/collision/CollisionChecker.java b/src/main/java/se/urmo/game/collision/CollisionChecker.java index 8db5abd..d6d2f40 100644 --- a/src/main/java/se/urmo/game/collision/CollisionChecker.java +++ b/src/main/java/se/urmo/game/collision/CollisionChecker.java @@ -16,6 +16,7 @@ public class CollisionChecker { } public Point getValidDestination(Direction direction, Point position, int agent_width, int agent_height) { + List list = switch (direction) { case RIGHT -> List.of( new Point(position.x + agent_width, position.y), // TOPRIGHT @@ -32,6 +33,8 @@ public class CollisionChecker { default -> Collections.EMPTY_LIST; }; + System.out.println( direction + " bounderies for " + position + " are " + list); + List list2 = list.stream() .map(p -> normalizePosition(direction, p, agent_width, agent_height)) .toList(); @@ -51,9 +54,6 @@ public class CollisionChecker { // tunnel if (x < GameMap.OFFSET_X) x = width - agent_width - GameMap.OFFSET_X; // right if (x >= (width - GameMap.OFFSET_X)) x = GameMap.OFFSET_X; // left -// -// if (y < 0) y = height - 1; // optional vertical wrap -// else if (y >= height) y = 0; return new Point(x, y); } diff --git a/src/main/java/se/urmo/game/entities/PacMan.java b/src/main/java/se/urmo/game/entities/PacMan.java index 191c728..ef77e09 100644 --- a/src/main/java/se/urmo/game/entities/PacMan.java +++ b/src/main/java/se/urmo/game/entities/PacMan.java @@ -79,12 +79,11 @@ public class PacMan { case DOWN -> new Point(position.x, position.y + speed); default -> throw new IllegalStateException("Unexpected value: " + direction); }; - + System.out.println("At: " + position+ ",trying to move " + direction.name() + " to " + newPosition); Point destination = collisionChecker.getValidDestination(direction, newPosition, COLLISION_BOX_SIZE, COLLISION_BOX_SIZE); if(destination != null) { position = destination; - System.out.println("Position: + " + position); } } diff --git a/src/main/java/se/urmo/game/main/Game.java b/src/main/java/se/urmo/game/main/Game.java index b9b7944..1279eb5 100644 --- a/src/main/java/se/urmo/game/main/Game.java +++ b/src/main/java/se/urmo/game/main/Game.java @@ -6,7 +6,7 @@ import javax.swing.*; public class Game implements Runnable { public final static int FPS_SET = 120; - public final static int UPS_SET = 200; + public final static int UPS_SET = 120; private final static double timePerFrame = 1000000000.0 / FPS_SET; private final static double timePerUpdate = 1000000000.0 / UPS_SET; @@ -69,7 +69,7 @@ public class Game implements Runnable { if (System.currentTimeMillis() - lastCheck >= 1000) { lastCheck = System.currentTimeMillis(); - System.out.println("FPS: " + frames + " | UPS: " + updates); + //System.out.println("FPS: " + frames + " | UPS: " + updates); frames = 0; updates = 0; } diff --git a/src/main/java/se/urmo/game/map/GameMap.java b/src/main/java/se/urmo/game/map/GameMap.java index 72d44eb..0f82716 100644 --- a/src/main/java/se/urmo/game/map/GameMap.java +++ b/src/main/java/se/urmo/game/map/GameMap.java @@ -135,17 +135,20 @@ public class GameMap { } } - public boolean isPassable(List list) { + public boolean isPassable(List list){ return list.stream().allMatch(p -> isPassable(p.x, p.y)); } - public boolean isPassable(int x, int y) { int row = (y - OFFSET_Y) / MAP_TILESIZE; int col = (x - OFFSET_X) / MAP_TILESIZE; - System.out.println("(x,y)" + x+","+y + " -> col,row: " + col + "," +row); - boolean passable = mapData[row][col].isPassable(); - System.out.println(row + "," + col + "is" +(passable?"":" not") + " passable"); - return passable; + int tileY = (y - OFFSET_Y) % MAP_TILESIZE; + int tileX = (x - OFFSET_X) % MAP_TILESIZE; + System.out.print("Point[x="+x+",y="+y+"] is row="+ row + ", col=" + col + " with reminder x=" +tileX+",y=" +tileY); + + boolean[][] mask = mapData[row][col].getCollisionMask(); + boolean b = mask == null || !mask[tileY][tileX]; + System.out.println(b?" - passable":" - not passable"); + return b; } public int getWidth() {