2011-06-29 34 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可能的重复。