added collision
This commit is contained in:
54
src/de/miaurizius/jgame2d/core/CollisionHandler.java
Normal file
54
src/de/miaurizius/jgame2d/core/CollisionHandler.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"));
|
||||||
|
|||||||
Reference in New Issue
Block a user