Реализация проверки коллизий для классов, производных от того же базового класса - PullRequest
3 голосов
/ 30 мая 2020

У меня есть базовый класс 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 class, Zombie и Bullet:

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 и Zomb ie объектами в игре. Я хочу проверить это столкновение в классе Bullet следующим образом:

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

Но когда я пытаюсь получить доступ к атрибутам x и y класса Zombie в Bullet классе, я не могу получить доступ к нему. Я хочу спросить, можно ли проверить такое столкновение без использования функций getX() и getY()? Я считаю, что в моем мышлении есть изъян, потому что я новичок в концепциях C ++ и OOP. Я не хочу от вас полного ответа, я просто хочу, чтобы кто-то указал мне правильный путь. Заранее спасибо.

1 Ответ

2 голосов
/ 30 мая 2020

Bullet не может получить доступ к защищенным членам Zobmbies, потому что он не является производным от Zomb ie. Если вам нужен только доступ для чтения к 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;
}

Пожалуйста избегайте использования друга. С ростом количества подклассов вам придется всех их подружить.

...