单独 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 以大写字母开头。方法和变量应以小写字母开头。