Simple EventManager

Visual Studio 10¿¡¼­´Â C++ 11À» Áö¿øÇÏÁö ¾Ê´Â´Ù.
À̺¥Æ® ¸Å´ÏÁ®¸¦ Àç ÀÛ¼ºÇÑ´Ù.
´ÙÀ½°ú ¸îÃÊ ÈÄ¿¡ ƯÁ¤ °´Ã¼ÀÇ ÇÔ¼ö¸¦ ½ÇÇàÇÏ´Â °£´ÜÇÑ ±â´ÉÀÌ´Ù.

IEventFunctionImp* eventImp = new EventFunctionImp<App>(this, &App::CallbackEvent);

»ç¿ë¹ýºÎÅÍ ¸ÕÀú ¾Ë¾Æº¸ÀÚ.

< »ç¿ë¹ý >


1. Çì´õ ÆÄÀÏÀ» Æ÷ÇÔÇÑ´Ù.
#include "event/EventManager.h"

2. EventManager ¸â¹ö º¯¼ö¸¦ Ãß°¡ÇÑ´Ù.
EventManager* m_pEventManager;

3. À̺¥Æ® ¸Å´ÏÁ® °´Ã¼¸¦ »ý¼º ÇÑ´Ù.
App::App()
: m_pEventManager(NULL), m_msTime(0)
{
    Init();
}

void App::Init()
{
    m_pEventManager = new EventManager();
    m_msTime = timeGetTime();
}

4. À̺¥Æ® ¸Å´ÏÁ® °´Ã¼¸¦ ¼Ò¸ê ÇÑ´Ù.
void App::DeInit()
{
    if(m_pEventManager)
    {
        delete m_pEventManager;
        m_pEventManager = NULL;
    }
}

5. À̺¥Æ® Äݹé ÇÔ¼ö¸¦ ¸¸µç´Ù.
int App::CallbackEvent(bool arg)
{
    if(arg)
        printf("%0.2f CallbackEvent by EventManager\n", m_msTime/1000.0f);
    else
        printf("%0.2f CallbackEvent by function\n", m_msTime/1000.0f);

    AddEvent();
    return 0;
}

6. À̺¥Æ®¸¦ Ãß°¡ÇÑ´Ù.
void App::AddEvent()
{
    IEventFunctionImp* eventImp = new EventFunctionImp<App>(this, &App::CallbackEvent);
    EventBase* pEvent = new EventBase(3.0f);
    pEvent->SetCallback(eventImp);
    m_pEventManager->AddEvent(pEvent);
}

7. À̺¥Æ®¸¦ ¾÷µ¥ÀÌÆ® ½ÃŲ´Ù.
void App::Update()
{
    DWORD t = timeGetTime();
    m_pEventManager->Update((float)(t - m_msTime)/1000.0f);
    m_msTime = t;
}

°á°ú)
265762.11 CallbackEvent by EventManager
265762.11 CallbackEvent by EventManager
265762.11 CallbackEvent by EventManager
........

< ºÐ¼® >


1. Äݹé ÇÔ¼ö¸¦ ½ÇÇàÇϱâ À§ÇØ IEventFunctionImp ÀÎÅÍÆäÀ̽º »ý¼º

°´Ã¼ÀÇ Äݹé ÇÔ¼ö¸¦ È£ÃâÇϱâ À§ÇÑ ÀÎÅÍÆäÀ̽º Ŭ·¡½º¸¦ ¸¸µç´Ù.

2. »ó¼ÓÇÏÁö ¾Ê°í °´Ã¼¸¦ È£ÃâÇϱâ À§ÇØ ÅÛÇø´À» ¸¸µç´Ù.

»ó¼ÓÇÏÁö ¾Ê°í °´Ã¼ÀÇ ÇÔ¼ö¸¦ ½ÇÇà ÇÒ·Á¸é ÀÎÅÍÆäÀ̽º¸¦ ¸¸µé°í ÀÎÅÍÆäÀ̽ºÀÇ ÇÔ¼ö ½Ã±×´ÏÃÄ¿Í °°Àº ÇÔ¼ö¸¦ °´Ã¼¿¡ ¸¸µç´Ù.
ÅÛÇø´ ¸â¹ö·Î °´Ã¼¿Í ¸Þ¼­µå¸¦ ÀúÀåÇÑ´Ù.

