0

我有一个实体基类,其中类 Player 和 Enemy 继承。

class Entity
{
  public:

    virtual void Update(sf::RenderWindow &window) {};
    virtual void Draw(sf::RenderWindow &window) {};

};

玩家和敌人都包含一个看起来像这样的精灵对象:

class Player : Entity
{
   public:

   sf::Sprite sprite

    void Update(sf::RenderWindow &window);
    void Draw(sf::RenderWindow &window)
}

Player 和 Enemy 是在一个向量中创建的,该向量的设置如下:

class EntityManager
{
   public:
   void CollisionCheck();
   private:
   std::vector<Entity*> entityVector;
}

我正在寻找使用这种形式的碰撞检测功能:

bool Collision::CircleTest(const sf::Sprite& Object1, const sf::Sprite& Object2)

所以我正在尝试做这样的事情:

void EntityManager::ColCheck()
{
   if (Collision::CircleTest(entityVector[0]->sprite, entityVector[1]->sprite))
      {
         cout << "COLLISION\n";
      }
}

这会导致以下编译错误:

“实体类”没有名为“精灵”的成员</p>

我不确定如何在 Entity 中创建一个虚拟精灵,以便我可以使用上述方法访问玩家和敌人的精灵。这可能吗?

我很难过,非常感谢任何人可以提供的任何帮助!

4

4 回答 4

1

除非所有实体都拥有精灵,否则您可能不应该创建假人。

您可能想要的是使用访问者模式或可能是许多多分派实现之一。哪个和什么最终将取决于您。

于 2011-01-11T06:09:13.450 回答
1

如果您的代码中派生自的所有内容Entity都有一个sprite对象,那么您应该在基类中声明该对象。

未在基类中声明该对象意味着可能有一个继承自Entity该对象的类没有 sprite 对象,这意味着ColCheck没有有效的基础来假设 的元素entityVector指向具有名为 的变量的东西sprite。有道理?

于 2011-01-11T06:11:05.380 回答
1

如果PlayerEnemy类都包含sprite,为什么不在里面声明呢Entity?这应该可以解决您的问题。

于 2011-01-11T06:11:08.890 回答
0

您可以在sprite()内部创建一个声明为纯虚函数的成员函数Entity

class Entity {
public:
    virtual void Update(sf::RenderWindow &window) {};
    virtual void Draw(sf::RenderWindow &window) {};

    virtual sf::Sprite& sprite() = 0;
};

然后,PlayerandEnemy实现将返回sf::Sprite每个实例变量。但是,其他海报提出了一个有效的观点。如果所有派生类都有一个,那么将精灵放在基类中可能是有意义的。

于 2011-01-11T06:14:12.480 回答