2016-07-29 6 views
1

고전적인 "화면에서 이미지 이동"프로그램을 만들고 있습니다. Keylistener 대신 키 바인딩을 얻으려고하지만 성공하지 못했습니다.입력 맵 및 액션 맵을 인스턴스화하는 방법 및 위치

내 객체는 LinkedList의

public LinkedList<GameObject> object = new LinkedList<GameObject>(); 

에 있고

public void addObject(GameObject object){ 
    this.object.add(object); 
} 

를 통해이 목록에 추가

public class KeyBindings extends JPanel{ 

private static final String accelerate = "accelerate"; 

public KeyBindings(){ 
    System.out.println("test"); 
    registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "UP-press", new ShuttleMove(accelerate)); 
} 

public void registerKeyBinding(KeyStroke keyStroke, String name, Action action) { 
    InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
    ActionMap am = getActionMap(); 

    im.put(keyStroke, name); 
    am.put(name, action); 
} 

class ShuttleMove extends AbstractAction { 

    public ShuttleMove(String movement) { 

      if (movement.equals("accelerate")){ 
       //this.setVelocityForward(this.getVelocityForward() + 0.1); 
       System.out.println("accelerate"); 
      } 
    } 
    public void actionPerformed(ActionEvent e) { 
    } 
} 

}

내 플레이어를 다음과 같이 내 키 바인딩 클래스입니다 뚜껑 같은 게임 오브젝트 클래스 외모 (약간 응축) 확장 S :

public class Player extends GameObject { 

Handler handler; 

public Player(int x, int y, ID id, int width, int height, int rotation,double totalRotation, Handler handler, double velocityForward, double velocityRotate){ 
    super(x, y, id, width, height, rotation, totalRotation); 
    this.handler = handler; 

} 

public void tick(){ 
    x += this.getVelocityForward(); 
    y += this.getVelocityForward(); 
} 
public void render(Graphics2D g2d){ 

    try { 
     player = ImageIO.read(new File("src/Game/images/shuttle3.png")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    AffineTransform old = g2d.getTransform(); 
    AffineTransform at = AffineTransform.getTranslateInstance(x,y);  

    g2d.drawImage(player, at,null); 
    g2d.setTransform(old); 
} 
} 

는 비록 키 바인딩을 "활성화"하는 방법을 잘 모르겠습니다. 메인 루프에 있어야합니까? 플레이어 이미지를 업데이트하고 이후에 그려야하는 player.tick 메서드에 있어야합니까?

또한 inputmap 및 actionmap이 플레이어 개체와 어떻게 관련되어 있습니까? 나는 작동하지 않았다 같은 것을, 일을 시도 : 내 플레이어가 JComponent에 캐스팅되는 방법 몇 가지를 생각

public void registerKeyBinding(KeyStroke keyStroke, String name, Action action) { 
    for (int i = 0; i < handler.object.size(); i++){ 
     GameObject player = handler.object.get(i); 
     //find player 
     if (player.getID() == ID.Player){ 
      InputMap im = player.getInputMap(WHEN_IN_FOCUSED_WINDOW); 
      ActionMap am = player.getActionMap(); 

      im.put(keyStroke, name); 
      am.put(name, action); 
     } 
    } 
} 

을하지만 이클립스는 나에게 말한다대로와 호환되지 않습니다 (이 작업을 수행하는 방법을 잘 모르겠습니다 내 GameObject 클래스). 누군가 올바른 방향으로 나를 안내 할 수 있습니까? 실수로 중요한 정보를 빠뜨린 경우 알려주십시오. (내가 한 일은 확실합니다.)

답변

0

키 바인딩을 "활성화"할 필요가 없습니다. ActionMap을 채우면 이미 활성화되어 있습니다. 무엇 할 필요가 Action 개체의 actionPerfomed 메서드를 구현해야 할. Action 개체는 기본적으로 동작 처리기입니다. 일단 생성되면 아무런 행동을해서는 안되며, 일단 실제로 행동을 취한 후에 만해야합니다.

+0

또한 후속 조치로 여기에 _register_의 의미를 잘못 해석했다고 생각합니다. 키 핸들러를 등록하는 것은 키 누르기를 듣는 기능을 추가하는 것입니다 ** ** 클릭 자체를 등록하는 것이 아닙니다. 따라서 핵심 기능을 actionPerformed 메소드로 옮기고 핸들러를 등록하는 기능에 어떠한 로직도 사용하지 않아야합니다. 핵심은 "각각의 키 누르기 시작"이라고 말하는 것입니다. –

+0

Player 객체에서 getActionMap을 호출하여 이미 수행했습니다. 이벤트가 시작되면 ActionEvent에 플레이어가 소스로 포함되어야합니다. 플레이어로 전송하면됩니다. –

+0

내 의견을 삭제 해 주셔서 죄송합니다. 편집 중이 었어. I 클래스 ShuttleMove이 AbstractAction로 { \t \t 공공 ShuttleMove (개체 플레이어) { \t \t \t this.player = 플레이어를 확장 같은 것을 원했고, \t \t \t \t} 공개 무효의 actionPerformed (ActionEvent의 전자) { \t \t \t this.setVelocityForward (this.getVelocityForward() + 0.1); \t \t} \t} 플레이어에게 던지기가 확실치 않아 뭔가 개념적으로 놓칠 수 있습니다. 어쨌든, 나는 그걸 최대한 빨리 읽을거야. 답변 해 주셔서 감사합니다. – user2913053