From 2d69c0146984fd683ee1e61cdb3c667717867880 Mon Sep 17 00:00:00 2001 From: Maurice Date: Wed, 26 Nov 2025 22:51:06 +0100 Subject: [PATCH] added collision --- .../jgame2d/core/CollisionHandler.java | 54 ++++++++++++++++++ src/de/miaurizius/jgame2d/core/GamePanel.java | 7 ++- src/de/miaurizius/jgame2d/entity/Entity.java | 4 ++ src/de/miaurizius/jgame2d/entity/Player.java | 57 ++++++++++--------- .../miaurizius/jgame2d/tile/TileManager.java | 7 ++- 5 files changed, 97 insertions(+), 32 deletions(-) create mode 100644 src/de/miaurizius/jgame2d/core/CollisionHandler.java diff --git a/src/de/miaurizius/jgame2d/core/CollisionHandler.java b/src/de/miaurizius/jgame2d/core/CollisionHandler.java new file mode 100644 index 0000000..cebaffe --- /dev/null +++ b/src/de/miaurizius/jgame2d/core/CollisionHandler.java @@ -0,0 +1,54 @@ +package de.miaurizius.jgame2d.core; + +import de.miaurizius.jgame2d.entity.Entity; + +public class CollisionHandler { + + GamePanel panel; + + public CollisionHandler(GamePanel panel) { + this.panel = panel; + } + + public void checkTile(Entity entity) { + int entityLeftWorldX = entity.worldX + entity.solidArea.x; + int entityRightWorldX = entity.worldX + entity.solidArea.x + entity.solidArea.width; + int entityTopWorldY = entity.worldY + entity.solidArea.y; + int entityBottomWorldY = entity.worldY + entity.solidArea.y + entity.solidArea.height; + + int entityLeftCol = entityLeftWorldX/panel.tileSize; + int entityRightCol = entityRightWorldX/panel.tileSize; + int entityTopRow = entityTopWorldY/panel.tileSize; + int entityBottomRow = entityBottomWorldY/panel.tileSize; + + int tileNum1, tileNum2; + + switch(entity.direction) { + case UP: + entityTopRow = (entityTopWorldY - entity.speed)/panel.tileSize; + tileNum1 = panel.tileM.mapTileNum[entityLeftCol][entityTopRow]; + tileNum2 = panel.tileM.mapTileNum[entityRightCol][entityTopRow]; + if(panel.tileM.tile[tileNum1].collision || panel.tileM.tile[tileNum2].collision) entity.collisionOn = true; + break; + case DOWN: + entityBottomRow = (entityBottomWorldY + entity.speed)/panel.tileSize; + tileNum1 = panel.tileM.mapTileNum[entityLeftCol][entityBottomRow]; + tileNum2 = panel.tileM.mapTileNum[entityRightCol][entityBottomRow]; + if(panel.tileM.tile[tileNum1].collision || panel.tileM.tile[tileNum2].collision) entity.collisionOn = true; + break; + case LEFT: + entityLeftCol = (entityLeftWorldX - entity.speed)/panel.tileSize; + tileNum1 = panel.tileM.mapTileNum[entityLeftCol][entityTopRow]; + tileNum2 = panel.tileM.mapTileNum[entityLeftCol][entityBottomRow]; + if(panel.tileM.tile[tileNum1].collision || panel.tileM.tile[tileNum2].collision) entity.collisionOn = true; + break; + case RIGHT: + entityRightCol = (entityRightWorldX + entity.speed)/panel.tileSize; + tileNum1 = panel.tileM.mapTileNum[entityRightCol][entityTopRow]; + tileNum2 = panel.tileM.mapTileNum[entityRightCol][entityBottomRow]; + if(panel.tileM.tile[tileNum1].collision || panel.tileM.tile[tileNum2].collision) entity.collisionOn = true; + break; + } + } + +} diff --git a/src/de/miaurizius/jgame2d/core/GamePanel.java b/src/de/miaurizius/jgame2d/core/GamePanel.java index 7647abe..18d5164 100644 --- a/src/de/miaurizius/jgame2d/core/GamePanel.java +++ b/src/de/miaurizius/jgame2d/core/GamePanel.java @@ -31,6 +31,7 @@ public class GamePanel extends JPanel implements Runnable { TileManager tileM = new TileManager(this); KeyHandler keyH = new KeyHandler(); Thread gameThread; + public CollisionHandler collisionH = new CollisionHandler(this); public Player player = new Player(this, keyH); public GamePanel() { @@ -48,7 +49,7 @@ public class GamePanel extends JPanel implements Runnable { @Override public void run() { - double drawInterval = 1000000000 / FPS; + double drawInterval = (double) 1000000000 / FPS; double delta = 0; double lastTime = System.nanoTime(); long currentTime; @@ -58,7 +59,7 @@ public class GamePanel extends JPanel implements Runnable { while(gameThread != null) { currentTime = System.nanoTime(); delta += (currentTime - lastTime) / drawInterval; - timer += currentTime - lastTime; + timer += (long) (currentTime - lastTime); lastTime = currentTime; if(delta >= 1) { @@ -68,7 +69,7 @@ public class GamePanel extends JPanel implements Runnable { drawCount++; } if(timer >= 1000000000) { - System.out.println("FPS: " + drawCount); + //System.out.println("FPS: " + drawCount); drawCount = 0; timer = 0; } diff --git a/src/de/miaurizius/jgame2d/entity/Entity.java b/src/de/miaurizius/jgame2d/entity/Entity.java index 51142ba..9988295 100644 --- a/src/de/miaurizius/jgame2d/entity/Entity.java +++ b/src/de/miaurizius/jgame2d/entity/Entity.java @@ -2,6 +2,7 @@ package de.miaurizius.jgame2d.entity; import de.miaurizius.jgame2d.core.Direction; +import java.awt.*; import java.awt.image.BufferedImage; public class Entity { @@ -15,4 +16,7 @@ public class Entity { public int spriteCounter = 0; public int spriteNum = 1; + public Rectangle solidArea; + public boolean collisionOn = false; + } diff --git a/src/de/miaurizius/jgame2d/entity/Player.java b/src/de/miaurizius/jgame2d/entity/Player.java index ac32b93..91acf00 100644 --- a/src/de/miaurizius/jgame2d/entity/Player.java +++ b/src/de/miaurizius/jgame2d/entity/Player.java @@ -20,8 +20,16 @@ public class Player extends Entity { public Player(GamePanel panel, KeyHandler keyH) { this.panel = panel; this.keyH = keyH; + screenX = panel.screenWidth/2 - panel.tileSize/2; screenY = panel.screenHeight/2 - panel.tileSize/2; + + solidArea = new Rectangle(); + solidArea.x = 9; + solidArea.y = 18; + solidArea.width = 32; + solidArea.height = 32; + setDefaultValues(); getPlayerImage(); } @@ -51,18 +59,22 @@ public class Player extends Entity { public void update() { //Move player if(keyH.upPressed || keyH.downPressed || keyH.leftPressed || keyH.rightPressed) { - if(keyH.upPressed) { - direction = Direction.UP; - worldY -= speed; - } else if(keyH.downPressed) { - direction = Direction.DOWN; - worldY += speed; - } else if(keyH.leftPressed) { - direction = Direction.LEFT; - worldX -= speed; - } else if(keyH.rightPressed) { - direction = Direction.RIGHT; - worldX += speed; + if(keyH.upPressed) direction = Direction.UP; + else if(keyH.downPressed) direction = Direction.DOWN; + else if(keyH.leftPressed) direction = Direction.LEFT; + else if(keyH.rightPressed) direction = Direction.RIGHT; + + // CHECK TILE COLLISION + collisionOn = false; + panel.collisionH.checkTile(this); + + if(!collisionOn) { + switch (direction) { + case UP -> worldY -= speed; + case DOWN -> worldY += speed; + case LEFT ->worldX -= speed; + case RIGHT -> worldX += speed; + } } spriteCounter++; @@ -75,21 +87,12 @@ public class Player extends Entity { } public void draw(Graphics2D graphics2d) { - BufferedImage image = null; - switch (direction) { - case UP: - image = (spriteNum == 1) ? up1 : up2; - break; - case DOWN: - image = (spriteNum == 1) ? down1 : down2; - break; - case LEFT: - image = (spriteNum == 1) ? left1 : left2; - break; - case RIGHT: - image = (spriteNum == 1) ? right1 : right2; - break; - } + BufferedImage image = switch (direction) { + case UP -> (spriteNum == 1) ? up1 : up2; + case DOWN -> (spriteNum == 1) ? down1 : down2; + case LEFT -> (spriteNum == 1) ? left1 : left2; + case RIGHT -> (spriteNum == 1) ? right1 : right2; + }; graphics2d.drawImage(image, screenX, screenY, panel.tileSize, panel.tileSize, null); } diff --git a/src/de/miaurizius/jgame2d/tile/TileManager.java b/src/de/miaurizius/jgame2d/tile/TileManager.java index c1949f6..55345ab 100644 --- a/src/de/miaurizius/jgame2d/tile/TileManager.java +++ b/src/de/miaurizius/jgame2d/tile/TileManager.java @@ -9,8 +9,8 @@ import java.io.*; public class TileManager { GamePanel panel; - Tile[] tile; - int[][] mapTileNum; + public Tile[] tile; + public int[][] mapTileNum; public TileManager(GamePanel panel) { this.panel = panel; @@ -27,15 +27,18 @@ public class TileManager { tile[1] = new Tile(); tile[1].image = ImageIO.read(new FileInputStream("assets/tiles/wall.png")); + tile[1].collision = true; tile[2] = new Tile(); tile[2].image = ImageIO.read(new FileInputStream("assets/tiles/water.png")); + tile[2].collision = true; tile[3] = new Tile(); tile[3].image = ImageIO.read(new FileInputStream("assets/tiles/earth.png")); tile[4] = new Tile(); tile[4].image = ImageIO.read(new FileInputStream("assets/tiles/tree.png")); + tile[4].collision = true; tile[5] = new Tile(); tile[5].image = ImageIO.read(new FileInputStream("assets/tiles/sand.png"));