好的,所以我想尝试做一个简单的乒乓球比赛。我有一个跟随鼠标的球拍和一个反弹的球。我在我的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类的子类。任何人都知道为什么他们不会这样做?
答案 0 :(得分:3)
class Paddle {}
Paddle
是一个班级。
Paddle paddle;
paddle
是一个尚未引用Paddle
类(又称对象)实例的变量。
Paddle paddle = new Paddle();
此paddle
是一个变量,指的是Paddle
的实例。
ball.collidesWith(paddle)
是一个表达式,它在名为collidesWith
的变量引用的对象上调用名为ball
的方法,并将名为paddle
的变量引用的对象传递给它。如果尚未在此表达式的相同或封闭词法范围中定义名为ball
的变量和名为paddle
的变量,则表达式无效。如果您已创建变量ball
和paddle
但尚未将它们设置为引用某个实例,则表达式将编译但不会正确执行。你应该有这样的东西:
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
都必须是一个声明在某处可见的变量。
答案 1 :(得分:0)
我的猜测(正如您提供的有限信息,我做的不仅仅是猜测):您没有在球类知道的范围内声明paddle
。或许你确实声明了它,但是在这段代码运行时没有定义它。
通常,您将编写一个管理类,它知道并维护paddle实例,同时知道ball实例。不要让球检查碰撞,而是让你的管理班做这件事。考虑到管理级别也将负责建造你的桨和球,它已经在正确的范围内。您的管理类将对两个拨片中的每一个进行ball.collidesWith(paddle)
检查。