2016-11-01 8 views
-1

RealTutsGMLのチュートリアルを使用してゲームを作成しています。そのため、2013年の古いビデオを見たことがあれば、このコードの概要を知ることができます。KeyListenerはランダムに動作を停止します。 KeyBindings?

(ちなみに、私はJavaには新しくないが、AWTとSwingにかなり新しくなっている.Minecraft Bukkit/Spigotプラグインを使用していた/まだまだコード化していたからだ。 Java標準言語/構文ですが、AWTとSwing ...)

とにかく、KeyAdapterを使用してキーを制御しています。しかし、それは最初に動作し、次にランダムに動作を停止します。私はそれをデバッグしたし、それはゲーム内のオブジェクトではないようだ、それはKeyAdapterだ。私はこれにいくつかの他の解決策を見てきました。人々はフォーカスや何かを失ってしまったと言いました。代わりにKeyBindingsを使うべきです。 KeyListenerが無作為に私のために働いていないので変です。

Handler handler; 

public KeyInput(Handler handler){ 
    this.handler = handler; 

} 



public void keyPressed(KeyEvent e){ 
    int key = e.getKeyCode(); 

    for (int i = 0; i < handler.object.size(); i++){ 
     GameObject tempObject = handler.object.get(i); 

     if (tempObject.getId() == ObjectId.Player){ 
      if (key == KeyEvent.VK_SPACE && !tempObject.isJumping()){ 
       tempObject.setJumping(true); 
       tempObject.setVelY(-10); 
      } 

      if (key == KeyEvent.VK_Y){ 
       tempObject.setY(100); 
      } 

      if (key == KeyEvent.VK_A){ 
       System.out.println("Pressed A"); 
       tempObject.setVelX(-5); 
      } 
      if (key == KeyEvent.VK_D){ 
       System.out.println("Pressed D"); 

       tempObject.setVelX(5); 
      } 

     } 
    } 

} 
public void keyReleased(KeyEvent e) { 

    int key = e.getKeyCode(); 

    for (int i = 0; i < handler.object.size(); i++) { 

     GameObject tempObject = handler.object.get(i); 

     if (tempObject.getId() == ObjectId.Player) { 



      if (key == KeyEvent.VK_D) { 
       for (int velX = (int) tempObject.getVelX(); velX >= 0; velX--) { 
        tempObject.setVelX(velX); 
       } 
      } 
      if (key == KeyEvent.VK_A) { 
       for (int velX = (int) tempObject.getVelX(); velX <= 0; velX++) { 
        tempObject.setVelX(velX); 
       } 
      } 
     } 
    } 
} 

あなたが見ることができるように

が、私はそれを行うためにKeyAdapterを使用しています:

とにかく、ここで私が使用していたコードです。ここではメインクラスで私の初期化方法は次のとおりです。

private void init(){ 
    WIDTH = getWidth(); 
    HEIGHT = getHeight(); 
    handler = new Handler(); 
    handler.addObject(new Player(100, 100, handler, ObjectId.Player)); 
    handler.createTestLevel(); 

    this.addKeyListener(new KeyInput(handler)); 

} 

initメソッドは、前に呼び出されている「this.requestFocusInWindow()」

私はこの上でいくつかの情報を見て、私は他の解決策として、キーバインドを見ました人々の問題。しかし、JComponentsにキーバインディングを追加する必要があると思います。そのうちの1つを取得する方法はわかりません。新しいJComponent()が動作せず、JFrameがメインクラスを追加しています(これはJComponentではなくComponentとして動作していると思います)。

誰かが助けることができれば、それは素晴らしいことでしょう!ありがとう!

編集#1:

私はKeyBindingsに切り替えました!ここでKeyInputクラスは次のとおりです。

Handler handler; 

public JComponent component; 

public KeyInput(Handler handler, JComponent component){ 
    this.handler = handler; 
    this.component = component; 

    register(); 
} 

public void register(){ 
    Actions actions = new Actions(); 

    component.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressSpace"); 
    component.getActionMap().put("pressSpace", actions.pressSpace()); 

    component.getInputMap().put(KeyStroke.getKeyStroke("A"), "pressLeft"); 
    component.getActionMap().put("pressLeft", actions.pressLeft()); 
    component.getInputMap().put(KeyStroke.getKeyStroke("released A"), "releaseLeft"); 
    component.getActionMap().put("releaseLeft", actions.releaseXMovement()); 

    component.getInputMap().put(KeyStroke.getKeyStroke("D"), "pressRight"); 
    component.getActionMap().put("pressRight", actions.pressRight()); 
    component.getInputMap().put(KeyStroke.getKeyStroke("released D"), "releaseRight"); 
    component.getActionMap().put("releaseRight", actions.releaseXMovement()); 
} 

