2011-12-16 12 views
1

私はJavaのものにはかなり初心者ですが、..多くのオンラインを読んだ後、私はこのゲームに取り組み始めています。いくつかの画像。私はコースの動きを実証するためにポジションを更新しようとしています。KeyListenerによると思います。残念ながら、画像は同じ場所に残り、Dを移動することを拒否:Java、私のイメージは更新/移動しません

私はこのコードの一部をovercomplicated確信しているが、ここでは、次のとおりです。その後、\

public class Game extends javax.swing.JPanel implements ActionListener, KeyListener{ 

    private Vladimir vlad; 
    private Timer timer; 

    public Game() { 
     addKeyListener(this); 
     setPreferredSize(new Dimension(1024,768)); 
     setDoubleBuffered(true); 

     vlad = new Vladimir(); 
     timer = new Timer(15,this); 
     timer.start(); 
    } 

    public void actionPerformed (ActionEvent e){ 
     repaint(); 
    } 

    private void toggleKey(int keyCode, boolean pressed){ 
     if (keyCode == 87){ // W 
      vlad.move("UP", pressed); 
     } 

     if (keyCode == 83){ // S 
      vlad.move("DOWN", pressed); 
     } 

     if (keyCode == 65) // A 
     { 
      vlad.move("LEFT", pressed); 
     } 

     if (keyCode == 68) // D 
     { 
      vlad.move("RIGHT", pressed); 
     } 
    } 

    public void keyPressed(KeyEvent e) 
    { 
     toggleKey(e.getKeyCode(), true); 
    } 

    public void keyReleased(KeyEvent e) 
    { 
     toggleKey(e.getKeyCode(), false); 
    } 

    public void keyTyped(KeyEvent e){ 

    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics g2d = (Graphics2D)g; 
     g2d.drawImage(vlad.getGrassMap(),0,0,this); 
     g2d.drawImage(vlad.getCharOne(),vlad.getX(),vlad.getY(),this); 

     repaint(); 


     } 
} 

そして...

public class Vladimir{ 

    private int x; 
    private int y; 
    private Image grassMapOne; 
    private Image charOne; 
    private String gMapLocate = "/phantasma/resources/GrassMap1.png"; 
    private String charOneLocate = "/phantasma/resources/moveright1.png"; 

    public Vladimir(){ 
     ImageIcon gMap1 = new ImageIcon(this.getClass().getResource(gMapLocate)); 
     ImageIcon char1 = new ImageIcon(this.getClass().getResource(charOneLocate)); 
     grassMapOne = gMap1.getImage(); 
     charOne = char1.getImage(); 
     x = 512; 
     y = 350; 
    } 

    public void move(String direction, boolean keyHeld){ 
     if (direction == "UP"){ 
      y += 12; 
     } 

     if (direction == "DOWN"){ 
      y -= 12; 
     } 

     if (direction == "LEFT"){ 
      x -= 12; 
     } 

     if (direction == "RIGHT"){ 
      x += 12; 
     } 
    } 

    public int getX(){ 
     return x; 
    } 

    public int getY(){ 
     return y; 
    } 

    public Image getGrassMap(){ 
     return grassMapOne; 
    } 

    public Image getCharOne(){ 
     return charOne; 
    } 
} 
+1

マジックナンバー(87,83,65,68)は使用しないでください。 KeyEventクラスにはVK_UPなどの変数が必要です。 – camickr

+0

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 –

答えて

5

まず、何が間違っているのかを知る必要があります。最初に、イメージが動いているのではなく、聴いているキーリスナーであることを尋ねてください。あなたはこの1つのようprintln文を追加する場合:

public void keyPressed(KeyEvent e) { 
    System.out.println("in keyPressed. keyCode is: " + e.getKeyCode()); 
    toggleKey(e.getKeyCode(), true); 
} 

あなたはそれがフォーカスを受けることができる、それが実際にフォーカスを持っているコンポーネントが必要であることを、そうでないことがわかります。

JPanelのfocusableプロパティをtrueに設定し、レンダリングした後にacceptFocusInWindow()にする必要があります。

さらに改善していきますが、フォーカスの問題になるとはるかに柔軟性があり、より高いレベルの構造であるため、key bindingsを使用してください。実際には、スイング自体がキープレスに反応するコンポーネントを持つために使用されています。

次に、Stringを比較するのに、Stringの2つのオブジェクトが同じであるかどうかを確認するために、Stringを比較しないでください。代わりにStringに同じ文字が同じ順序で別のStringと一致するかどうかを知りたい場合は、Stringequals(...)メソッドまたはそのequalsIgnoreCase(...)メソッドを使用します。

+0

ありがとう、それは大いに役立ちます!心から感謝する;ちょっと後でキーバインディングを調べますが、今は私があなたのポスト全体で混乱している唯一のことは、 'acceptFocusInWindow()'部分です - どのように呼び出すべきか、どこでそれを扱うべきか、全く?再度、感謝します! – user16666322

+0

GUIがレンダリングされた後は、それを聴取先のコンポーネントで呼び出すことになります。通常は、 'pack()'または 'setVisible(true)'が囲まれたトップレベルウィンドウで呼び出された後です。 –

+0

うーん、ありがとう、しかし、あなたのすべての変更を追加した後、それはまだ動作していないようです..私はそれがハハですキーのバインディングを推測します。 – user16666322

関連する問題