对派生自同一基类的类实现冲突检查
Implementing collision check for classes derived from same base class
我有一个基类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 个类,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 类中检查此碰撞,如下所示:
bool Bullet::isCollide(Zombie* pZombie) {
if (distance(x, y, pZombie->x, pZombie->y) < 10) {
pZombie->getHit();
return true;
}
else
return false;
}
但是当我尝试访问类中Zombie
x
和y
属性时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;
}
请避免使用朋友。随着子类数量的增加,您将不得不让它们成为朋友。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 写入位置0x0000000C时发生访问冲突
- 使用简单类型列表实现的指数编译时间.为什么
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何在BST的这个简单递归实现中消除警告
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 对派生自同一基类的类实现冲突检查
- 在避免代码重复和冲突名称的同时,如何实现多个版本的同一算法
- 用C++实现哈希表冲突的避免与解决
- 运算符重载实现:0xC0000005:读取位置存在访问冲突
- 在c++中使用unordered_map实现哈希表并处理冲突
- 哈希表实现,集合的零冲突?发人深思的东西