2011-01-11 40 views
0

我有一个实体基类,其中的类Player和Enemy Inherit。来自Vector的派生类中的访问对象

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"; 
     } 
} 

这将导致以下编译错误:

“实体类”没有名为“精灵”

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

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

回答

1

如果源自Entity的代码中的所有内容都有sprite对象,则应该在基类中声明该对象。

不声明在基类的对象是指,有可能是一类从Entity继承不具有子画面对象,这意味着ColCheck具有用于假设的东西entityVector点的元素,其具有没有有效的基础名为sprite的变量。合理?

+0

感谢您的回复!如果我在Entity中声明了'Sf :: Sprite sprite',那么代码将会被编译,但是它似乎不会影响我尝试访问的向量中的对象的精灵。所以像'entityVector [0] - > sprite.move(1.0)'这样的东西实际上并不会影响这个精灵。 – Te1 2011-01-11 06:16:31

1

你可能不应该创建一个虚拟的,除非有一个精灵是所有实体都有的东西。

您可能想要的是使用访问者模式或可能是多个分派实现中的一个。哪个和哪些最终将不得不由你决定。

+0

嗨,谢谢你的回答! 雪碧是所有实体拥有和将会拥有的东西。我会用什么方法创建虚拟精灵? – Te1 2011-01-11 06:11:30

1

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

0

你可以做一个成员函数sprite()声明为纯虚函数内部Entity

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

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

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