未按键时2D游戏角色自动上移的问题求助
问题:2D游戏角色自动向上移动
我正在学习2D游戏开发用于自我提升,写完代码后运行发现白色矩形角色会自动向上移动,检查了每一行代码都没找到原因,恳请帮助。
主类代码
package main; import javax.swing.JFrame; public class Main { public static void main(String[] args) { JFrame window = new JFrame(); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setResizable(false); window.setTitle("MY 2-D GAME"); GamePanel gamePanel = new GamePanel(); window.add(gamePanel); window.pack(); window.setLocationRelativeTo(null); window.setVisible(true); gamePanel.startGameThread(); } }
GamePanel类代码
package main; import javax.swing.JPanel; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; public class GamePanel extends JPanel implements Runnable{ private static final int FPS = 60; final int originalTileSize = 16; final int scale = 3; final int tileSize = originalTileSize * scale; // 48x48 final int maxScreenCol = 16; final int maxScreenRow = 12; final int screenWidth = tileSize * maxScreenCol; final int screenHeight = tileSize * maxScreenRow; KeyHandler key_Handler = new KeyHandler(); Thread gameThread; int player_x = 100; int player_y = 100; int player_speed = 4; public GamePanel() { this.setPreferredSize(new Dimension(screenWidth,screenHeight)); this.setBackground(Color.black); this.setDoubleBuffered(true); this.addKeyListener(key_Handler); this.setFocusable(true); } public void startGameThread() { gameThread = new Thread(this); gameThread.start(); } public void run() { double drawInterval = 1000000000/FPS; double delta = 0; long lastTime = System.nanoTime(); long current_time; while (gameThread != null) { current_time = System.nanoTime(); delta += (current_time - lastTime) / drawInterval; lastTime = current_time; if (delta >= 1) { update(); repaint(); delta--; } } } public void update() { if (key_Handler.upMove = true) { player_y -= player_speed; } else if (key_Handler.downMove = true) { player_y += player_speed; } else if (key_Handler.leftMove = true) { player_x -= player_speed; } else if (key_Handler.rightMove = true) { player_x += player_speed; } } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setColor(Color.white); g2.fillRect(player_x,player_y, tileSize, tileSize); g2.dispose(); } }
KeyHandler类代码
package main; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class KeyHandler implements KeyListener{ public boolean upMove, downMove, leftMove, rightMove; public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); if (code == KeyEvent.VK_W) { upMove = true; } if (code == KeyEvent.VK_S) { downMove = true; } if (code == KeyEvent.VK_A) { leftMove = true; } if (code == KeyEvent.VK_D) { rightMove = true; } } public void keyReleased(KeyEvent e) { int code = e.getKeyCode(); if (code == KeyEvent.VK_W) { upMove = false; } if (code == KeyEvent.VK_S) { downMove = false; } if (code == KeyEvent.VK_A) { leftMove = false; } if (code == KeyEvent.VK_D) { rightMove = false; } } }
解决方案
问题出在GamePanel类的update方法里,你把比较运算符==写成了赋值运算符=:
// 错误写法:这里是赋值操作,直接把upMove设为true,条件永远成立 if (key_Handler.upMove = true) {
赋值运算符=会直接修改变量的值,所以每次调用update时,key_Handler.upMove都会被设为true,导致角色持续向上移动。
修改方法:
把所有if判断里的=改成==,或者更简洁的直接判断布尔变量(因为布尔变量本身就是条件):
修正后的update方法:
public void update() { if (key_Handler.upMove) { player_y -= player_speed; } else if (key_Handler.downMove) { player_y += player_speed; } else if (key_Handler.leftMove) { player_x -= player_speed; } else if (key_Handler.rightMove) { player_x += player_speed; } }
这样修改后,角色只会在对应按键被按下时移动,不会自动向上跑了。
内容的提问来源于stack exchange,提问作者jrsmith_of_math
相关产品推荐
相关产品推荐

