2011-07-04 2 views
1

내 큰 문제는 내가 game.i codding 오전 jplay 그들은 cunturrent 재생할 수있는 2 선수가 있습니다. 첫 번째 플레이어는 화살표 키를 사용하고 두 번째는 w/a/s/d 키를 사용하여 플레이합니다. 내 지시자는 cuncurrent 플레이를 달성하기 위해 모든 스레드가 자체 스레드를 관리하는 두 개의 스레드를 인스턴스화해야한다고 말했습니다 .noe 혼란 스럽습니다. 그들 사이에만 디퍼 런스 세라마이드들이들을 수있는 열쇠입니다 견인 선수에 대한 두 개의 스레드를 ...특수 키만 듣는 키 수신기?


난 일부 특수 키 ??에 대한 청취 리스너를 가질 수 어쩌면 나를 도울 수있는 또 다른 질문은 할 수 있습니다 exampe 새로운 듣는 사람은 w/s/a/d buttuns 만 들으니? (나는 keyevent.getkeycode에 익숙하다.하지만 이것은 내 키가 아니다. 다른 키를 듣지 않는 청취자를 원하기 때문이다. 코더 좋아하는 키 선택)

당신이 나를 도와 준다면 나는 무한히 위대 할 것입니다.

답변

1

키 수신기는 모든 키를 수신합니다. 필요한 것에 반응해야합니다. 많은 수의 키 리스너를 가질 수 있기 때문에 플레이어마다 키 리스너를 사용하는 데 문제가 없습니다.

0

keyListener는 눌려진 모든 키를 수신합니다.

그러나 코드 내에 어떤 키가 눌러 졌는지 확인할 수 있습니다. 반응 할 키 중 하나가 아닌 경우 무시하십시오. 사실, 두 클래스 모두에 동일한 클래스를 사용할 수 있으며, 각각의 클래스가 반응해야하는 키를 매개 변수로 전달할 수 있습니다.

그렇다고해서 두 개의 스레드가 필요하지 않습니다. GUI 고정을 피하기 위해 두 개의 스레드 (GUI 관리를위한 스레드, 위치 계산을위한 스레드)를 이해합니다. 물론, 숙제이기 때문에, 이런 식으로 물어볼 수 있습니다. 스레딩의 기본 개념을 배우십시오. 그 확장 funcionalities에 대한 KeyListener 체크 KeyBindings을 듣기 전에 JPanel-Focus을 설정하는 것을 잊지 마세요 전에

2

당신은 here은 매우 당신의 자신의 키 같은 프로세서 (메인 프레임이 JFrame의 인스턴스)

ActionMap actions = ((JComponent)mainFrame.getContentPane()).getActionMap(); 
InputMap inputs = ((JComponent)mainFrame.getContentPane()).getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 

Action a=new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     //call your action code here 
    } 
}; 
actions.put("myAction", a); 

inputs.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.CTRL_DOWN_MASK), "myAction"); 
+0

eeeeerrhhhhttt 빛보다 빨리 +1 – mKorbel

+0

:-) 복사하여 붙여 넣기 – StanislavL

2

를 정의 할 수 있습니다 스윙

EventQueue.invokeLater(new Runnable() { 

    @Override 
    public void run() { 
     myPanel.grabFocus(); 
     myPanel.requestFocus();//or requestFocusinWindow() 
    } 
}); 
+0

+1 Origianlly 한 단어 - KeyBindings를 쓰고 싶습니다만 짧은 답은 사용할 수 없습니다. – StanislavL

0

좋아, 그래서 heres는 내가 그것을 얼마나, 내가 2 개 클래스 중 하나 개라는 게임과 다른 플레이어를 것, 게임 exten에서 청취자에 대한 유용한 정보를 정기적으로 당신의 JFrame의를 DS와 플레이어는 D-키를 사용하고 다른 하나는 ASDW 또는 무엇이든을 heres 예를 들어 사용하는 것이 플레이어, 인스턴스에 대한 하나의 2 개 인스턴스가있을 수 게임에서, 당신의 모든 KeyListener를 구현하는 모든

public void keyPressed(KeyEvent e) 
{ 
    switch(playerNumber) 
    { 
     case PLAYER_1: 
      if(e.getKeyCode==VK_UP) 
      { 
       //do some code for an "up event" 
      } 
      if(e.getKeyCode==VK_DOWN) 
      { 
       //do some code for a "down event" 
      } 
      if(e.getKeyCode==VK_LEFT) 
      { 
       //do some code for a "left event" 
      } 
      if(e.getKeyCode==VK_RIGHT) 
      { 
       //do some code for a "right event" 
      } 
      break; 
     case PLAYER_2: 
      if(e.getKeyCode==VK_W) 
      { 
       //do some code for an "up event" 
      } 
      if(e.getKeyCode==VK_S) 
      { 
       //do some code for a "down event" 
      } 
      if(e.getKeyCode==VK_A) 
      { 
       //do some code for a "left event" 
      } 
      if(e.getKeyCode==VK_D) 
      { 
       //do some code for a "right event" 
      } 
      break; 
    } 
} 
public void keyTyped(KeyEvent e){} 
public void keyReleased(KeyEvent e){} 

public static final int PLAYER_1 = 0; 
public static final int PLAYER_2 = 1; 

을 당신은 player 인스턴스 나 player2가 더 쉬울 것이고, 더 많은 예제가 필요하거나 무엇이든지 필요하다면, hotseat 게임 (1 명 이상이 1 인 플레이 게임)을 플레이어 인스턴스에게 말해야 할 것입니다. 컴퓨터).