Sometimes when i run the program and make the white square move, the white square lags. I don´t see anything wrong with the code… and since the application is very simple, i don’t think the hardware is the issue either.
import javax.swing.*;
import java.awt.*;
import java.lang.reflect.InvocationTargetException;
public class GamePanel extends JPanel implements Runnable {
// SCREEN SETTINGS
final int originalTileSize = 16; //16x16 tile.
final int scale = 3;
//the actual tileSize on screen.
final int tileSize = originalTileSize * scale; // 48x48
//horizontally
final int maxScreenCol = 16;
//vertically
final int maxScreenRow = 12;
final int screenWidth = tileSize * maxScreenCol; //768 px.
final int screenHeight = tileSize * maxScreenRow; // 576 px;
//FPS
int FPS = 60;
KeyHandler keyH = new KeyHandler();
Thread gameThread;
//set player's 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();
}
public void run() {
double drawInterval = 1_000_000_000.0 / FPS; // 0.01666 seconds.
double delta = 0;
long currentTime;
long timer = 0;
int drawCount = 0;
long lastTime = System.nanoTime();
while (gameThread != null) {
currentTime = System.nanoTime();
delta += (currentTime - lastTime) / drawInterval;
timer += (currentTime - lastTime);
lastTime = currentTime;
if (delta >= 1) {
update();
repaint();
delta--;
drawCount++;
}
if (timer >= 1_000_000_000) {
System.out.println("FPS: " + drawCount);
drawCount = 0;
timer = 0;
}
}
}
public void update() {
if (keyH.upPressed) {
playerY -= playerSpeed;
} else if (keyH.downPressed) {
playerY += playerSpeed;
} else if (keyH.leftPressed) {
playerX -= playerSpeed;
} else if (keyH.rightPressed) {
playerX += playerSpeed;
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.white);
g2.fillRect(playerX, playerY, tileSize, tileSize);
g2.dispose();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setResizable(false);
window.setTitle("2D Adventure");
GamePanel gamePanel = new GamePanel();
window.add(gamePanel);
window.pack();
window.setVisible(true);
gamePanel.startGameThread();
});
}
}
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();
if (code == KeyEvent.VK_W) {
upPressed = true;
}
if (code == KeyEvent.VK_S) {
downPressed = true;
}
if (code == KeyEvent.VK_A) {
leftPressed = true;
}
if (code == KeyEvent.VK_D) {
rightPressed = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_W) {
upPressed = false;
}
if (code == KeyEvent.VK_S) {
downPressed = false;
}
if (code == KeyEvent.VK_A) {
leftPressed = false;
}
if (code == KeyEvent.VK_D) {
rightPressed = false;
}
}
}
My activity monitor when the program runs:
When i run the program, my computer becomes warm, i have a Macbook Air M1, 2020, it doesn’t have a fan.
I have rebooted my computer but still the lag persists. I have also updated the computer to the latest version. I don’t know how to reduce the CPU usage, other than replacing the game loop. I did so by adding another game loop that sleeps, it didn’t help at all.