2011-01-11 12 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; 
} 

Iこの形式の衝突検出機能を使用しようとしています:

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

これは、次のコンパイルエラーが発生:

「クラスエンティティは、」私は「「スプライト」

という名前のメンバーを持っていません上記の方法でプレイヤーと敵のスプライトにアクセスできるように、Entityにダミースプライトを作成する方法が不明です。これは可能ですか?

私は困惑しており、誰でも手伝っていただけると大変感謝しています!

答えて

1

Entityから派生したコードのすべてにspriteオブジェクトがある場合は、そのオブジェクトを基本クラスに宣言する必要があります。

基底クラスのオブジェクトがColCheckが何かにentityVectorポイントの要素を持っていると仮定してのための有効な根拠を持っていないことを意味スプライトオブジェクトを持っていないEntityから継承するクラス、があるかもしれないということを意味宣言していません変数はspriteと呼ばれます。理にかなっている?

+0

返信いただきありがとうございます!Entity内で 'Sf :: Sprite sprite'を宣言すると、コードはコンパイルされますが、アクセスしようとしているベクトルのオブジェクトのスプライトには影響しないようです。だから、 'entityVector [0] - > sprite.move(1.0)'のようなものは実際にそのスプライトには全く影響しないようです。 – Te1

+0

これは全く別の問題です。コードを見ずに「動かす」ことはできません。私は可能な限り簡単なテストケースを得て、新しい質問を投稿することをお勧めします。 –

+0

これはうまくいきましたが、問題は私がEntityとPlayerの両方にsf :: Spriteスプライトを宣言したことです。私がPlayerからそれを取り除くと、すべてが不平を言った。乾杯! – Te1

1

スプライトを持つすべてのエンティティでない限り、ダミーを作成しないでください。

ビジターパターンを使用するか、複数の複数ディスパッチ実装のいずれかを使用することをお勧めします。どちらがあなたに従わなければならないのか。

+0

こんにちは、お返事ありがとうございます! スプライトは、すべてのエンティティがこの場合に持っているものであり、持つものです。ダミースプライトの作成にはどのような方法がありますか? – Te1

1

PlayerEnemyクラスの両方にspriteのクラスが含まれている場合は、Entityに宣言してください。これはあなたの問題を解決するはずです。

0

あなたはEntity内部の純粋仮想関数として宣言されたメンバ関数sprite()作ることができます:次に、PlayerEnemy実装はそれぞれが持っているsf::Spriteインスタンス変数を返します

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

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

を。しかし、他のポスターは有効なポイントを提示します。すべての派生クラスに1つのクラスがある場合は、スプライトを基本クラスに入れることは理にかなっています。

関連する問題