对派生自同一基类的类实现冲突检查

Implementing collision check for classes derived from same base class

本文关键字:实现 冲突 检查 基类 派生      更新时间:2023-10-16

我有一个基类MovingObject定义如下:

class MovingObject
{
protected:
double x;
double y;
double speed;
double damage;
double distance(double x1, double y1, double x2, double y2)
{
return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}
public:
MovingObject(double x, double y, double speed, double damage);
virtual bool isCollide(MovingObject* Object);
virtual void draw() {};
virtual void move() {};
};

我从MovingObject类继承了 2 个类,ZombieBullet

class Bullet : public MovingObject
{
private:
double dirX;
double dirY;
public:
Bullet(double x, double y, double speed, double damage, double dirX, double dirY);
bool isCollide(Zombie* pZombie);
void draw();
void move();
};
class Zombie : public MovingObject
{
private:
double hpMax;
double hpCurrent;
double attackCD;
double attackRate;
public:
Zombie(double x, double y, double speed, double damage, double hpMax, double hpCurrent, double attackCD, double attackRate);
bool isCollide(Bullet* pBullet);
void draw();
void move();
void getHit();
void drawHPBar();
void decreaseAttackCD();
void refreshAttackCD();
};

例如,假设我想检查游戏中子弹和僵尸对象之间的碰撞。我想在 Bullet 类中检查此碰撞,如下所示:

bool Bullet::isCollide(Zombie* pZombie) {
if (distance(x, y, pZombie->x, pZombie->y) < 10) {
pZombie->getHit();
return true;
}
else
return false;
}

但是当我尝试访问类中Zombiexy属性时Bullet我无法访问它。我想问的是,是否可以在不使用getX()getY()函数的情况下像这样检查碰撞?我相信我的想法存在缺陷,因为我对C++和OOP概念相当陌生。我不想完全回答你,我只是想有人为我指出正确的道路。提前谢谢你。

Bullet 无法访问受 Zobmbies 保护的成员,因为它不是从 Zombie 派生出来的。如果你只需要对x和y的读取访问权限,你需要MovingObject类中的常量getter。

class MovingObject
{
public:
double GetX() const { return x; }
double GetY() const { return y; }
protected:
...
};

然后在 Bullet::isCollide(( 中使用它们

if (distance(x, y, pZombie->GetX(), pZombie->GetY()) < 10) {
pZombie->getHit();
return true;
}

请避免使用朋友。随着子类数量的增加,您将不得不让它们成为朋友。