Записи Sandbox::Write(Day002) GLM, Actor, Component
Post
Cancel

Sandbox::Write(Day002) GLM, Actor, Component

Класс Actor

Для работы с векторами, матрицами можно было бы написать свою библиотеку, для интереса. Но пока буду использовать GLM. Качаю в папку вне проекта и добавляю строчки в CMakeLists.txt:

1
include_directories(~/hdd/external_libs/glm/)

После этого определяю класс Actor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#ifndef SANDBOX_ACTOR_H
#define SANDBOX_ACTOR_H

#include <vector>

#include <glm/gtc/quaternion.hpp>
#include <glm/vec3.hpp>

class Game;
class Component;

class Actor {
public:
  enum State {
    EActive,
    EPaused,
    EDead
  };

  explicit Actor(Game *game);

  virtual ~Actor();

  void setPosition(glm::vec3 &position);

  void setRotation(glm::quat &rotation);

  void setScale(float scale);

  void addComponent(Component *component);

  void removeComponent(Component *component);

  void update(float deltaTime);

  void setState(State state);

  State getState() const;

protected:
  virtual void tick(float deltaTime);


private:
  glm::vec3 mPosition;

  glm::quat mRotation;

  float mScale;

  Game *mGame;

  std::vector<Component *> mComponents;

  State mState;

  void updateComponents(float deltaTime);
};

#endif // SANDBOX_ACTOR_H

Все акторы должны добавляться в вектор mActors в классе Game. Причем, так как класс Game вызывает обновление акторов из этого вектора, нам нельзя добавлять акторов на этапе обновления. Поэтому необходимо определить булево значение, которое определяет, обновляются ли акторы. Если да, то добавлять акторов в другой вектор mPendingActors, из которого будем переносить акторов в mActors после того, как завершим обновлять всех акторов.

После мы должны удалить всех акторов, у которые состояние стало EDead.

Класс Component

Класс Actor содержит вектор Component, который определяется:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef SANDBOX_COMPONENT_H
#define SANDBOX_COMPONENT_H

class Actor;

class Component {
public:
  explicit Component(Actor *owner, int updateOrder = 100);

  virtual ~Component();

  int getUpdateOrder() const;

  virtual void update(float deltaTime);

protected:
  Actor *mOwner;

private:
  int mUpdateOrder;
};

#endif // SANDBOX_COMPONENT_H

Компоненты обновляются в порядке, определенном переменной updateOrder в конструкторе.

Класс Game пробегает по своим акторам, вызывая метод Actor::update для каждого. Актор в свою очередь вызывает обновление всех своих компонентов и затем метод Actor::tick, который определяет специфичное для наследников обновление.

Заключение

Написаны классы Actor, Component. Сделано обновление акторов.

Код дня на Github

Sandbox::Write(Day001) Костяк песочницы, основной игровой цикл

Sandbox::Write(Day003) OpenGL, Shader

Comments powered by Disqus.