Java 为什么我的动作粗糙(不流畅)?

Java 为什么我的动作粗糙(不流畅)?,java,Java,问题是,如果我按住其中一个箭头键,则在不断移动之间存在延迟。我的意思是,如果我按住左键,它会移动7个像素,再过一会儿它就会不断移动。有人能告诉我如何修复它,使其“平稳”运行吗 代码-------------------- 包装游戏 import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyEvent; import java.awt.event.KeyListe

问题是,如果我按住其中一个箭头键,则在不断移动之间存在延迟。我的意思是,如果我按住左键,它会移动7个像素,再过一会儿它就会不断移动。有人能告诉我如何修复它,使其“平稳”运行吗

代码--------------------

包装游戏

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;


public class GamePlay implements KeyListener{
 int shipX = 400;
 int shipY = 300;
public int shipSpeed = 7;
public void incShipX(int i) {this.shipX += i;}
public void incShipY(int i) {this.shipY += i;}

Image ship;


File shipFile = new File("C:/Users/Pictures/ship.png");

public GamePlay() {
    try {        
        ship = ImageIO.read(shipFile);

    } catch (IOException ex) {
        Logger.getLogger(GamePlay.class.getName()).log(Level.SEVERE, null, ex);
    }

}

public void drawShip(Graphics g) {  

    g.drawImage(ship, shipX, shipY, null);    

}

@Override
public void keyTyped(KeyEvent ke) {

}

@Override
public void keyPressed(KeyEvent ke) {
    if(ke.getKeyCode() == KeyEvent.VK_LEFT) {
        incShipX(-shipSpeed);
    }

    if(ke.getKeyCode() == KeyEvent.VK_RIGHT) {
        incShipX(shipSpeed);
    }

    if(ke.getKeyCode() == KeyEvent.VK_UP) {
        incShipY(-shipSpeed);
    }

    if(ke.getKeyCode() == KeyEvent.VK_DOWN) {
        incShipY(shipSpeed);
    }
}

@Override
public void keyReleased(KeyEvent ke) {

}
}


我正在将keyListener添加到我的画布中--add(游戏性)

按箭头键时,操作系统只向Java应用程序发送一个按键按下事件。这意味着按下该键只会使你的飞船移动一次

如果在延迟后按住按键,操作系统将开始发送重复的按键事件。如果我在这里按住s键。。。ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss。这与您的程序中发生的情况相同

要纠正这一点,您需要定期更新船舶(或者在更新船舶时考虑时间增量的情况下,以可变间隔更新船舶)。请注意一个重要的区别:按键发生在瞬间,而按键的状态是随时间变化的函数(值为向上或向下)


我不知道我是否为你搞乱了这个问题。如果您需要,我可以尝试以不同的方式进行解释。

当您按下箭头键时,您的操作系统只向Java应用程序发送一个按键按下事件。这意味着按下该键只会使你的飞船移动一次

如果在延迟后按住按键,操作系统将开始发送重复的按键事件。如果我在这里按住s键。。。ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss。这与您的程序中发生的情况相同

要纠正这一点,您需要定期更新船舶(或者在更新船舶时考虑时间增量的情况下,以可变间隔更新船舶)。请注意一个重要的区别:按键发生在瞬间,而按键的状态是随时间变化的函数(值为向上或向下)


我不知道我是否为你搞乱了这个问题。如果您需要,我可以尝试以不同的方式解释。

谢谢您,我理解,但需要确定我将如何做不同的事情。谢谢您,我理解,但需要确定我将如何做不同的事情