2011-01-11 76 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實例變量每個人都有。然而,其他海報提出了一個有效的觀點;如果所有派生類都有一個,那麼將精靈放在基類中可能是有意義的。