2011-06-29 79 views
1

我想要編程遊戲,有2個玩家。其中一個玩(w,a,s,d)另一個玩遊戲bye(y,g,h,j)。 但是如果一個玩家保持關鍵,那麼keylistner不能聽其他的一個鍵。我應該怎麼做才能讓他們兩個都能聽呢?通過keyListner獲得多鍵


@Override 
public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == 39) 
     player1.setBounds((dim_player1.width += 5), dim_player1.height, 80, 120); 
    else if (e.getKeyCode() == 37) 
     player1.setBounds((dim_player1.width -= 5), dim_player1.height, 80, 120); 
    else if (e.getKeyCode() == 40) 
     player1.setBounds(dim_player1.width, (dim_player1.height += 5), 80, 120); 
    else if (e.getKeyCode() == 38) 
     player1.setBounds(dim_player1.width, (dim_player1.height -= 5), 80, 120); 

} 

這是我簡單的代碼,我想,當玩家按下兩個38 + 39 e.g它做他們兩個,但我不明白我應該怎麼辦。

+0

[Swing's KeyListener和多個按鍵同時按下]的可能重複。(http://stackoverflow.com/questions/2623995/swings-keylistener-and-multiple-keys-pressed-at-the-same-時間) –

+0

我看到了,但我不明白我該怎麼做 if(pressed.size()> 1)//當前有多個鍵被按下。 //重複按按鈕獲得按鍵。 } 例如我想要getKeyChar這兩個鍵,我該怎麼做呢? –

回答

0

Erm。在我的TZ上午6點,所以我可能是錯的,但是 - 線程。將鍵盤狀態存儲在線程安全的set/map中,在新聞事件中更新set/map,使用每個遊戲tick的狀態執行結果。或者只是使用布爾數組。在大多數情況下也可以工作。例如:

static public enum camera_action { 
    ESCAPE, // e.g. exit to main menu, terminate mouse capture etc 
    MV_FORWARD, MV_BACKWARD, MV_STRAFE_LEFT, MV_STRAFE_RIGHT, MV_JUMP, MV_CROUCH, // etc 
} 

final protected SC_HashMap<Integer, camera_action> keymap = new SC_HashMap.linked<>(); 
protected boolean[] action_state = new boolean[camera_action.values().length]; 

final protected void set_default_keymap() { 
    keymap.put(KeyEvent.VK_SHIFT, camera_action.MV_JUMP); 
    keymap.put(KeyEvent.VK_CONTROL, camera_action.MV_CROUCH); 
    keymap.put(KeyEvent.VK_W, camera_action.MV_FORWARD); 
    keymap.put(KeyEvent.VK_S, camera_action.MV_BACKWARD); 
    keymap.put(KeyEvent.VK_A, camera_action.MV_STRAFE_LEFT); 
    keymap.put(KeyEvent.VK_D, camera_action.MV_STRAFE_RIGHT); 
    keymap.put(KeyEvent.VK_ESCAPE, camera_action.ESCAPE); 
} 

protected void set_action_state(camera_action a, boolean new_state) { 
    action_state[a.ordinal()] = new_state; 
} 

protected boolean get_action_state(camera_action a) { 
    return action_state[a.ordinal()]; 
} 

public void reset_action_state() { 
    action_state = new boolean[camera_action.values().length]; 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    camera_action a = keymap.get(e.getKeyCode()); 
    if (a != null) 
    set_action_state(a, true); 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    camera_action a = keymap.get(e.getKeyCode()); 
    if (a != null) 
    set_action_state(a, false); 
} 

我知道Oracle對Enum.ordinal()的策略 - 我對此毫不知情。如果EnumSet可以使用它,我也可以使用它.Ordinal()的合約足夠穩固。

而 - 是的。 Swing's KeyListener and multiple keys pressed at the same time可能的重複。