2015-11-14 42 views
0

不知道如何標題的話。調整按鍵讓你不能「保持」它

我對我的「太空侵略者」型遊戲有一些代碼。我把整個事情做了調整。爲了拍攝,我使用空格鍵。問題是無法持有空格鍵並持續拍攝。我寧願多次按下它(如果我堅持下來,因爲它不會持續發射)我將如何改變它?

*這裏是我認爲是問題的根源的代碼。如果源位於其他地方,請說出來。

private class KeyInputHandler extends KeyAdapter { 
    private int pressCount = 1; 

    /** 
    * key pressed 
    */ 
    public void keyPressed(KeyEvent e) { 
     if (waitingForKeyPress) { 
      return; 
     } 

     if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
      leftPressed = true; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      rightPressed = true; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_SPACE) { 
      firePressed = true; 
     } 
    } 

    /** 
    * Key Released 
    */ 
    public void keyReleased(KeyEvent e) { 

     if (waitingForKeyPress) { 
      return; 
     } 

     if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
      leftPressed = false; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      rightPressed = false; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_SPACE) { 
      firePressed = false; 
     } 
    } 

添加代碼

public class ShotEntity extends Entity { 
    //vertical speed 
    private double moveSpeed = -300; 
private Game game; 

private boolean used = false; 

/** 
* Create a new shot from the player 
*/ 
public ShotEntity(Game game,String sprite,int x,int y) { 
    super(sprite,x,y); 

    this.game = game; 

    dy = moveSpeed; 
} 

/** 
* Request that this shot moved based on time 
*/ 
public void move(long delta) { 
    super.move(delta); 

    if (y < -100) { 
     game.removeEntity(this); 
    } 
} 

//collision 
public void collidedWith(Entity other) { 

    // prevents double kills. 
    if (used) { 
     return; 
    } 

    // alien killed 
    if (other instanceof AlienEntity) { 
     game.removeEntity(this); 
     game.removeEntity(other); 

     game.notifyAlienKilled(); 
     used = true; 
    } 
} 

}

+0

此代碼讀取和寫入未在問題中聲明的變量。這使得很難找出你想要做的事情。誰處理'* Pressed'變量以及如何處理? – biziclop

回答

2

收聽兩個單獨關鍵事件。一個是按下鍵,另一個是釋放鍵。現在,你做一個布爾值。 public boolean myBoolean; 按鍵時,將布爾值設置爲truemyBoolean==true),如果它被釋放,則將其設置爲false(myBoolean==false)。

現在,創建一個簡單的if語句:

if(myBoolean==true){ //Key is being held down 
//execute this code 
//Have nothing be done 
} 

完蛋了!

P.S.如果你願意,你可以有一個單獨的方法來清理代碼。這種方法可以改變布爾值:

public void changeValueOfBoolean(Boolean b){ 
if(b = true){ 
return false; 
} 
if(b==false){ 
return true; 
} 
} 

這很簡單。如果您需要幫助,請告知我,如果這有幫助,請將其標記爲最佳答案。隨時問我任何問題,我總是樂於幫助!

澄清:

好了,所以我們有這個布爾,對不對?現在,這個布爾essencialy決定是否按下鍵。

說我們按下按鈕:

由於鍵被按下,我們做布爾myBoolean爲真。現在,因爲用戶正在按住按鍵,我們想要什麼都不做,對吧?這就是爲什麼我們創建了一個if語句:

if(myBoolean==true){ //Key is being held down 
    //execute this code 
    //Have nothing be done 
    } 

它說,如果布爾是真實的,那麼我們就不會做任何事情。回想一下,當鍵被按下時,布爾值爲真,請記住?所以,當按住鍵時,布爾值是真的,什麼都不會做。

現在,當用戶釋放鍵:

現在,假設用戶已經按下的鍵。這將調用兩個監聽器。一個聽衆的時候,鍵是,按,另一個是當時是發佈。如果用戶只是按下該鍵,那麼myBoolean將以虛假結束,因爲他們放棄了鍵。因此,我們可以在myBoolean爲false(拍攝)時執行一些代碼。

**總結:

myBoolean鍵被按下時,當是真實的。所以,當這是真的,我們什麼也不做。 myBoolean當用戶放開鑰匙時是錯誤的,在那裏,我們拍攝空間入侵者。**

+0

我沒有完全理解一切..如果你想進一步細節將是偉大的.. – Ryan

+0

@Ryan看看我的答案澄清部分,那裏我總結了一切我更詳細地說。如果有幫助,請標記爲最佳答案。隨意問更多的問題,我很樂意提供幫助。 :) –

+0

我完全理解!它的非常詳細和幫助很多..問題是我把它放在我的代碼中..我需要改變什麼我已經? – Ryan

0

簡單,只是有一個布爾變量,導致船拍,只有當它是真實的。然後在按下空格鍵時將其設置爲true,並在船發射時將其設置爲false。我不能告訴你如何在你的程序中實現它,因爲我不知道你的拍攝方法如何工作。但是,如果您要張貼導致船舶拍攝的方法,我可以告訴您如何實施它,或者,您可以嘗試自己。

+0

我添加的代碼有幫助嗎? – Ryan

+0

導致船隻射擊的方法是需要的 – Paul