/********************************************************************
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");
}
本文介绍了一个游戏触发器的设计实现,包括基本触发器类的设计、定时触发器和怪物移动触发器的具体实现。通过模板方法和多态实现了不同类型的触发器,并且能够调用对应的Lua脚本来处理触发事件。
590

被折叠的 条评论
为什么被折叠?



