我有一个Entity基类,类Player和Enemy Inherit。
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)
}
玩家和敌人是在一个矢量中创建的,这个矢量设置如下:
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";
}
}
这会导致以下编译错误:
'class Entity'没有名为'sprite'的成员
我不确定如何在Entity中创建一个虚拟精灵,以便我可以使用上述方法访问玩家和敌人的精灵。这可能吗?
我很难过,非常感谢任何人都可以提供帮助!
答案 0 :(得分:1)
你可能不应该创建一个假人,除非有精灵是所有实体都有的。
您可能想要的是使用访问者模式或可能是多个多调度实现之一。哪个以及哪个最终必须由您决定。
答案 1 :(得分:1)
如果代码中派生自Entity
的所有内容都有sprite
对象,那么您应该在基类中声明该对象。
不声明基类中的对象意味着可能有一个继承自Entity
的类没有精灵对象,这意味着ColCheck
没有有效的基础来假设entityVector
指向具有名为sprite
的变量的内容。有意义吗?
答案 2 :(得分:1)
如果Player
和Enemy
类都包含sprite
,为什么不在Entity
内声明它?这应该可以解决你的问题。
答案 3 :(得分:0)
您可以创建一个在sprite()
内声明为纯虚函数的成员函数Entity
:
class Entity {
public:
virtual void Update(sf::RenderWindow &window) {};
virtual void Draw(sf::RenderWindow &window) {};
virtual sf::Sprite& sprite() = 0;
};
然后,Player
和Enemy
实现将返回每个sf::Sprite
实例变量。然而,其他海报提出了一个有效的观点;如果所有派生类都有一个sprite,那么将sprite放在基类中可能是有意义的。