added collision

This commit is contained in:
2025-11-26 22:51:06 +01:00
parent 00f59ec896
commit 2d69c01469
5 changed files with 97 additions and 32 deletions

View File

@@ -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;
}
}
}

View File

@@ -31,6 +31,7 @@ public class GamePanel extends JPanel implements Runnable {
TileManager tileM = new TileManager(this); TileManager tileM = new TileManager(this);
KeyHandler keyH = new KeyHandler(); KeyHandler keyH = new KeyHandler();
Thread gameThread; Thread gameThread;
public CollisionHandler collisionH = new CollisionHandler(this);
public Player player = new Player(this, keyH); public Player player = new Player(this, keyH);
public GamePanel() { public GamePanel() {
@@ -48,7 +49,7 @@ public class GamePanel extends JPanel implements Runnable {
@Override @Override
public void run() { public void run() {
double drawInterval = 1000000000 / FPS; double drawInterval = (double) 1000000000 / FPS;
double delta = 0; double delta = 0;
double lastTime = System.nanoTime(); double lastTime = System.nanoTime();
long currentTime; long currentTime;
@@ -58,7 +59,7 @@ public class GamePanel extends JPanel implements Runnable {
while(gameThread != null) { while(gameThread != null) {
currentTime = System.nanoTime(); currentTime = System.nanoTime();
delta += (currentTime - lastTime) / drawInterval; delta += (currentTime - lastTime) / drawInterval;
timer += currentTime - lastTime; timer += (long) (currentTime - lastTime);
lastTime = currentTime; lastTime = currentTime;
if(delta >= 1) { if(delta >= 1) {
@@ -68,7 +69,7 @@ public class GamePanel extends JPanel implements Runnable {
drawCount++; drawCount++;
} }
if(timer >= 1000000000) { if(timer >= 1000000000) {
System.out.println("FPS: " + drawCount); //System.out.println("FPS: " + drawCount);
drawCount = 0; drawCount = 0;
timer = 0; timer = 0;
} }

View File

@@ -2,6 +2,7 @@ package de.miaurizius.jgame2d.entity;
import de.miaurizius.jgame2d.core.Direction; import de.miaurizius.jgame2d.core.Direction;
import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
public class Entity { public class Entity {
@@ -15,4 +16,7 @@ public class Entity {
public int spriteCounter = 0; public int spriteCounter = 0;
public int spriteNum = 1; public int spriteNum = 1;
public Rectangle solidArea;
public boolean collisionOn = false;
} }

View File

@@ -20,8 +20,16 @@ public class Player extends Entity {
public Player(GamePanel panel, KeyHandler keyH) { public Player(GamePanel panel, KeyHandler keyH) {
this.panel = panel; this.panel = panel;
this.keyH = keyH; this.keyH = keyH;
screenX = panel.screenWidth/2 - panel.tileSize/2; screenX = panel.screenWidth/2 - panel.tileSize/2;
screenY = panel.screenHeight/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(); setDefaultValues();
getPlayerImage(); getPlayerImage();
} }
@@ -51,18 +59,22 @@ public class Player extends Entity {
public void update() { public void update() {
//Move player //Move player
if(keyH.upPressed || keyH.downPressed || keyH.leftPressed || keyH.rightPressed) { if(keyH.upPressed || keyH.downPressed || keyH.leftPressed || keyH.rightPressed) {
if(keyH.upPressed) { if(keyH.upPressed) direction = Direction.UP;
direction = Direction.UP; else if(keyH.downPressed) direction = Direction.DOWN;
worldY -= speed; else if(keyH.leftPressed) direction = Direction.LEFT;
} else if(keyH.downPressed) { else if(keyH.rightPressed) direction = Direction.RIGHT;
direction = Direction.DOWN;
worldY += speed; // CHECK TILE COLLISION
} else if(keyH.leftPressed) { collisionOn = false;
direction = Direction.LEFT; panel.collisionH.checkTile(this);
worldX -= speed;
} else if(keyH.rightPressed) { if(!collisionOn) {
direction = Direction.RIGHT; switch (direction) {
worldX += speed; case UP -> worldY -= speed;
case DOWN -> worldY += speed;
case LEFT ->worldX -= speed;
case RIGHT -> worldX += speed;
}
} }
spriteCounter++; spriteCounter++;
@@ -75,21 +87,12 @@ public class Player extends Entity {
} }
public void draw(Graphics2D graphics2d) { public void draw(Graphics2D graphics2d) {
BufferedImage image = null; BufferedImage image = switch (direction) {
switch (direction) { case UP -> (spriteNum == 1) ? up1 : up2;
case UP: case DOWN -> (spriteNum == 1) ? down1 : down2;
image = (spriteNum == 1) ? up1 : up2; case LEFT -> (spriteNum == 1) ? left1 : left2;
break; case RIGHT -> (spriteNum == 1) ? right1 : right2;
case DOWN: };
image = (spriteNum == 1) ? down1 : down2;
break;
case LEFT:
image = (spriteNum == 1) ? left1 : left2;
break;
case RIGHT:
image = (spriteNum == 1) ? right1 : right2;
break;
}
graphics2d.drawImage(image, screenX, screenY, panel.tileSize, panel.tileSize, null); graphics2d.drawImage(image, screenX, screenY, panel.tileSize, panel.tileSize, null);
} }

View File

@@ -9,8 +9,8 @@ import java.io.*;
public class TileManager { public class TileManager {
GamePanel panel; GamePanel panel;
Tile[] tile; public Tile[] tile;
int[][] mapTileNum; public int[][] mapTileNum;
public TileManager(GamePanel panel) { public TileManager(GamePanel panel) {
this.panel = panel; this.panel = panel;
@@ -27,15 +27,18 @@ public class TileManager {
tile[1] = new Tile(); tile[1] = new Tile();
tile[1].image = ImageIO.read(new FileInputStream("assets/tiles/wall.png")); tile[1].image = ImageIO.read(new FileInputStream("assets/tiles/wall.png"));
tile[1].collision = true;
tile[2] = new Tile(); tile[2] = new Tile();
tile[2].image = ImageIO.read(new FileInputStream("assets/tiles/water.png")); tile[2].image = ImageIO.read(new FileInputStream("assets/tiles/water.png"));
tile[2].collision = true;
tile[3] = new Tile(); tile[3] = new Tile();
tile[3].image = ImageIO.read(new FileInputStream("assets/tiles/earth.png")); tile[3].image = ImageIO.read(new FileInputStream("assets/tiles/earth.png"));
tile[4] = new Tile(); tile[4] = new Tile();
tile[4].image = ImageIO.read(new FileInputStream("assets/tiles/tree.png")); tile[4].image = ImageIO.read(new FileInputStream("assets/tiles/tree.png"));
tile[4].collision = true;
tile[5] = new Tile(); tile[5] = new Tile();
tile[5].image = ImageIO.read(new FileInputStream("assets/tiles/sand.png")); tile[5].image = ImageIO.read(new FileInputStream("assets/tiles/sand.png"));