From 1a822434b3b8e18d9fd2a0b1e2ba4c3ab2aa262c Mon Sep 17 00:00:00 2001 From: Maurice Date: Wed, 26 Nov 2025 20:46:09 +0100 Subject: [PATCH] added moveable component and limited gameclock to 60fps --- src/de/mp/jgame2d/core/GamePanel.java | 42 ++++++++++++++++++++-- src/de/mp/jgame2d/core/KeyHandler.java | 50 ++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 src/de/mp/jgame2d/core/KeyHandler.java diff --git a/src/de/mp/jgame2d/core/GamePanel.java b/src/de/mp/jgame2d/core/GamePanel.java index 11c2e94..bb2d722 100644 --- a/src/de/mp/jgame2d/core/GamePanel.java +++ b/src/de/mp/jgame2d/core/GamePanel.java @@ -16,12 +16,23 @@ public class GamePanel extends JPanel implements Runnable { final int screenWidth = tileSize * maxScreenCol; // 768 pixels final int screenHeight = tileSize * maxScreenRow; // 576 pixels + //FPS + int FPS = 60; + + KeyHandler keyH = new KeyHandler(); Thread gameThread; + //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() { @@ -31,18 +42,43 @@ public class GamePanel extends JPanel implements Runnable { @Override public void run() { + double drawInterval = 1000000000 / FPS; + double delta = 0; + double lastTime = System.nanoTime(); + long currentTime; + while(gameThread != null) { - update(); - repaint(); + currentTime = System.nanoTime(); + delta += (currentTime - lastTime) / drawInterval; + lastTime = currentTime; + + if(delta >= 1) { + update(); + repaint(); + delta--; + } } } public void update() { - + //Move player + if(keyH.upPressed) { + playerY -= playerSpeed; + } else if(keyH.downPressed) { + playerY += playerSpeed; + } else if(keyH.leftPressed) { + playerX -= playerSpeed; + } else if(keyH.rightPressed) { + playerX += playerSpeed; + } } public void paintComponent(Graphics graphics) { super.paintComponent(graphics); + Graphics2D graphics2d = (Graphics2D) graphics; + graphics2d.setColor(Color.white); + graphics2d.fillRect(playerX, playerY, tileSize, tileSize); + graphics.dispose(); } } diff --git a/src/de/mp/jgame2d/core/KeyHandler.java b/src/de/mp/jgame2d/core/KeyHandler.java new file mode 100644 index 0000000..cac49e9 --- /dev/null +++ b/src/de/mp/jgame2d/core/KeyHandler.java @@ -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; + } + } +}