我确信这很简单,但我已经尝试在此网站上查看Google和其他人的问题,但无法理解。感谢您的帮助。
我制作了一款简单的游戏。我试图设置碰撞检测,但无法使其发挥作用。我想要做的是设置一个布尔值来检测渔船(player1)是否被鲨鱼击中(如果是这样,那么生命就会丢失)。
对于鲨鱼类,我为鲨鱼的颜色设置了一个名为SHARK1的变量。然后,我为渔船设置了一个for循环,检查是否有鲨鱼的颜色被发现与船碰撞。然而,鲨鱼的颜色是在Shark类中定义的,我想知道如何在渔船类中使用该变量。代码如下。
//shark class
class Shark
{
int x, y, dx, dy;
int w=37;
int h=50;
public PImage sharkPic;
public final color sharkColor;
Shark(int x, int y, int dx, int dy)
{
this.x=x;
this.y=y;
this.dx=dx;
this.dy=dy;
sharkPic=loadImage("images/shark.png");
sharkPic.resize(w,h);
this.sharkColor=sharkPic.get(20,20);
}
}
//fishing boat class
class Fisherman
{
int x;
int y;
Shark shark;
Fisherman(int x, int y, Shark shark)
{
this.x=x;
this.y=y;
this.shark=shark;
}
void render()
{
fill(255,255,0);
rect(x,y, 80,20, 7);
rect(x+40,y-50, 10,50);
fill(255,0,0);
triangle(x+25,y-40, x+40,y-50, x+40,y-30);
}
boolean sharkHitBoat()
{
for (int i=y; i<(y+20); i++)
{
color detectedColour;
detectedColour = get(i, y+20);
if (detectedColour==shark.sharkColor) {
return true;
}
}
return false;
}
} //class
然后我会在主类中使用布尔值,这样如果检测到碰撞并且当3个生命丢失然后游戏结束时,玩家将失去生命。可能有一种更简单的方法可以达到这个目的,但我想知道这是否可行我的做法(如果没有,那么建议将不胜感激)。如果还有其他一些代码,您需要查看以帮助告诉我,我可以提供
谢谢。
答案 0 :(得分:1)
这不是我如何进行碰撞检测。相反,我只想在鲨鱼和船周围使用边界框,并检查这些框是否重叠。您可以在处理here中阅读有关碰撞检测的更多信息。
但是要回答你的问题,你可以通过传入变量或通过引用类的实例来在另一个类的一个类中使用变量。
首先,SHARK1
不是一个很好的变量名,所以我们称之为sharkColor
。然后,我们必须确保它是一个类级变量,在类的顶部定义:
class Shark
{
color sharkColor;
//rest of class
您编写的代码意味着SHARK1
只能在构造函数中使用,这绝对不是您想要的。
现在我们有了,我们可以将变量的值直接传递给两个类。像这样:
color colorForShark = color(whatever);
Shark shark = new Shark(colorForShark);
Fisherman fisherman = new Fisherman(colorForShark);
然后每个类将颜色放入其构造函数中,将其存储在类级变量中,然后根据需要使用它。这非常简单,但它假设每条鲨鱼都有相同的颜色。
或者我们可以将鲨鱼直接传递给Fisherman
,就像这样:
Shark shark = new Shark();
Fisherman fisherman = new Fisherman(shark);
您还可以传递ArrayList
个Shark
个实例并循环遍历它们。
无论如何,现在Fisherman
类有一个Shark
变量,我们可以使用.
点运算符来获取鲨鱼的颜色:
shark.sharkColor
答案 1 :(得分:-1)
这里有两个问题。
我看到的第一个问题是变量SHARK1的范围。您正在Shark构造函数中创建此变量,因此范围仅在Shark构造函数中,这意味着变量在构造函数外部不可见。阅读本文,了解有关变量范围的更多信息:https://www.geeksforgeeks.org/variable-scope-in-java/
将Shark类更改为以下内容。请注意,我为Shark的颜色添加了一个类级变量。
class Shark
{
int x, y, dx, dy;
int w=37;
int h=50;
PImage sharkPic;
public final Color sharkColor;
Shark(int x, int y, int dx, int dy)
{
this.x=x;
this.y=y;
this.dx=dx;
this.dy=dy;
sharkPic=loadImage("images/shark.png");
sharkPic.resize(w,h);
this.sharkColor= sharkPic.get(20,20); //variable for shark color thats needed for collision detection
}
第二个问题是你的渔夫班级对你的鲨鱼课程一无所知。您需要将Shark的实例传递给Fisherman类。见下文:
class Fisherman {
int x;
int y;
Shark shark;
Fisherman(int x, int y, Shark shark) {
this.x = x;
this.y = y;
this.shark = shark;
}
void render() {
fill(255, 255, 0);
rect(x, y, 80, 20, 7);
rect(x + 40, y - 50, 10, 50);
fill(255, 0, 0);
triangle(x + 25, y - 40, x + 40, y - 50, x + 40, y - 30);
}
boolean sharkHitBoat() {
for (int i = y; i < (y + 20); i++) {
Color detectedColour = get(i, y + 20);
if (detectedColour == shark.sharkColor) //this is where I'm putting the color variable, this causes an error at the moment.
{
return true;
}
}
return false;
}
}
现在您可以执行以下操作:
Shark shark = new Shark(1, 2, 3, 4);
Fisherman fisherman = new Fisherman(1, 2, shark);
fisherman.sharkHitBoat();