вторник, 30 августа 2011 г.

Simple render. Интерфейс IEntity

Всем привет 

Сегодня после небольшого перерыва я продолжу рассказ о своем примере отрисовки.
На сегодня у нас один небольшой вопрос - это создание интерфейса IEntity, а также его реализация в наследнике
Итак поехали 

Интерфейс IEntity представляет любую игровую сущность, это базовый класс для любого игрового объекта. Он на самом деле не большой. Как мне кажется на таком уровне нужно только две вещи:
- сохранение и возможность получения уникального идентификатора нашего объекта
- возможность обновления объекта, выполнения в нем какой-то логики

Соответственно интерфейс имеет следующую реализацию 
       class IEntity
       {
              static unsigned long m_EntityIDCounter;
              int m_EntityID;

       public:
              inline int getEntityID()const
              {
                     return m_EntityID;
              }
              
       private:
              inline void setEntityID(int id)
              {
                     m_EntityID = id;
              }

       public:
              IEntity()
              {
                     setEntityID(++m_EntityIDCounter);
              }

              virtual ~IEntity()
              {
              }

              virtual void update() = 0;
       private:
       };
Целочисленное поле m_EntityID содержит уникальный идентификатор объекта, получить который можно через метод getEntityID, а устанавливается он автоматически при создании объекта. Для того чтобы обеспечить уникальной каждого идентификатора я использую статическую переменную m_EntityIDCounter. Думаю промежутка значений, который можно хранить в long нам хватит выше крыши для идентификаторов. 

Ну а для обновления объекта создан абстрактный метод update. На данный момент он не принимает никаких параметров. 

Идем дальше. В примере я создал только один класс наследник - это класс, который представляет двухмерный объект, как статический, так и динамический. Этот объект не содержит логики, но мы потом сможем это добавить, сейчас же это не важно. 
Вот код нового класса:
       class GameEntity : public IEntity
       {
       private:

              glm::vec2 m_Position;
       public:
              inline const glm::vec2& getPosition()const
              {
                     return m_Position;
              }

              inline void setPosition(const glm::vec2& pos)
              {
                     m_Position = pos;
              }

       public:
              GameEntity();

              virtual void update();
       };

Конструктор просто инициализирует позицию нулями 
       GameEntity::GameEntity()
       {
              m_Position.x = m_Position.y = 0.0f;
       }
А метод update вообще пока не содержит логики
       void GameEntity::update()
       {
       }

Собственно все. 
Теперь у нас есть модель, которую нужно визуализировать. Осталось только дописать вид и все будет в шоколаде. 

Всем доброй ночи.

Комментариев нет:

Отправить комментарий