游戏思考31:触发器一些代码思考

一、触发器作用

作为一个对象,这个对象来定义条件,当条件被智能体满足时,会产生一个动作

二、触发器代码

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

3)触发器管理类

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值