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

Java游戏开发问题:跨类更新布尔值失败致角色无法移动

问题修复方案

1. 修正按键按下状态的错误赋值

在KeyHandler的keyPressed方法中,按下S键时错误地将downPressed设为false,这会导致按下S键时无法触发向下移动逻辑,需改为true:

@Override
public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();
    if(code == KeyEvent.VK_W){
        upPressed = true;
        System.out.println(upPressed);
    }
    // 修正此处的赋值逻辑
    if(code == KeyEvent.VK_S){
        downPressed = true;
    }
    if(code == KeyEvent.VK_A){
        leftPressed = true;
    }
    if(code == KeyEvent.VK_D){
        rightPressed = true;
    }
}

2. 修改update方法的条件判断逻辑

原update方法使用else if,同一时间只能响应一个按键(比如同时按W和A时,仅W的逻辑会执行)。改为独立的if判断,即可支持多按键同时输入:

public void update(){
    if(KH.upPressed){
        System.out.println("Updating");
        playerY -= playerSpeed;
    }
    // 替换else if为独立if,支持多方向同时移动
    if(KH.downPressed){
        playerY += playerSpeed;
    }
    if(KH.leftPressed){
        playerX -= playerSpeed;
    }
    if(KH.rightPressed){
        playerX += playerSpeed;
    }
}

3. 优化游戏线程帧率(可选)

原线程循环无帧率控制,会导致CPU占用过高。可添加简单逻辑锁定60FPS:

public void run(){
    long drawInterval = 1000000000 / 60;
    long nextDrawTime = System.nanoTime() + drawInterval;

    while(gameThread != null){
        update();
        repaint();

        try {
            long remainingTime = nextDrawTime - System.nanoTime();
            remainingTime = remainingTime < 0 ? 0 : remainingTime;
            Thread.sleep(remainingTime / 1000000);
            nextDrawTime += drawInterval;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

完成以上修改后,update方法即可正确获取更新后的布尔变量,实现角色移动,同时支持多方向按键输入。

内容的提问来源于stack exchange,提问作者Paula Rodríguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:15:48