问题是,如果我按住其中一个箭头键,则在不断移动之间会有延迟。我的意思是,如果我向左按住,它将移动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添加到我的Canvas --- add(gamePlay);
答案 0 :(得分:3)
按箭头键时,操作系统仅向Java应用程序发送一个按键事件。这意味着按下该键只会使您的船只移动一次。
如果按住键,延迟一段时间后,操作系统将开始发送重复按键事件。如果我按住我的'钥匙在这里... ssssssssssssssssssssss我的第一个'立刻出现,然后有一个短暂的延迟,然后其余的's'字符迅速进入。这与你的程序中发生的事情是一样的。
要更正此问题,您需要定期更新您的船舶(如果您在更新船舶时考虑时间差异,则需要以可变间隔更新)。注意一个重要的区别:按下键是在瞬间发生的,而键的状态是随时间变化的函数(值为UP或DOWN)。
不确定我是否为您混淆了这个问题。如果你需要,我可以尝试不同的解释。