public JComponent finish(){ 
    return component; 
} 


public class Actions{ 

    public Actions() { } 

    public Action pressRight(){ 
     Action action = new AbstractAction(){ 
      private static final long serialVersionUID = 1L; 

      public void actionPerformed(ActionEvent e) { 
       for (int i = 0; i < handler.object.size(); i++){ 
        GameObject temp = handler.object.get(i); 
        if (temp.getId() == ObjectId.Player){ 
         temp.setVelX(5); 
         System.out.println("pressed right debug"); 
        } 
       } 
      } 

     }; 
     return action; 
    } 

    public Action releaseXMovement(){ 
     Action action = new AbstractAction(){ 
      private static final long serialVersionUID = 1L; 

      public void actionPerformed(ActionEvent e) { 
       for (int i = 0; i < handler.object.size(); i++){ 
        GameObject temp = handler.object.get(i); 
        if (temp.getId() == ObjectId.Player){ 
         temp.setVelX(0); 
        } 
       } 
      } 

     }; 
     return action; 
    } 
    public Action pressLeft(){ 
     Action action = new AbstractAction(){ 
      private static final long serialVersionUID = 1L; 

      public void actionPerformed(ActionEvent e) { 
       for (int i = 0; i < handler.object.size(); i++){ 
        GameObject temp = handler.object.get(i); 
        if (temp.getId() == ObjectId.Player){ 
         temp.setVelX(-5); 
        } 
       } 
      } 

     }; 
     return action; 
    } 

    public Action pressSpace(){ 
     Action action = new AbstractAction(){ 
      private static final long serialVersionUID = 1L; 

      public void actionPerformed(ActionEvent e) { 
       for (int i = 0; i < handler.object.size(); i++){ 
        GameObject temp = handler.object.get(i); 
        if (temp.getId() == ObjectId.Player){ 
         if (!temp.isJumping()){ 
          temp.setJumping(true); 
          temp.setVelY(-10); 
         } 
        } 
       } 
      } 

     }; 
     return action; 
    } 

} 

はしかし、私はまだ同じ凍結問題を抱えています。デバッグメッセージは送信されないので、setVelメソッドとは何の関係もありません。私はリスナーのことがなぜ機能しなくなったのかわかりません... (最初は動作しますが、キーを押し続けると、最終的に停止します)。

は、ここで私はJComponentのを得た方法は次のとおりです。

JComponent comp = (JComponent) frame.getContentPane(); 
    KeyInput input = new KeyInput(handler, comp); 
    frame.add(input.finish()); 
+0

さらに詳しいヘルプが必要な場合は、自分の現在の質問に有効な[mcve]を作成して投稿する必要があります。いつものように、コードはリンクではなくコード形式のテキストとして投稿する必要があります。 –

+0

あなたの質問の下の部分については、「編集する」を参照してください。再び、MCVEは計り知れないほどの助けになるだろう。 –

+0

@HovercraftFullOfEelsリンクではどういう意味ですか?私は私のポストにリンクがありません。 – Blockhead7360

答えて

1

それは「ランダム」動作を停止しません。むしろ、聞き込もうとしたコンポーネントにフォーカスがなくなったときに、(あなたの有効なMCVEがなければ確実にわかりません)が機能しなくなる可能性があります。選択肢は、コンポーネントに焦点を当てる(悪い)かキーバインディング(良い)を使用するためのkludgeを作成することです。

について:

私はこの上でいくつかの情報を見て、私は他の人の問題の解決策として、キーバインドを見ました。しかし、JComponentsにキーバインディングを追加する必要があると思います。そのうちの1つを取得する方法はわかりません。新しいJComponent()が動作せず、JFrameがメインクラスを追加しています(これはJComponentではなくComponentとして動作していると思います)。

あなたのGUIは、JFrameのののcontentPaneで始まる、JComponentのが充実しているし、プログラムには、任意のおよび他のすべてのGUIコンポーネントに進む - 最もすべて Swingコンポーネントは、JComponentのから延びており、これらがあることを覚えていますバインディングを追加する有効なコンポーネント。 GUIのメインJPanelまたはJComponentに追加する可能性があります。

+0

よろしく!私はKeyBindingsを使って上記の投稿を編集して、私が何を変えたのかを示しました。しかし、私はまだ凍結問題を抱えています。 – Blockhead7360

+0

@ Blockhead7360:コードを投稿してコンパイルして実行することはできません。あなたがまだ立ち往生している場合は、有効な[mcve]を作成して投稿することを検討してください。これはコンパイル可能で実行可能な*プログラムで、コード形式のテキスト(リンクではない)として質問に投稿され、あなたの問題を示すものです。がんばろう! –

関連する問題