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