一、触发器作用
作为一个对象,这个对象来定义条件,当条件被智能体满足时,会产生一个动作
二、触发器代码
0)前置准备铺垫类
- 二维向量类
#ifndef VECTOR_2D
#define VECTOR_2D
struct vector2D
{
double x;
double y;
};
double Vec2DDistanceSq(const vector2D& v1, const vector2D& v2) {
double dx = v1.x - v2.x;
double dy = v1.y - v2.y;
return dx * dx + dy * dy;
}
#endif
1)触发器范围类
- 代码
#ifndef TRIGGER_REGION
#define TRIGGER_REGION
#include "vector2D.h"
class CTriggerRegion
{
public:
virtual ~CTriggerRegion(){}
virtual bool isTouching(vector2D entity,double entityRadius) const = 0;
};
class CTriggerRegion_Circle:public CTriggerRegion
{
private:
//中心
vector2D m_vPos;
//半径
double m_dRadius;
public:
CTriggerRegion_Circle(vector2D pos,double radius)
:m_vPos(pos),m_dRadius(radius){}
bool isTouching(vector2D pos,double entityRadius) const
{
return Vec2DDistanceSq(m_vPos,pos)<(entityRadius+m_dRadius)*(entityRadius+m_dRadius);
}
};
#endif
2)触发器类及衍生类
- 代码
#ifndef TRIGGER
#define TRIGGER
#include <fstream>
#include "triggerRegion.h"
class BaseGameEntity
{
};
class Raven_Bot:public BaseGameEntity
{
};
template <class entity_type>
class CTrigger:public BaseGameEntity
{
private:
CTriggerRegion_Circle* ptrTrigRegin;
//若触发就在下一个update删除
bool bRemove;
//激活那就是true
bool bActive;
int m_iNodeIndex;
protected:
void SetGraphNodeIndex(int index) {m_iNodeIndex = index;}
void SetRemoveFromGame() {bRemove = true;}
void SetActive() {bActive = true;}
void SetInActive() {bActive = false;}
public:
CTrigger(){};
virtual ~CTrigger(){}
//触发的函数
virtual void tryTrigger(entity_type* pObj) = 0;
//触发器更新状态
virtual void update() = 0;
int GetGraphNodeIndex() {return m_iNodeIndex;}
bool isRemoveFromGame() {return bRemove;}
bool isActive() {return bActive;}
};
- 衍生类
//---------------------------------------------
//重生武器、生命包基类
template <class entity_type>
class CTrigger_Respawning:public CTrigger<entity_type>
{
protected:
int m_iNumUpdateRespawn;
//表示几次update之后更新刷新出来
int m_iNumUpdateTickRespawn;
void Deactive()
{
SetInActive();
m_iNumUpdateRespawn = m_iNumUpdateTickRespawn;
}
public:
CTrigger_Respawning(){}
virtual CTrigger_Respawning(){}
virtual void tryTrigger(entity_type* pObj)=0;
virtual void update()
{
if((--m_iNumUpdateRespawn <=0) && !isActive())
SetActive();
}
void SetRespawnDelay(unsigned int numTicks) {m_iNumUpdateTickRespawn = numTicks;}
};
//武器补给类
class CTrigger_Weapon: public CTrigger_Respawning<Raven_Bot>
{
public:
//读图创建
CTrigger_Weapon(std::ifstream& datafile);
//这里可以写成机器人触发
void tryTrigger(Raven_Bot* pObj) override
{
if(isActive() /* && isTouchingTrigger(xxxx) */)
{
//pObj->PickupWeapon();
Deactive();
}
}
};
//生命回复类
class CTrigger_Health: public CTrigger_Respawning<Raven_Bot>
{
public:
//读图创建
CTrigger_Health(std::ifstream& datafile);
//这里可以写成机器人触发
void tryTrigger(Raven_Bot* pObj) override
{
if(isActive() /* && isTouchingTrigger(xxxx) */)
{
//pObj->IncreaceHealth();
Deactive();
}
}
};
//声音通知类
class CTrigger_SoundNotify: public CTrigger_Respawning<Raven_Bot>
{
public:
//读图创建
CTrigger_SoundNotify(std::ifstream& datafile);
//这里可以写成机器人触发
void tryTrigger(Raven_Bot* pObj) override
{
if(isActive() /* && isTouchingTrigger(xxxx) */)
{
//Dispatcher->DispatchMsg(xxxx)
Deactive();
}
}
};
#endif