/******************************************************************** created: 2011/11/13 file base: define file ext: h author: Clark/陈泽丹 purpose: *********************************************************************/ #ifndef __TASK_DEFINE_H__ #define __TASK_DEFINE_H__ struct IEvent{}; struct STimerTrig{}; struct SMonsterMoveTrig{}; #endif //__TASK_DEFINE_H__
/******************************************************************** created: 2011/11/13 file base: CLK file ext: h author: Clark/陈泽丹 purpose: *********************************************************************/ #pragma once #include <tchar.h> #include <Windows.h> #include "define.h" namespace CLK { //初始化CLK库的基类 class BaseCLK { public: static BOOL Init(); static void UnInit(); }; //打印器 class Trace { public: static void Print(const TCHAR* pText); }; //常量转类型 template<DWORD v> class Dword2Type { public: enum {VALUE = v}; }; }
#include "CLK.h" #include <iostream> using namespace std; BOOL CLK::BaseCLK::Init() { setlocale(LC_ALL,"chs"); return TRUE; } void CLK::BaseCLK::UnInit(){} void CLK::Trace::Print(const TCHAR* pText) { _tprintf(pText); }
//------------------------------------------------------------------------------------------------------------------------
/******************************************************************** created: 2011/11/13 file base: Trigger file ext: h author: Clark/陈泽丹 purpose: 触发器基类 *********************************************************************/ #ifndef __TRIGGER_H__ #define __TRIGGER_H__ #include "..//CLK.h" class Trigger { public: //创建触发器实例 template<class T> BOOL Create(T* pDate) { CreateTrig<T> createTrig; return createTrig(this, pDate); } //触发器触发时要回调的函数,这个函数会回调对应的LUA函数 virtual void OnTrigger() = 0; //释放,要释放触发器 virtual void Release(){ delete this; } protected: Trigger(){} virtual ~Trigger(){} private: template<class T> class CreateTrig { public: BOOL operator()(Trigger* pTrigger, T* pDate) { CLK::Trace::Print(TEXT("异常类型触发器\n")); return FALSE; } }; }; template<class T> class TriggerEx:public Trigger{ void OnTrigger(){} }; #endif //__TRIGGER_H__
/******************************************************************** created: 2011/11/13 file base: TimerTrig file ext: h author: Clark/陈泽丹 purpose: 时间触发器 *********************************************************************/ #ifndef __TIME_TRIGGER_H__ #define __TIME_TRIGGER_H__ #include "..//Trigger.h" template<> class Trigger::CreateTrig<STimerTrig> { public: BOOL operator()(Trigger* pTrigger, STimerTrig* pDate) { CLK::Trace::Print(TEXT("STimerTrig类型触发器\n")); TriggerEx<STimerTrig>* pTimerTrig = dynamic_cast<TriggerEx<STimerTrig>*>(pTrigger); pTimerTrig->OnTimer(0); return TRUE; } }; template<> class TriggerEx<STimerTrig>: public Trigger { public: TriggerEx(); virtual ~TriggerEx(); //触发器触发时要回调的函数,这个函数会回调对应的LUA函数 //特别警告:回调LUA函数时,LUA函数有可能删除本触发器,所以回调操作一定要放到最后面 virtual void OnTrigger(); private: //定时器回调 virtual void OnTimer(DWORD dwTimerID) { if( TIMER_ID == dwTimerID){ OnTrigger();} } private: enum { TIMER_ID }; friend CreateTrig<STimerTrig>; }; #endif //__TIME_TRIGGER_H__
#include "TimerTrig.h" TriggerEx<STimerTrig>::TriggerEx(){} TriggerEx<STimerTrig>::~TriggerEx(){} void TriggerEx<STimerTrig>::OnTrigger() { CLK::Trace::Print(TEXT("TimerTrig类型触发器触发了,执行相应的Lua函数\n")); }
/******************************************************************** created: 2011/11/13 file base: TimerTrig file ext: h author: Clark/陈泽丹 purpose: 怪移触发器 *********************************************************************/ #ifndef __MONSTER_MOVE_TRIGGER_H__ #define __MONSTER_MOVE_TRIGGER_H__ #include "..//Trigger.h" template<> class Trigger::CreateTrig<SMonsterMoveTrig> { public: BOOL operator()(Trigger* pTrigger, SMonsterMoveTrig* pDate) { CLK::Trace::Print(TEXT("SMonsterMoveTrig类型触发器\n")); TriggerEx<SMonsterMoveTrig>* pMonsterMoveTrig = dynamic_cast<TriggerEx<SMonsterMoveTrig>*>(pTrigger); pMonsterMoveTrig->OnTrigger(); return TRUE; } }; template<> class TriggerEx<SMonsterMoveTrig>: public Trigger { public: TriggerEx(); virtual ~TriggerEx(); //触发器触发时要回调的函数,这个函数会回调对应的LUA函数 //特别警告:回调LUA函数时,LUA函数有可能删除本触发器,所以回调操作一定要放到最后面 virtual void OnTrigger(); private: //活动消息 virtual void OnAction(IEvent *pEvent); //响应消息 virtual void OnResponse(IEvent *pEvent); //监听一条消息 void SubMsg(); //取消一条消息 void UnSubMsg(); friend CreateTrig<SMonsterMoveTrig>; }; #endif //__MONSTER_MOVE_TRIGGER_H__
#include "MonsterMoveTrig.h" TriggerEx<SMonsterMoveTrig>::TriggerEx() { } TriggerEx<SMonsterMoveTrig>::~TriggerEx() { } void TriggerEx<SMonsterMoveTrig>::OnTrigger() { CLK::Trace::Print(TEXT("MonsterMoveTrig类型触发器触发了,执行相应的Lua函数\n")); } void TriggerEx<SMonsterMoveTrig>::OnAction(IEvent *pEvent) { } void TriggerEx<SMonsterMoveTrig>::OnResponse(IEvent *pEvent) { }
//--------------------------------------------------
#include <iostream> #include "Trigger//Trigger.h" #include "Trigger//TimerTrig//TimerTrig.h" #include "Trigger//MonsterMoveTrig//MonsterMoveTrig.h" using namespace std; void main() { CLK::BaseCLK::Init(); typedef STimerTrig TestClass; TestClass data; Trigger* pTrigger = new TriggerEx<TestClass>(); pTrigger->Create(&data); pTrigger->Release(); pTrigger = NULL; CLK::BaseCLK::UnInit(); system("pause"); }