Java 绑定关键帧以移动图像

Java 绑定关键帧以移动图像,java,swing,keylistener,Java,Swing,Keylistener,我正在为一个学校项目制作一个游戏,作为一个步骤,我必须将关键点绑定到图像上,该图像将在x-y轴上加/减。然而,我这样做的方式似乎不起作用,并没有添加少量,而是将x/y增加了很多,并将图像传送到屏幕之外 KeyListener代码 public void keyPressed(KeyEvent e) { if (e.getKeyCode() == 87) { up = true ; if (e.getKeyCode() == 65) {

我正在为一个学校项目制作一个游戏,作为一个步骤,我必须将关键点绑定到图像上,该图像将在x-y轴上加/减。然而,我这样做的方式似乎不起作用,并没有添加少量,而是将x/y增加了很多,并将图像传送到屏幕之外

KeyListener代码

public void keyPressed(KeyEvent e) {

    if (e.getKeyCode() == 87) {
        up = true ;
        if (e.getKeyCode() == 65) {
            left = true ; 
        }
        if (e.getKeyCode() == 68) {
            right = true ;
        }
        if (e.getKeyCode() == 83) {
            down = true ;
        }
    }

}

@Override
public void keyReleased(KeyEvent e) {

    if (e.getKeyCode() == 87) {
        up = false ;
    }
    if (e.getKeyCode() == 65) {
        left = false; 
    }
    if (e.getKeyCode() == 68) {
        right = false ;
    }
    if (e.getKeyCode() == 83) {
        down = false ;
    }

}
游戏循环

public void run() {

    while(running) {

        //Player movement
        if (up) {
            y++ ;
        }
        if (left) {
            x-- ;
        }
        if (right) {
            x++;
        }
        if (down) {
            y-- ;
        }
        //Player movement

    }
}   
图形循环

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    //Graphical loop start
    g.drawImage(Player, x, y, null) ;       

    //Graphical loop end
    repaint();

代码按预期的方式工作。您只忘记了一件事:用于移动图像的while循环的运行速度比您预期的要快得多。只需插入一个Thread.sleepsomeDelay,使循环运行得更慢,图像的移动速度应该更方便用户。

代码的工作方式与预期的一样。您只忘记了一件事:用于移动图像的while循环的运行速度比您预期的要快得多。只需插入一个Thread.sleepsomeDelay,使循环运行得更慢,图像应以更方便用户的速度移动。

不会回答您的问题,但:

if (e.getKeyCode() == 87) 
不要使用魔法数字。人们不知道87是什么意思。使用API提供的字段名:

if (e.getKeyCode() == KeyEvent.VK_UP) 
此外,在paintComponent方法中,您有:

//Graphical loop end
repaint();

不要在绘画方法中调用重绘。这将导致无限循环。清除该代码。

不会回答您的问题,但:

if (e.getKeyCode() == 87) 
不要使用魔法数字。人们不知道87是什么意思。使用API提供的字段名:

if (e.getKeyCode() == KeyEvent.VK_UP) 
此外,在paintComponent方法中,您有:

//Graphical loop end
repaint();

不要在绘画方法中调用重绘。这将导致无限循环。删除该代码。

这可能是由于更新速度太快。考虑提供一个说明你的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将导致较少的混乱和更好的响应,也考虑使用键绑定API而不是密钥监听器。有关更多详细信息,请参见旁注,您应该在按下键时检查大括号。我编辑以更正您的代码格式,并注意到可能存在错误。left/right/down位于up块内。e.getKeyCode==83不要像83那样使用“幻数”。每个键都定义了常量,它们的数字可能会随着JRE实现或操作系统的不同而变化。这可能是由于更新的速度。考虑提供一个说明你的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将导致较少的混乱和更好的响应,也考虑使用键绑定API而不是密钥监听器。有关更多详细信息,请参见旁注,您应该在按下键时检查大括号。我编辑以更正您的代码格式,并注意到可能存在错误。left/right/down位于up块内。e.getKeyCode==83不要像83那样使用“幻数”。每个键都定义了常量,它们的数字可能会随着JRE实现或操作系统的变化而变化。重新绘制是为了使图像基于x轴和y轴移动和更新。没有它,它不会移动,因为它永远不会更新。@Sumtinlazy评论是关于在绘制方法中重新绘制的,而不是一个避免重新绘制的建议。当状态改变时,或者在游戏循环中以适当的延迟调用repaint,如果屏幕内容几乎每次迭代都会改变的话。如前所述,从paintComponent重新绘制是一个有效的无限循环,并尽可能快地排队绘制。最好在两者之间有一些延迟,因为屏幕无论如何都不能任意快速地更新。我是否必须创建一个调用重新绘制的方法,以及如何重新绘制特定的图像。@Sumtinlazy,基本上,当您更改x/y的值时,您需要重新绘制。因此,您可以在运行while循环时添加repaint方法。当然,正如Paul已经提到的,您仍然需要通过添加Thread.sleep.repait使循环运行得更慢,以便图像根据x轴和y轴移动和更新。没有它,它不会移动,因为它永远不会更新。@Sumtinlazy评论是关于在绘制方法中重新绘制的,而不是一个避免重新绘制的建议。当状态改变时,或者在游戏循环中以适当的延迟调用repaint,如果屏幕内容几乎每次迭代都会改变的话。如前所述,从paintComponent重新绘制是一个有效的无限循环,并尽可能快地排队绘制。最好在两者之间有一些延迟,因为屏幕无论如何都不能任意快速地更新。我是否必须创建一个调用重新绘制的方法,以及如何重新绘制特定的图像。@Sumtinlazy,基本上,当您更改x/y的值时,您需要重新绘制。因此,您可以在运行while循环时添加repaint方法。当然,正如Paul已经提到的,您仍然需要通过添加Thread.sleep来降低循环的运行速度。