单独 class 个实例的碰撞检测 - 处理 Java
Collision detection for separate class instances - Processing Java
我有一个生成敌人的 class 和一个生成玩家的 class。此刻,他们都是两个圆圈,彼此相向。我已经为他们崩溃时做了一个碰撞检测功能,但我不能让它工作。我已经在 classes 之外创建函数并尝试调用每个 class 的位置变量,但它说我不能对非静态字段进行静态引用。我还尝试了每个 class 中的碰撞检测,但也不起作用。
class Player {
int Pos_X;
int Pos_Y;
int Speed;
Player(int x, int y, int speed) {
this.Pos_X = x;
this.Pos_Y = y;
this.Speed = speed;
}
void Update() {
ellipse(Pos_X, Pos_Y, 40, 40);
Pos_X += Speed;
}
}
class Enemy {
int Pos_X;
int Pos_Y;
int Speed;
Enemy(int x, int y, int speed) {
this.Pos_X = x;
this.Pos_Y = y;
this.Speed = speed;
}
void Update() {
ellipse(Pos_X, Pos_Y, 40, 40);
Pos_X -= Speed;
}
}
Player Player1;
Enemy Enemy1;
void setup() {
size (500, 500);
Player1 = new Player (0, 200, 3);
Enemy1 = new Enemy (500, 200, 3);
}
void draw() {
background(200);
Player1.Update();
Enemy1.Update();
if (intersectsBox(Player.Pos_X, Player.Pos_Y)) {
ellipse(100, 100, 100, 100);
}
}
boolean intersectsBox(float X, float Y) {
if (X > Enemy.Pos_X && X < Enemy.Pos_X + 40) {
if (Y > Enemy.Pos_Y && Y < Enemy.Pos_Y + 40) {
return true;
}
}
}
要使用 class 中的变量,您必须引用 class 的 实例 。在您的代码中,Enemy
是 class,而 Enemy1
是 class 的一个实例。所以当你尝试这样做时:
if (X > Enemy.Pos_X && X < Enemy.Pos_X + 40) {
处理时出现错误,因为您使用的是 class,而不是实例。处理过程不知道你说的是哪个敌人。相反,你必须做这样的事情:
if (X > Enemy1.Pos_X && X < Enemy1.Pos_X + 40) {
现在 Processing 知道您在谈论 Enemy
class 的哪个实例。您还可以将 Enemy
的实例作为 参数 传递给该函数,这样您就可以使用它与多个敌人发生碰撞。
还有一条一般性建议:如果您遵循标准格式和命名约定,您的代码将更易于阅读 - 缩进您的代码(如果您在编辑器中按 ctrl+t,Processing 会为您完成) , 并确保只有 classes 以大写字母开头。方法和变量应以小写字母开头。
我有一个生成敌人的 class 和一个生成玩家的 class。此刻,他们都是两个圆圈,彼此相向。我已经为他们崩溃时做了一个碰撞检测功能,但我不能让它工作。我已经在 classes 之外创建函数并尝试调用每个 class 的位置变量,但它说我不能对非静态字段进行静态引用。我还尝试了每个 class 中的碰撞检测,但也不起作用。
class Player {
int Pos_X;
int Pos_Y;
int Speed;
Player(int x, int y, int speed) {
this.Pos_X = x;
this.Pos_Y = y;
this.Speed = speed;
}
void Update() {
ellipse(Pos_X, Pos_Y, 40, 40);
Pos_X += Speed;
}
}
class Enemy {
int Pos_X;
int Pos_Y;
int Speed;
Enemy(int x, int y, int speed) {
this.Pos_X = x;
this.Pos_Y = y;
this.Speed = speed;
}
void Update() {
ellipse(Pos_X, Pos_Y, 40, 40);
Pos_X -= Speed;
}
}
Player Player1;
Enemy Enemy1;
void setup() {
size (500, 500);
Player1 = new Player (0, 200, 3);
Enemy1 = new Enemy (500, 200, 3);
}
void draw() {
background(200);
Player1.Update();
Enemy1.Update();
if (intersectsBox(Player.Pos_X, Player.Pos_Y)) {
ellipse(100, 100, 100, 100);
}
}
boolean intersectsBox(float X, float Y) {
if (X > Enemy.Pos_X && X < Enemy.Pos_X + 40) {
if (Y > Enemy.Pos_Y && Y < Enemy.Pos_Y + 40) {
return true;
}
}
}
要使用 class 中的变量,您必须引用 class 的 实例 。在您的代码中,Enemy
是 class,而 Enemy1
是 class 的一个实例。所以当你尝试这样做时:
if (X > Enemy.Pos_X && X < Enemy.Pos_X + 40) {
处理时出现错误,因为您使用的是 class,而不是实例。处理过程不知道你说的是哪个敌人。相反,你必须做这样的事情:
if (X > Enemy1.Pos_X && X < Enemy1.Pos_X + 40) {
现在 Processing 知道您在谈论 Enemy
class 的哪个实例。您还可以将 Enemy
的实例作为 参数 传递给该函数,这样您就可以使用它与多个敌人发生碰撞。
还有一条一般性建议:如果您遵循标准格式和命名约定,您的代码将更易于阅读 - 缩进您的代码(如果您在编辑器中按 ctrl+t,Processing 会为您完成) , 并确保只有 classes 以大写字母开头。方法和变量应以小写字母开头。