2009-07-15 49 views
1

我正在教我自己,從在線教程,如何用Java編寫遊戲。我正在使用Java小程序來創建Pong遊戲。每個槳由1v1比賽的不同鍵控制。如果兩個用戶在不同的時間點擊這些鍵,這可以正常工作。但是當一個鍵被按下並且另一個鍵被按下時(例如:按住箭頭鍵,然後用戶2握住'S'鍵),第二鍵覆蓋第一鍵並且第一個槳將停止移動。我猜測我需要使用線程,但是我不太瞭解它們,而且我無法理解如何使用/實現它們。如果兩個(或更多)按鍵被按下,我將如何處理這種情況?如何處理Java Applet中的多個按鍵?

獎勵:就像我說過的,我對線程知之甚少 - 我假設我還需要一個球/冰球,在其他所有事情都在進行中。是正確的,如果是的話,我如何把線程放在不需要輸入的東西上?

感謝您的幫助, DJ

回答

3

你通常做的是記住每個按鍵的狀態。

您可以保留一個操作數組(或者所有鍵的數組,如果您也想要的話)。 keyDown事件導致例如

boolean actions[12];... 
... 

public boolean keyDown(Event e, int key) { 
if (key == 'a') { 
    actions[ACTION_LEFT] = true; 
    } 
.. 
} 

而且您需要捕獲keyup事件並在釋放鍵時將動作設置爲false。

在運動的邏輯,你可以只檢查按鍵

if(actions[ACTION_LEFT] == true) 
    moveLeft(); 
if(actions[ACTION_RIGTH] == true) 
    moveRight(); 
+1

將此與Lou Franco關於建立遊戲循環的回答結合起來。檢查按鍵的狀態將在該循環內。 – Ricket 2009-07-17 13:40:00

3

,而不是通常的線程,遊戲使用一些所謂的遊戲循環(google一下)。

http://en.wikipedia.org/wiki/Game_programming

的基本思路是

Loop 
    Get all inputs 
    Get game clock 
    Update state based on clock and inputs 
    Update Display 
    Limit frame rate if you need to 

反正 - 而不是讓鍵盤事件 - 你在某些點檢查鍵盤的狀態。此代碼似乎做它爲Java

http://www.gamedev.net/reference/articles/article2439.asp

它利用事件來設置你在你的循環看變量。

+0

感謝您的輸入。我從來沒有聽說過「遊戲循環」。那第二個環節有很棒的東西。再次感謝! – Daniel 2009-07-22 17:35:00

+0

這個答案與no的結合,爲我節省了很多頭痛和時間。謝謝!!! – svarog 2014-05-06 13:52:31

0

如果我沒有弄錯,你可以使用Applet提供的keyUp()和keyDown()方法。你有沒有嘗試在keyDown上設置一個標誌,然後在keyUp上取消設置?例如:

public boolean keyDown(Event e, int key) 
    { 
     if (key == 'a') { 
     player1.go("left") 
     } 
    } 

    public boolean keyUp(Event e, int key) 
    { 
     if (key == 'a') { 
     player1.stop("left") 
     } 
    } 

只是一個想法。我確信有一個標準的方法來處理這個問題。

0

的狀態,您可以使用Swing Timer定期火的keydown/keyup事件之間的運動賽事。

1

只是爲了防止任何人想看到我如何最終回答這個問題。我的keyDown()和keyUp()方法如下:

public boolean keyDown(Event e, int key) 
{ 
     message = key + "pressed"; 

     //right paddle 
     if(key == 1005) 
     { 
      rpaddle_up = true; 
     } 
     if(key == 1004) 
     { 
      rpaddle_down = true; 
     } 

     //left paddle 
     if(key == 115) 
     { 
      lpaddle_up= true; 
     } 
     if(key == 119) 
     { 
      lpaddle_down=true; 
     } 

     //x key = exit 
     if(key == 'x') 
      System.exit(0); 
     return true;   
    } 

public boolean keyUp(Event e, int key) 
    { 
     //right paddle 
     if(key == 1005) 
     { 
      rpaddle_up = false; 
     } 
     if(key == 1004) 
     { 
      rpaddle_down = false; 
     } 

     //left paddle 
     if(key == 115) 
     { 
      lpaddle_up= false; 
     } 
     if(key == 119) 
     { 
      lpaddle_down=false; 
     } 
     return true; 
    } 

希望如果某人有同樣的問題,這將幫助他們。並感謝大家的意見和幫助。