2016-11-24 13 views
0

この問題の解決方法はわかりません。私がやっていることは、私がクラスを分割しようとする前にすべてがうまくいっていたが、今はエラーが発生している、プレーヤーのクラスと火球のクラスのように、私が違うものに持っているモンスタークラスを分割しようとしている。私は誰もが私がそれを解決するのを助けることができ、このエラーをもう一度繰り返さない方法を私に説明することができるのだろうかと思っていた。前もって感謝します。 編集:エラーがオンです:animationTimer = new Timer(animationDelay、this);Javaタイマーと描画アニメーション

EDIT:1個のエラーが見つかりました: ファイル:C:\ Users \ユーザーヨゼフ\ Javaの\ドラゴンボールZ \ Player.java [ライン:45] エラー:互換性のない型:プレーヤーがいるjava.awt.eventに変換することはできません.ActionListener また、私は正しくフォーマットを行いますが、ここに投稿するために私のコードをボックスにコピーして貼り付けようとすると、それはコードとしてカウントされないので、すべての行をインデントしてコードとして表示し、テキスト。

import java.awt.Graphics; 
import java.awt.MediaTracker; 
import javax.swing.ImageIcon; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import javax.swing.Timer; 

public class Player { 
    int x; 
    int y; 
    ImageIcon pictures[]; 
    int total; 
    int current; 
    boolean sideMove; 
    int move; 
    Timer animationTimer; 
    int animationDelay = 80; 

    public Player(int startX, int startY, ImageIcon image[], boolean sideMove, int move) { 
     x = startX; 
     y = startY; 
     pictures = image; 
     total = pictures.length; 
     this.sideMove = sideMove; 
     this.move = move; 
     startAnimation(); 
    } 

    public void draw(Graphics g) { 
     if (pictures[current].getImageLoadStatus() == MediaTracker.COMPLETE) { 
      Image img = pictures[current].getImage(); 
      g.drawImage(img, x, y, null); 
      current = (current + 1) % total; 
     } 
     update(); 
    } 

    public void update() { 
     if (sideMove == true) { 
      x += move; 
     } else { 
      y += move; 
     } 
    } 

    public void startAnimation() { 
     if (animationTimer == null) { 
      current = 0; 
      animationTimer = new Timer(animationDelay, this); // *** error *** 
      animationTimer.start(); 
     } else if (!animationTimer.isRunning()) 
      animationTimer.restart(); 
    } 

    public void stopAnimation() { 
     animationTimer.stop(); 
    } 
} 
+1

また、コードの書式設定は、特にコードのインデントには適していません。コードの書式設定はコードを「見栄えが良い」ものにするのではなく、コードがどのスコープに属しているかを素早く確認するのに役立ちます。 *あなたの利益のためにフォーマットを整え、問題をより簡単にデバッグできるように、*私たち*のためにあなたのコードを理解しやすくするために努力したいと思うでしょう。これは簡単な要求ではありません。 –

+0

あなたのコードを書式化して、他の人が読めるようにしました。 –

+1

* "また、私は適切にフォーマットを行いますが、ここに投稿するために私のコードをコピーしてボックスに貼り付けようとすると、それはコードとしてカウントされないので、すべての行をインデントしてコードとして表示し、あなたのコードをポストしてからハイライトし、エディタ上部の中括弧のペアコードボタンを押すと、サイトのソフトウェアはすべてのコード4桁をインデントします。ここで投稿を編集する方法については、[このリンク](http://stackoverflow.com/editing-help)を参照してください。 –

答えて

1

これはjavax.swing.Timerコンストラクタの署名です:あなたはint型とプレーヤーを提供している

public Timer(int delay, ActionListener listener) 

.. あなたが同様にActionListenerを作成し、コンストラクタにそれを提供するか、またはあなたが渡すことができなければなりませんthis PlayerクラスはActionListenerのインタフェースを実装する必要があります(PlayerクラスにactionPerformedメソッドを記述する必要があります)。

タイマーHere(official java doc)の詳細を読む。ここで

2

:ActionListenerのthisを実装していないプレイヤークラスは有効なパラメータとして、タイマーのコンストラクタに渡すことはできませんので

animationTimer = new Timer(animationDelay, this); 

public class Player implements ActionListener { 

    @Override 
    protected void actionPerformed(ActionEvent e) { 
     // your coded here 
    } 

    // .... rest of your code 

またはより良いまだ、そのような匿名の内部クラスとして異なるActionListenerを使用:可能な解決策は、プレイヤーのクラスは、それを適切なactionPerformedメソッドを与えるActionListenerを実装することです。

例えば、

public void startAnimation() { 
    if (animationTimer == null) { 
     current = 0; 
     animationTimer = new Timer(animationDelay, e -> timerActionPerformed(e)); 
     animationTimer.start(); 
    } else if (!animationTimer.isRunning()) { 
     animationTimer.restart(); 
    } 
} 

private void timerActionPerformed(ActionEvent e) { 
    // TODO repeated code goes here 
} 

サイド勧告は:

  • あなたPlayerオブジェクトの状態を変更し、あなたの塗装方法、あなたは避けたいだろう何か内のコードを持っています。オブジェクトがいつ描画されるか、あるいは描画されるかどうかを部分的にしか制御できないことを理解しているので、これらを別々に保つのが最善です。
  • 私自身、私はPlayerクラスからTimerを取得し、より一般的な全体的なコントロールクラス、おそらくGameクラス(またはあなたの "宇宙"クラスが呼び出されているものであれ)のゲームループまたはアニメーションコントローラとしてTimerを使用します)、Playerオブジェクトなどのすべての論理エンティティを保持および制御するクラスです。
関連する問題