2014-04-23 2 views
0

사용자가 을 입력하면 내 GamePanel 클래스의 addShot() 메서드를 호출하기를 원하기 때문에 묻습니다. "이것은 우주선에서 발사 된 미사일을 나타내는 총격 개체를 초기화하지만 아무 것도하지 않습니다. 여기 저기 가시성 문제, 또는 그냥 키 이벤트와 청취자의 관계 잘못된 구조 않았다 나는 단지 관련 코드를 게시하도록하겠습니다 만, 필요한 경우 내가 나머지를 게시 할 수 있습니다 여기에이 키 수신기를 올바르게 구조화 했습니까?

하면 코드입니다 :?.

public static class GameTest extends JFrame { 

    private static final int WINDOW_WIDTH = 800; 
    private static final int WINDOW_HEIGHT = 500; 
    public GamePanel gamePanel; 


    public GameTest() throws IOException { 
     super("Deep Fried Freedom"); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
     setLayout(new BorderLayout()); 
     gamePanel = new GamePanel(); 
     add(gamePanel); 
     center(this); 
     setVisible(true); 
     this.addKeyListener(new aKeyListener()); 
     this.setFocusable(true); 

    } // end constructor 

    public void center(JFrame frame) { 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     Point center = ge.getCenterPoint(); 

     int w = frame.getWidth(); 
     int h = frame.getHeight(); 

     int x = center.x - w/2, y = center.y - h/2; 
     frame.setBounds(x, y, w, h); 
     frame.validate(); 
    }//end of center method 

    public class aKeyListener implements KeyListener { 

     @Override 
     public void keyTyped(KeyEvent e) { 
     }//end empty keyTyped method 

     @Override 
     public void keyPressed(KeyEvent e) { 
      switch (e.getKeyCode()) { 
       case KeyEvent.VK_A: 
        Launcher.lRun = -20; 
        gamePanel.move(gamePanel); 
        break; 
       case KeyEvent.VK_D: 
        Launcher.lRun = 20; 
        gamePanel.move(gamePanel); 
        break; 
       case KeyEvent.VK_ENTER: 
         gamePanel.addShot(); 
        break; 
       default: 
        Launcher.lRun = 0; 
      } 

     }//end keyPressed method 

     @Override 
     public void keyReleased(KeyEvent e) { 
     }//end empty keyReleased method 

    }//end aKeyListener class 

}//end GameTest class 
+0

답변으로 편집 됨 –

답변

3
  1. 너의 것이 초점 문제 일 가능성이 높다 - somet 힌트 GamePanel에서 아마도 훔치고 초점을 매우 KeyListeners에 일반적인 문제.
  2. 일반 조언 :이 유형의 필요에 대한 KeyListener가 아니라 Key Bindings를 사용하는 것이 좋습니다.

유용한 링크 :


편집 예를 들어
:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 

import javax.swing.*; 

public class GameTest extends JFrame { 

    private static final int WINDOW_WIDTH = 800; 
    private static final int WINDOW_HEIGHT = 500; 
    public GamePanel gamePanel; 

    public GameTest() { 
     super("Deep Fried Freedom"); 
     setResizable(false); 
     // setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     // setSize(WINDOW_WIDTH, WINDOW_HEIGHT); // never do this 
     gamePanel = new GamePanel(); 
     setUpKeyBinding(gamePanel); 
     add(gamePanel); 
     pack(); 
     setLocationRelativeTo(null); // to center! 
     setVisible(true); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT); 
    } 

    private void setUpKeyBinding(GamePanel gamePanel2) { 

     // only need window to have focus 
     int condition = JComponent.WHEN_IN_FOCUSED_WINDOW; 

     // get the GamePanel's InputMap and ActionMap as these will be used to set 
     // up our Key Bindings 
     InputMap inputMap = gamePanel2.getInputMap(condition); 
     ActionMap actionMap = gamePanel2.getActionMap(); 

     // bind the A key to move back 20 pixels 
     KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A, 0); 
     inputMap.put(keyStroke, keyStroke.toString()); 
     actionMap.put(keyStroke.toString(), new MoveAction(gamePanel2, -20)); 

     // bind the D key to move forward 20 pixels 
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_D, 0); 
     inputMap.put(keyStroke, keyStroke.toString()); 
     actionMap.put(keyStroke.toString(), new MoveAction(gamePanel2, 20)); 

     // bind the ENTER key 
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); 
     inputMap.put(keyStroke, keyStroke.toString()); 
     actionMap.put(keyStroke.toString(), new EnterAction(gamePanel2)); 

    } 

    public static void main(String[] args) { 
     new GameTest(); 
    } 

    // our Action classes that will bound to key strokes 
    private class MoveAction extends AbstractAction { 
     private GamePanel gamePanel2; 
     private int distance; 

     public MoveAction(GamePanel gamePanel2, int distance) { 
     this.gamePanel2 = gamePanel2; 
     this.distance = distance; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     gamePanel2.moveItem(distance); 
     } 
    } 

    private class EnterAction extends AbstractAction { 
     private GamePanel gamePanel2; 

     public EnterAction(GamePanel gamePanel2) { 
     this.gamePanel2 = gamePanel2; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     gamePanel2.addShot(); 
     } 
    } 

} 

// a trivial GamePanel class to just show that everything is working as expected 
class GamePanel extends JPanel { 

    public void moveItem(int i) { 
     // your moveItem method will instead actually move something, a distance of i 
     System.out.println("Move Item Method distance: " + i); 
    } 

    public void addShot() { 
     // your addShot method will actually shoot 
     System.out.println("Add Shot Method"); 
    } 

} 
+0

고마워, 정말 고맙습니다. 나는이 게시물을 작성한 다음 모든 질문을 한 번에하는 것이 더 좋을 것이라고 결정 했으므로이 게시물을 삭제하려고하는 다른 게시물을 작성한 다음, 귀하의 모범을보고 독서를 시작하고 시간이 나에게서 멀어졌습니다. 그런 이유로 나는 두 번째 것을 동시에 가지고있다. 미안하다. 나는 더 큰 질문을 동시에하는 것은 고 쉬다는 것을 몰랐다. 나는 미래를 염두에 둔다. 두 번째 게시물을 삭제했으며 현재 귀하의 조언을 통해 작업하고 있습니다. 열쇠 바인딩을 다루는 좋은 교과서 추천이 있습니까? 내 소개 텍스트는 아니며 실제로 뭔가를 배우고 온라인에서 찾은 모범 사례를 모방하지 않으면 많은 예제와 철저한 설명이 필요한 사람의 종류는 – Ben

+0

입니다. – Ben

+0

@Ben : 아니요, 1) 자습서 (제 대답의 링크 참조) 이외에 다른 책에 대해서는 잘 모릅니다.이 사이트에서 키 바인딩 코드 예제를 공부하고 있습니다. 그 용어에 대한 사이트를 검색하면 많은 것을 찾을 수 있습니다. 당신의 다른 문제들에 관해서는, 당신이 직면하고있는 각각의 특정 문제에 대해 개별적인 질문을하기를 원할 것입니다. 관심있는 코드를 격리하고 작은 질문을 게시하는 것 등 질문 할 때 좀 더 노력해야합니다. 자체 포함 테스트 가능한 runnable 프로그램, 내가 위에 올린 것과 비슷합니다. –

관련 문제