class IEventFunctionImp
{
public:
     virtual int Run(bool arg) = 0;
};

template<class T>
class EventFunctionImp : public IEventFunctionImp
{
public:
    typedef int (T::*Callback)(bool arg);

    EventFunctionImp(T * obj, Callback callback) : m_pObj(obj), m_callback(callback)
    {
    }

    int Run(bool arg)
    {
         return (m_pObj->*m_callback)(arg);
    }

private:
     T * m_pObj;
     Callback m_callback;
};

3. À̺¥Æ® °´Ã¼¸¦ ¸¸µç´Ù.

À̺¥Æ®°¡ ¹ß»ýÇÒ¶§ ¸¶´Ù »ý¼ºµÇ´Â À̺¥Æ® Ŭ·¡½º¸¦ ¸¸µç´Ù.
À̺¥Æ® Ŭ·¡½º¿¡´Â ´ÙÀ½ º¯¼ö¸¦ °¡Áø´Ù.

m_duration :  À̺¥Æ® °´Ã¼ »ý¼ºÈÄ, ¸î ÃÊÈÄ¿¡ À̺¥Æ®°¡ ¹ß»ýÇÒÁö Á¤ÇÑ´Ù.
m_elapse : È帥 ½Ã°£À¸·Î ÃÊ´ÜÀ§ÀÌ´Ù.
m_pFunc : À̺¥Æ® Äݹé ÇÔ¼ö

class EventBase
{
public:
    float m_duration;
    float m_elapse;
    IEventFunctionImp* m_pFunc;

public:
    EventBase(float duration);
    void SetCallback(IEventFunctionImp* func);
    virtual bool IsDone();
    virtual void Stop();
    virtual void Advance(float dt);
};

SetCallback :  À̺¥Æ® ¹ß»ý½Ã ºÒ·ÁÁö´Â Äݹé ÇÔ¼öÀÌ´Ù.
IsDone : m_duration ¸¸Å­ ¼Ò¿ä ½Ã°£ÀÌ µÇ¾î À̺¥Æ®°¡ ¹ß»ýÇÒÁö üũ ÇÏ´Â ÇÔ¼ö
Stop : À̺¥Æ®¸¦ ¸ØÃß°í Äݹé ÇÔ¼ö¸¦ Á¦°ÅÇÑ´Ù.
Advance : À̺¥Æ® ½Ã°£À» ¾÷µ¥ÀÌÆ® ÇÑ´Ù.

4. À̺¥Æ®¸Å´ÏÁ®¿¡¼­ À̺¥Æ® ¸®½ºÆ®¸¦ °ü¸®ÇÑ´Ù.

AddEvent : À̺¥Æ®¸¦ Ãß°¡ÇÑ´Ù.
Update : À̺¥Æ® ½Ã°£À» ¾÷µ¥ÀÌÆ® ÇÑ´Ù.

class EventManager
{
private:
    std::list<EventBase*> m_events;
public:
    EventManager();
    void AddEvent(EventBase* ievent);
    void Update(float dt);
};

À̺¥Æ® ½Ã°£À» ¾÷µ¥ÀÌÆ® ÇÏ°í IsDoneÀ̸é À̺¥Æ®¸¦ ¸ØÃß°í À̺¥Æ®¸¦ Á¦°ÅÇÑ´Ù.

void EventManager::Update(float dt)
{
    std::list<EventBase*>::iterator it = m_events.begin();
    for(; it!= m_events.end(); )
    {
        (*it)->Advance(dt);
        if((*it)->IsDone())
        {
            (*it)->Stop();
            delete (*it);
            m_events.erase(it++);
        }
        else
            it++;
    }
}


¼Ò½º:
main.cpp
event/EventManager.h
event/EventManager.cpp
eventTest.zip