Event handling

이벤트를 처리하는 방법에 대하여


프로그램 런타임에 Event가 발생하면 EventManager는 이를 모두 Queue에 저장해 놓았다가 특정 시점에서 모두 Dispath한다.
게임엔진은 사용자가 원하는 Event Type을 정의하고, 특정 Event Type을 처리하는 Callback을 등록하도록 인터페이스를 제공할 수 있다.

Event

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
/** Engine API **/
class IEvent
{
public:
virtual const EventTypeID GetEventTypeID() const = 0;
};

template <typename T>
class Event : public IEvent
{
public:
static const EventTypeID EVENT_TYPE_ID;

virtual const EventTypeID GetEventTypeID() const override
{
return EVENT_TYPE_ID;
}
};

/** Client **/

class KeydownEvent : public Event<KeydownEvent>
{
...
};

사용자는 Event<T>를 상속하여 새로운 Event Type을 정의할 수 있다.

Read more

Passkey Idiom

조금 더 강력하게 클래스 접근을 제한하는 방법.


Passkey Idiom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Secure
{
int data;

public:
static std::shared_ptr<Secure> CreateSecureObj(int data);
class Key
{
friend std::shared_ptr<Secure> Secure::CreateSecureObj(int data);
Key() {};
};

explicit Secure(const Key& key, int data) : data{data} {};
};

std::shared_ptr<Secure> Secure::CreateSecureObj(int data)
{
return std::make_shared<Secure>(Secure::Key(), data);
}

Usage

1
2
3
auto pSecure1 = Secure::CreateSecureObj(10); // OK
auto pSecure2 = std::make_shared<Secure>(Secure::Key(), 10); // Error
auto pSecure3 = new Secure(Secure::Key(), 10) // Error



Read more