模板的实现

/********************************************************************
	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");
}


 

你可能感兴趣的:(timer,struct,File,ext,Class,lua)