Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从keyListener获取多个键_Java_Keylistener - Fatal编程技术网

Java 从keyListener获取多个键

Java 从keyListener获取多个键,java,keylistener,Java,Keylistener,我想编一个两人游戏,其中一人和wsad玩,另一人和yghj玩。如果其中一个播放器一直按下按键,KeyListener将无法收听其他按键。我应该怎样做才能让他们两个都被倾听 @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == 39) player1.setBounds((dim_player1.width += 5), dim_player1.height, 80, 120); e

我想编一个两人游戏,其中一人和wsad玩,另一人和yghj玩。如果其中一个播放器一直按下按键,KeyListener将无法收听其他按键。我应该怎样做才能让他们两个都被倾听

@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);

}

嗯。我的TZ时间是早上6点,所以我可能错了,但是-线程。将键盘状态存储在线程安全的set/map中,在按下事件时更新set/map,使用每个游戏勾选的状态执行结果

或者只使用布尔数组。在大多数情况下也会起作用。例如:

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可以使用它,我也可以。序数的契约足够坚固


而且-是的。可能重复。

可能重复的我看到了,但我不明白如果按下该怎么办。大小>1{//当前按下了多个键//反复按下以获取键。}例如,我想获取两个键的KeyChar,我该如何做?可能重复的