对从相同基类派生的类执行碰撞检查

问题描述 投票:3回答:1

我有一个这样定义的基类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() {};
};

并且我有2个继承自MovingObject类,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();
};

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

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

但是当我尝试访问x类中yZombieBullet属性时,我无法访问它。我想问的是,是否可以在不使用getX()getY()函数的情况下像这样检查碰撞?我认为我的想法存在缺陷,因为我对C ++和OOP概念还很陌生。我不想得到您的完整答复,我只希望有人为我指出正确的道路。谢谢你。

c++ collision
1个回答
2
投票

子弹无法访问Zobmbies受保护的成员,因为它不是源自Zombie。如果只需要对x和y的读访问权限,则在MovingObject类中需要常量获取方法。

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;
}

请避免使用朋友。随着子类的数量不断增加,您将不得不使其成为所有的朋友。

© www.soinside.com 2019 - 2024. All rights reserved.