0

クラス Player と Enemy が継承する Entity ベースクラスがあります。

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」という名前のメンバーがありません</p>

上記の方法を使用してプレイヤーと敵のスプライトにアクセスできるように、エンティティでダミーのスプライトを作成する方法がわかりません。これは可能ですか?

私は困惑しており、誰でも提供できる助けをいただければ幸いです。

4

4 に答える 4

1

スプライトを持つことがすべてのエンティティにある場合を除き、おそらくダミーを作成するべきではありません。

ビジター パターンを使用するか、多くの複数ディスパッチ実装の 1 つを使用することをお勧めします。どれをどうするかはあなた次第です。

于 2011-01-11T06:09:13.450 に答える
1

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

Entity基本クラスでオブジェクトを宣言しないということは、スプライト オブジェクトを持たない を継承するクラスが存在する可能性があることを意味します。つまり、 の要素が という変数を持つ何かを指しているColCheckと仮定するための有効な根拠がないことを意味します。わかる?entityVectorsprite

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

次に、PlayerとのEnemy実装は、sf::Spriteそれぞれが持つインスタンス変数を返します。ただし、他のポスターは有効な点を指摘しています。すべての派生クラスがスプライトを持つ場合は、基本クラスにスプライトを配置するのが理にかなっています。

于 2011-01-11T06:14:12.480 に答える