2014-01-11 109 views
-1

我聲明在java中編寫我的第一個遊戲,我需要一些幫助讓KeyListener適合我的遊戲。在教程一些搜索後我已經imlemented這樣的:需要幫助在Java中實現用於2D遊戲的KeyListener

frame.addKeyListener(new KeyAdapter(){ 

private boolean[] keys = new boolean[120]; 
public boolean up , down , left , right; 



public void tick() { 
    up = keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W];  
    down = keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S]; 
    left = keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A]; 
    right = keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D]; 
} 

public void keyPressed(KeyEvent e) { 
    if(e.getKeyCode() != KeyEvent.VK_F5) keys[e.getKeyCode()] = true; 
    tick(); 
    if (up){ 
     yMap+=4; 
     direction='n'; 
     xInd=0; 
    } 
    else if(down){ 
     yMap-=4; 
     direction='s'; 
     xInd=2; 
    } 
    else if(right){ 
     xMap-=4; 
     direction='e'; 
     xInd=1; 
    } 
    else if(left){ 
     xMap+=4; 
     direction='w'; 
     xInd=3; 
    } 
    wait++; 
    if(wait==5){ 
     yInd++; 
     wait=0; 
    } 
    if(yInd==3) 
     yInd=0; 
    cha=sprites[xInd][yInd]; 
    panel.repaint(); 
} 

public void keyReleased(KeyEvent e) { 
    keys[e.getKeyCode()] = false; 
    tick(); 
    yInd=0; 
    cha=sprites[xInd][yInd]; 
    panel.repaint(); 
} 

public void keyTyped(KeyEvent e) { 
} 
}); 

但是每一件事情就是在這段代碼罰款,字符正確地移動精靈是完美的,但它缺少的只有一件事,我唯一需要的是當我向一個方向移動角色時,讓我們說例如UP,只需點擊向上按鈕(這通常應該使它只有4個像素點向上移動),角色應該完成自動走向下一個方形(每個方格是32 * 32像素)。

這裏的爲例,可以說我有什麼一些事情是這樣地圖:

http://i.stack.imgur.com/I6hwj.jpg

紅色的色格拉是我想招的角色,我需要的是當我按下上升按鈕紅色色格拉應自動轉到下一廣場這樣的:

http://i.stack.imgur.com/1XPPX.jpg

,它不應該停留在中間!

我希望我解釋得很好,我的問題和對英語不好的抱歉!

+1

你有點說的代碼應該做的,但到底是什麼它目前辦?而且,如果你在這個主題上搜索,你肯定發現你根本不應該使用KeyListeners,而是使用Key Bindings。 –

+0

如何使用密鑰綁定? – anony50600

+0

谷歌教程。這是非常有用的,是教我如何使用這些。 –

回答

1

你可以使用線程(java.lang.Thread)。當玩家按下一個按鍵時,您將開始一個新的線程,該線程將延遲(Thread#sleep),將該圓圈移動1個像素,32次。您還需要一個變量(標誌),一旦玩家按下按鍵,您就將其設置爲true,並且在線程完成後設置爲false(因此,如果玩家開始瘋狂地按下按鍵,則圓圈將不會開始移動可能的方向)。

編輯:好的,這是給你的代碼的框架:

// we react only if the circle is currently not moving 
if (!moving) { 
    moving = true; // can't do new move until circle finishes current one 
    Thread t = new Thread() { 

     public void run() { 
      for (int i = 0; i < 32; i++) { 
       // move the circle 
       Thread.sleep(10); // sleep for 10 ms 
      } 
      moving = false; 
     } 
    } 
    t.start() 
} 
+0

thx的建議,但我希望你能告訴我如何使用線程在這種情況下,因爲我仍然不專業在Java! – anony50600

+0

我嘗試過,但仍然不能完美工作,當我點擊向上按鈕時,它似乎已經被傳送到下一個角色而不改變角色間的角色! – anony50600

+0

然後通過發佈完整的實際代碼 –