【问题标题】:Smoother movement when key is held Keyhandler按住键时移动更顺畅 Keyhandler
【发布时间】:2022-12-10 16:35:47
【问题描述】:

例如,每次我按下 W 时,我的播放器都会向上移动 20。但是当我按住 W 时,它会向上移动 20,等待一秒钟,然后上升得更快。

是否可以让我的播放器无需等待而立即“快速”上升?

我的代码:

@Override
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_W) up = true;
    if(e.getKeyCode() == KeyEvent.VK_A) left = true;
    if(e.getKeyCode() == KeyEvent.VK_S) down = true;
    if(e.getKeyCode() == KeyEvent.VK_D) right = true;

    if(up == true){
        if(Main.y == -100){
            return;
        }
        Main.y -= 20;

        Main.frame.repaint();
    }
    if(left == true){
        if(Main.x == -40){
            return;
        }
        Main.x -= 20;
        Main.frame.repaint();
    }
    if(down == true){
        if(Main.y == 440){
            return;
        }
        Main.y += 20;
        Main.frame.repaint();
    }
    if(right == true){
        if(Main.x == 520){
            return;
        }
        Main.x += 20;
        Main.frame.repaint();
    }
}

@Override
public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_W) up = false;
    if(e.getKeyCode() == KeyEvent.VK_A) left = false;
    if(e.getKeyCode() == KeyEvent.VK_S) down = false;
    if(e.getKeyCode() == KeyEvent.VK_D) right = false;
}

【问题讨论】:

  • 按键绑定和 Swing 定时器

标签: java key


【解决方案1】:

每个方向都有一个布尔值,在调用 keyPressed() 和 keyReleased() 时得到更新绝对是正确的方法。问题是 keyPressed() 还包含移动播放器和重新绘制框架的代码。你必须把它放在某种以固定延迟重复调用的方法中,并根据这些布尔值中的哪些是true来移动玩家。我的意思是这样的:

public static void main(String[] args)
{
    /// ...
    while(programIsRunning) {
        movePlayer();
        frame.repaint();
        // let your program sleep here
    }
}

public static void movePlayer() {
    if(up == true){
        if(Main.y == -100){
            return;
        }
        Main.y -= 20;
    }
    if(left == true){
        if(Main.x == -40){
            return;
        }
        Main.x -= 20;
    }
    if(down == true){
        if(Main.y == 440){
            return;
        }
        Main.y += 20;
    }
    if(right == true){
        if(Main.x == 520){
            return;
        }
        Main.x += 20;
    }
}

@Override
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_W) up = true;
    if(e.getKeyCode() == KeyEvent.VK_A) left = true;
    if(e.getKeyCode() == KeyEvent.VK_S) down = true;
    if(e.getKeyCode() == KeyEvent.VK_D) right = true;
}

@Override
public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_W) up = false;
    if(e.getKeyCode() == KeyEvent.VK_A) left = false;
    if(e.getKeyCode() == KeyEvent.VK_S) down = false;
    if(e.getKeyCode() == KeyEvent.VK_D) right = false;
}

这样你的播放器应该移动得更顺畅

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多