2016-07-29 12 views
1

私は古典的な「画面上で画像を移動」プログラムを作成しています。 Keylistenerの代わりに、キーバインディングを稼働させようとしていますが、これまでのところ成功していません。入力マップとアクションマップをインスタンス化する方法とその方法

私のオブジェクトがLinkedListの

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

にあり、

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) { 
    } 
} 

}

マイプレイヤーを次のように私のキーバインドクラスがある

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

を経由して、このリストに追加クラス私もキーバインドを「活性化」するかどうかはわからない

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はプレーヤーオブジェクトにどのように関連付けられていますか?私は動作しませんでした、このような何かをやってみました:

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

私は私のプレイヤーがJComponentのにキャストする必要がありますいくつかの方法だと思うが、私はそれはと互換性がありませんEclipseは私に伝えて(これがどのように行われるかわかりません私のGameObjectクラス)。誰かが正しい方向に私を導くことができますか?私が間違っていくつかの重要な情報を忘れてしまった場合は教えてください。

答えて

0

キーバインディングをアクティブ化する必要はありません。ActionMapを入力するとすでに有効になっています。あなたはを実行しますは、ActionオブジェクトのactionPerfomedメソッドを実装する必要があります。 Actionオブジェクトは、基本的にアクションハンドラです。一度作成されると何もするべきではなく、アクションが実際に実行された後にのみ行うべきです。

+0

また、フォローアップとして、あなたは_register_の意味を誤解していると思います。キーハンドラの「登録」とは、キーの押下をリスンする機能を追加することです** **クリック自体を登録することではありません。したがって、あなたのキー機能をactionPerformedメソッドに移して、ハンドラを登録する機能のロジックを行わないようにする必要があります。なぜなら、本質的に「それぞれのキー入力を聞き始める」ということだけです。 –

+0

PlayerオブジェクトのgetActionMapを呼び出すことで、既に実行しました。イベントが発生すると、ActionEventにはプレイヤーがソースとして含まれている必要があります。プレーヤーにキャストするだけです。 –

+0

申し訳ありませんが、私のコメントを削除します。編集していた。私はクラスShuttleMoveはAbstractAction { \t \t公共ShuttleMove(オブジェクト選手){ \t \t \t this.player =プレイヤーを拡張するような何かを試してみたかったです。 \t \t} \t \t公共ボイドのactionPerformed(のActionEvent e)の{ \t \t \t this.setVelocityForward(this.getVelocityForward()+ 0。1)。 \t \t} \t}私はプレーヤーにキャストする方法がわからないので、概念的には何かを見逃しているかもしれません。とにかく、私はそれをできるだけ早く読み上げます。回答いただきありがとうございます。 – user2913053

関連する問題