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 |