0

好的,所以我正在尝试制作一个简单的乒乓球游戏。我有一个跟随鼠标的桨和一个弹跳的球。我在我的 Sprite 类中编写了一个方法collidesWith(Sprite s),用于检查球是否与桨发生碰撞(这有效,不是问题)。我有两个对象扩展我的精灵类,一个球和一个桨对象。所以在我的球类里面,我试图检查它是否与桨发生碰撞。所以我试过了

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"

因此,如果我没看错,它会认为桨(和球)是变量,它会抱怨,因为它找不到它们。我怎样才能让它理解我传递的是对象,而不是变量?

有关更多信息,我之前的一项任务让我制作了两个盒子,并让它们在碰撞时改变颜色。在那个作业中,我使用了与上面非常相似的代码

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

在这段代码中它工作得很好。程序知道 boxOne 和 boxTwo 是我的 Sprite 类的子类。任何人都知道为什么他们不会工作相同?

4

2 回答 2

3
class Paddle {}

Paddle是一类。

Paddle paddle;

paddle是一个尚未引用Paddle类实例(又名对象)的变量。

Paddle paddle = new Paddle();

paddle是一个变量,指的是Paddle.

ball.collidesWith(paddle)

是一个表达式,它调用collidesWith由变量 named 引用的对象上的方法,并将变量 namedball所引用的对象传递给它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)两个桨中的每一个进行检查。

于 2013-10-19T03:41:15.653 回答