You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未按键时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:35:15