我有一个这样定义的基类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
类,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();
};
例如,假设我要检查游戏中子弹和僵尸对象之间的碰撞。我想在子弹类中检查这种碰撞,如下所示:
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概念还很陌生。我不想得到您的完整答复,我只希望有人为我指出正确的道路。谢谢你。
子弹无法访问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; }
请避免使用朋友。随着子类的数量不断增加,您将不得不使其成为所有的朋友。