0

わかりましたので、簡単なポンゲームを作ろうとしています。マウスに追従するパドルと、跳ね回るボールがあります。collidesWith(Sprite s)Sprite クラス内に、ボールがパドルと衝突するかどうかをチェックするメソッドを作成しました (これは機能し、問題ではありません)。スプライト クラスを拡張する 2 つのオブジェクト、ボールとパドル オブジェクトがあります。だから私のボールクラスの中で私はそれがパドルと衝突するかどうかをチェックしようとしています. だから私は試しました

if(this.collidesWith(paddle) == true){
    System.out.println("They touched");
}

他の組み合わせも試してみましたが、パドル(および使用時のボール)ball.collidesWith(paddle)については常に同じことが言えますball.collidesWith"Cannot find symbol. Symbol: variable paddle(or ball). Location: class Ball"

したがって、私がこれを正しく読んでいる場合、パドル (およびボール) は変数であると見なされ、それらが見つからないために不平を言っています。変数ではなくオブジェクトを渡していることを理解させるにはどうすればよいですか?

追加情報として、以前の課題で 2 つのボックスを作成し、それらが衝突すると色が変わるようにしました。その割り当てでは、上記と非常によく似たコードを使用しました

if(boxOne.collidesWith(boxTwo) == true){
      System.out.println("yes");
}

そして、このコードではうまくいきました。プログラムは、boxOne と boxTwo が Sprite クラスの子クラスであることを認識していました。なぜ彼らが同じように働かないのか誰にも分かりますか?

4

2 に答える 2

3
class Paddle {}

Paddleクラスです。

Paddle paddle;

paddlePaddleクラスのインスタンス (別名オブジェクト)をまだ参照していない変数です。

Paddle paddle = new Paddle();

これpaddleは変数であり、 のインスタンスを参照しますPaddle

ball.collidesWith(paddle)

collidesWithは、 という名前の変数によって参照されるオブジェクトでという名前のメソッドを呼び出し、 という名前の変数によってball参照されるオブジェクトを渡す式paddleです。ballという名前の変数とpaddle、この式の同じまたは外側のレキシカル スコープで指定された変数を定義していない場合、その式は有効ではありません。変数を作成しても、インスタンスを参照するように変数ballpaddle設定していない場合、式はコンパイルされますが、正しく実行されません。次のようなものが必要です。

Ball ball = new Ball();
Paddle paddle = new Paddle();
if (ball.collidesWith(paddle)) { ... }

または、あなたが示したように、あなたが Ball クラスの中にいる場合、次のようなものがあるかもしれません:

class Ball {
    boolean collidesWith(Paddle paddle) {
        ...
    }

    void somethingElseWithAPaddle(Paddle paddle) {
        if (this.collidesWith(paddle)) { ... }
    }
}

その場合、this定義する必要のない変数であり、メソッドが呼び出されたオブジェクトを参照します。式を記述する場所はどこでも、paddle可視の場所で宣言された変数でなければなりません。

于 2013-10-19T03:40:28.953 に答える
0

私の推測 (あなたが提供している限られた情報と同様に、推測以上のことはできません):paddleボール クラスが知っているスコープで を宣言しませんでした。または、宣言はしたものの、このコードの実行時には定義されていない可能性があります。

通常、パドル インスタンスを認識して維持し、同時にボール インスタンスを認識する管理クラスを作成します。ボールに衝突をチェックさせる代わりに、管理クラスにこれを行わせます。管理クラスがパドルとボールの作成も担当することを考えると、それらはすでに適切なスコープに含まれています。あなたの管理クラスはball.collidesWith(paddle)、2 つのパドルのそれぞれについてチェックを行います。

于 2013-10-19T03:41:15.653 に答える