2012-10-28 28 views
0

問題是,如果我按住其中一個箭頭鍵,則會不斷移動。我的意思是,如果我按住左邊,它會移動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到我的畫布---添加(遊戲);

回答

3

當您按下箭頭鍵時,操作系統只會將一個按鍵事件發送到Java應用程序。這意味着按下鍵只會導致你的船隻移動一次。

如果按住鍵,延遲一段時間後,操作系統將開始發送重複鍵按下的事件。如果我在這裏按住我的'鑰匙...... ssssssssssssssssssssssss我的第一個'立即出現,然後短暫延遲,然後其餘的'人物'快速進入。這是在你的程序中發生的同樣的事情。

要更正此問題,您需要定期更新您的船舶(或者如果您在更新船舶時考慮了時間增量,則以可變間隔更新)。注意一個重要的區別:被按下的按鍵發生在瞬間,而按鍵的狀態是隨時間變化的函數(值爲UP或DOWN)。

不知道我是否爲你混淆了這個問題。如果您需要,我可以嘗試以不同的方式解釋。

+0

謝謝你,我明白,但只需要解決我將如何做不同 – user1776707