Compare commits

..

5 Commits

Author SHA1 Message Date
3feb0558ca created moveable player 2025-11-26 21:22:35 +01:00
529effeb12 display actual fps in console 2025-11-26 20:49:31 +01:00
1a822434b3 added moveable component and limited gameclock to 60fps 2025-11-26 20:46:09 +01:00
551dddeb0a Added game clock 2025-11-26 20:27:39 +01:00
ac076e90b5 Created first panel and added it to window 2025-11-26 20:19:17 +01:00
14 changed files with 263 additions and 2 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
assets/player/boy_up_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
assets/player/boy_up_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@@ -10,8 +10,15 @@ public class Boot {
window.setResizable(false);
window.setTitle("JGame2D");
GamePanel gamePanel = new GamePanel();
window.add(gamePanel);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
gamePanel.startGameThread();
}
}

View File

@@ -0,0 +1,19 @@
package de.mp.jgame2d.core;
public enum Direction {
UP("up"),
DOWN("down"),
LEFT("left"),
RIGHT("right");
private final String name;
Direction(String name) {
this.name = name;
}
public String getName() {
return name;
}
}

View File

@@ -1,10 +1,86 @@
package de.mp.jgame2d.core;
import javax.swing.*;
import de.mp.jgame2d.entity.Player;
public class GamePanel extends JPanel {
import javax.swing.*;
import java.awt.*;
public class GamePanel extends JPanel implements Runnable {
// SCREEN SETTINGS
final int originalTileSize = 16; //16x16 tile
final int scale = 3;
public final int tileSize = originalTileSize * scale; //48x48 tile
// 4:3 ratio
final int maxScreenCol = 16;
final int maxScreenRow = 12;
final int screenWidth = tileSize * maxScreenCol; // 768 pixels
final int screenHeight = tileSize * maxScreenRow; // 576 pixels
//FPS
int FPS = 60;
KeyHandler keyH = new KeyHandler();
Thread gameThread;
Player player = new Player(this, keyH);
//Default position
int playerX = 100;
int playerY = 100;
int playerSpeed = 4;
public GamePanel() {
this.setPreferredSize(new Dimension(screenWidth, screenHeight));
this.setBackground(Color.black);
this.setDoubleBuffered(true);
this.addKeyListener(keyH);
this.setFocusable(true);
}
public void startGameThread() {
gameThread = new Thread(this);
gameThread.start();
}
@Override
public void run() {
double drawInterval = 1000000000 / FPS;
double delta = 0;
double lastTime = System.nanoTime();
long currentTime;
long timer = 0;
int drawCount = 0;
while(gameThread != null) {
currentTime = System.nanoTime();
delta += (currentTime - lastTime) / drawInterval;
timer += currentTime - lastTime;
lastTime = currentTime;
if(delta >= 1) {
update();
repaint();
delta--;
drawCount++;
}
if(timer >= 1000000000) {
System.out.println("FPS: " + drawCount);
drawCount = 0;
timer = 0;
}
}
}
public void update() {
player.update();
}
public void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
Graphics2D graphics2d = (Graphics2D) graphics;
player.draw(graphics2d);
graphics.dispose();
}
}

View File

@@ -0,0 +1,50 @@
package de.mp.jgame2d.core;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyHandler implements KeyListener {
public boolean upPressed, downPressed, leftPressed, rightPressed;
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_W, KeyEvent.VK_UP:
upPressed = true;
break;
case KeyEvent.VK_S, KeyEvent.VK_DOWN:
downPressed = true;
break;
case KeyEvent.VK_A, KeyEvent.VK_LEFT:
leftPressed = true;
break;
case KeyEvent.VK_D, KeyEvent.VK_RIGHT:
rightPressed = true;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_W, KeyEvent.VK_UP:
upPressed = false;
break;
case KeyEvent.VK_S, KeyEvent.VK_DOWN:
downPressed = false;
break;
case KeyEvent.VK_A, KeyEvent.VK_LEFT:
leftPressed = false;
break;
case KeyEvent.VK_D, KeyEvent.VK_RIGHT:
rightPressed = false;
break;
}
}
}

View File

@@ -0,0 +1,18 @@
package de.mp.jgame2d.entity;
import de.mp.jgame2d.core.Direction;
import java.awt.image.BufferedImage;
public class Entity {
public int x, y;
public int speed;
public BufferedImage up1, up2, down1, down2, left1, left2, right1, right2;
public Direction direction;
public int spriteCounter = 0;
public int spriteNum = 1;
}

View File

@@ -0,0 +1,91 @@
package de.mp.jgame2d.entity;
import de.mp.jgame2d.core.Direction;
import de.mp.jgame2d.core.GamePanel;
import de.mp.jgame2d.core.KeyHandler;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
public class Player extends Entity {
GamePanel panel;
KeyHandler keyH;
public Player(GamePanel panel, KeyHandler keyH) {
this.panel = panel;
this.keyH = keyH;
setDefaultValues();
getPlayerImage();
}
public void setDefaultValues() {
x = 100;
y = 100;
speed = 4;
direction = Direction.DOWN;
}
public void getPlayerImage() {
try {
up1 = ImageIO.read(new FileInputStream("assets/player/boy_up_1.png"));
up2 = ImageIO.read(new FileInputStream("assets/player/boy_up_2.png"));
down1 = ImageIO.read(new FileInputStream("assets/player/boy_down_1.png"));
down2 = ImageIO.read(new FileInputStream("assets/player/boy_down_2.png"));
left1 = ImageIO.read(new FileInputStream("assets/player/boy_left_1.png"));
left2 = ImageIO.read(new FileInputStream("assets/player/boy_left_2.png"));
right1 = ImageIO.read(new FileInputStream("assets/player/boy_right_1.png"));
right2 = ImageIO.read(new FileInputStream("assets/player/boy_right_2.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void update() {
//Move player
if(keyH.upPressed || keyH.downPressed || keyH.leftPressed || keyH.rightPressed) {
if(keyH.upPressed) {
direction = Direction.UP;
y -= speed;
} else if(keyH.downPressed) {
direction = Direction.DOWN;
y += speed;
} else if(keyH.leftPressed) {
direction = Direction.LEFT;
x -= speed;
} else if(keyH.rightPressed) {
direction = Direction.RIGHT;
x += speed;
}
spriteCounter++;
if(spriteCounter > 12) {
if(spriteNum == 1) spriteNum = 2;
else if(spriteNum == 2) spriteNum = 1;
else spriteNum = 0;
}
}
}
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;
}
graphics2d.drawImage(image, x, y, panel.tileSize, panel.tileSize, null);
}
}