Доступ к объекту в производном классе от Vector - PullRequest
0 голосов
/ 11 января 2011

У меня есть базовый класс 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";
      }
}

Это приводит к следующей ошибке компиляции:

У класса Entity нет члена с именем sprite. 1018

Я не уверен, как создать фиктивный спрайт в Entity, чтобы я мог получить доступ к спрайту игрока и врага, используя вышеуказанный метод. Это возможно?

Я в замешательстве и буду очень признателен за любую помощь, которую кто-либо может предложить!

Ответы [ 4 ]

1 голос
/ 11 января 2011

Если все в вашем коде, которое происходит от Entity, имеет объект sprite, то вы должны объявить этот объект в базовом классе.

Не объявлять объект в базовом классе означает, чтобыть классом, унаследованным от Entity, который не имеет объекта sprite, что означает, что ColCheck не имеет действительной основы для предположения, что элементы entityVector указывают на что-то, что имеет переменную с именем sprite.Имеет смысл?

1 голос
/ 11 января 2011

Если классы Player и Enemy содержат sprite, почему бы не объявить его внутри Entity? Это должно решить вашу проблему.

1 голос
/ 11 января 2011

Вы, вероятно, не должны создавать фиктивный объект, если только спрайт не является чем-то, что есть у ВСЕХ сущностей.

Вам может потребоваться использовать шаблон посетителя или, возможно, одну из многих реализаций множественной отправки.Что и что в конечном итоге будет зависеть от вас.

0 голосов
/ 11 января 2011

Вы можете сделать функцию-член 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 переменные экземпляра у каждого есть.Тем не менее, другие плакаты поднимают обоснованную точку зрения;может иметь смысл поместить спрайт в базовый класс, если он будет у всех производных классов.

...