游戏Buff系统

编程入门 行业动态 更新时间:2024-10-23 12:38:20

游戏Buff<a href=https://www.elefans.com/category/jswz/34/1770742.html style=系统"/>

游戏Buff系统

游戏buff系统简单实现

Effect.h


#pragma onceclass Obj;enum eEffect
{E_EFFECT_ADD_HP = 0,E_EFFECT_DEC_HP = 1,E_EFFECT_ADD_SPEED = 2,E_EFFECT_DEC_SPEED = 3,E_EFFECT_MAX = 4,
};//效果父类, 修改玩家各种属性
class Effect
{
public:virtual void Cast(Obj *pObj) = 0; //受影响者
};class AddHpEffect : public Effect{
public:AddHpEffect(int hp):m_hp(hp){}virtual void Cast(Obj *pObj);
private:int m_hp;
};class DecHpEffect : public Effect{
public:DecHpEffect(int hp):m_hp(hp){}virtual void Cast(Obj *pObj);
private:int m_hp;
};class AddSpeedEffect : public Effect{
public:AddSpeedEffect(int speed):m_speed(speed){}virtual void Cast(Obj *pObj);
private:int m_speed;
};class DecSpeedEffect : public Effect{
public:DecSpeedEffect(int speed):m_speed(speed){}virtual void Cast(Obj *pObj);
private:int m_speed;
};

Effect.cpp


#include "Effect.h"
#include "Obj.h"void AddHpEffect::Cast(Obj *pObj)
{pObj->AddHp(m_hp);
}void DecHpEffect::Cast(Obj *pObj)
{pObj->DecHp(m_hp);
}void AddSpeedEffect::Cast(Obj *pObj)
{pObj->AddSpeed(m_speed);
}void DecSpeedEffect::Cast(Obj *pObj)
{pObj->DecSpeed(m_speed);
}

Buff.h

#include <ctime>
#include <set>
#include <vector>#include "Effect.h"class Obj;typedef std::vector<Effect *> vec_type;class Buff
{
public:Buff();virtual ~Buff();virtual void Init() {};virtual void Active(Obj* pObj) = 0; //buff 生效virtual void Remove(Obj* pObj){}   //移除buffvirtual int GetBuffid() { return m_Id; }
protected:time_t m_buff_start; //buff 开始时间int m_duration;        //持续时长int m_Id;              //唯一标识int m_prior;           //优先级int m_relation;       // buff关系 0叠加 1冲抵 2免疫(同一种,不同种)// std::set<int> m_overlySet; //叠加(保存哪些buff 的id)// bool m_coexit;         //并存(同一种buff)// int m_coexit_num;      //并存 多少个// bool m_suppressed;     //被抑制vec_type m_effects;
};//一个buff里可以有多个效果
class GainBuff : public Buff{
public:GainBuff(){m_Id = 1;Init();}~GainBuff(){}void Init();virtual void Active(Obj* pObj);private:};class DeBuff : public Buff{
public:DeBuff(){m_Id = 2;Init();}~DeBuff(){ }void Init();virtual void Active(Obj* pObj);
private:};

Buff.cpp


#include "Buff.h"
#include "Obj.h"Buff::Buff()
{
}Buff::~Buff()
{for (vec_type::iterator it = m_effects.begin(); it != m_effects.end();){delete *it;m_effects.erase(it++);} 
}void GainBuff::Init()
{Effect *effect = new AddHpEffect(50);if(effect == nullptr)return;m_effects.emplace_back(effect);effect = new AddSpeedEffect(50);if(effect == nullptr)return;m_effects.emplace_back(effect);
}void GainBuff::Active(Obj* pObj)
{for(auto& it : m_effects){it->Cast(pObj);}
}void DeBuff::Init()
{Effect *effect = new DecHpEffect(30);if(effect == nullptr)return;m_effects.emplace_back(effect);effect = new DecSpeedEffect(30);if(effect == nullptr)return;m_effects.emplace_back(effect);    
}void DeBuff::Active(Obj* pObj)
{for(auto& it : m_effects){it->Cast(pObj);}
}

Obj.h

#pragma once
#include <unordered_map> 
class Buff;
class Obj;class BuffMgr{typedef std::unordered_map<int, Buff *> map_type;
public:void AddBuff(Buff* buff);Buff* GetBuff(int buffid);void Active(Obj* pObj, int buffid);void Active(Obj *pObj);private:map_type m_Buffs;
};class Obj
{
public:Obj();~Obj();void AddHp(int hp);void AddSpeed(int speed);void DecHp(int hp);void DecSpeed(int speed);void TestRes();BuffMgr &GetBuffMgr() { return m_BuffMgr; }private:int m_hp{100};int m_speed{100};BuffMgr m_BuffMgr;
};

Obj.cpp


#include "Obj.h"
#include "Buff.h"
#include <iostream>
using namespace std;void BuffMgr::AddBuff(Buff* buff)
{cout << buff->GetBuffid() << endl;m_Buffs.emplace(buff->GetBuffid(), buff);  //注意这里要根据buff关系进行添加
}Buff* BuffMgr::GetBuff(int buffid)
{for(auto& it : m_Buffs){if(it.first == buffid){return it.second;}}
}void BuffMgr::Active(Obj* pObj)
{for (map_type::iterator it = m_Buffs.begin(); it != m_Buffs.end();){it->second->Active(pObj);delete it->second;m_Buffs.erase(it++);}
}void BuffMgr::Active(Obj* pObj, int buffid)
{for (map_type::iterator it = m_Buffs.begin(); it != m_Buffs.end();){if(it->first == buffid){it->second->Active(pObj);delete it->second;m_Buffs.erase(it++);break;}}
}Obj::Obj()
{
}Obj::~Obj()
{
}void Obj::AddHp(int hp)
{m_hp += hp;
}
void Obj::AddSpeed(int speed)
{m_speed += speed;
}
void Obj::DecHp(int hp)
{m_hp -= hp;
}
void Obj::DecSpeed(int speed)
{m_speed -= speed;
}void Obj::TestRes()
{cout << this->m_hp << " : " << this->m_speed << endl;
}

Test.cpp

//测试buff系统#include "Obj.h"
#include "Buff.h"int main(int argc, char const *argv[])
{Obj *pObj = new Obj();if(pObj == nullptr)return;Buff *gBuff = new GainBuff();if(gBuff == nullptr)return;pObj->GetBuffMgr().AddBuff(gBuff);pObj->GetBuffMgr().Active(pObj, gBuff->GetBuffid());pObj->TestRes();gBuff = new DeBuff();if(gBuff == nullptr)return;pObj->GetBuffMgr().AddBuff(gBuff);pObj->GetBuffMgr().Active(pObj);pObj->TestRes();delete pObj;pObj = nullptr;return 0;
}

g++ Buff.h Buff.cpp Effect.h Effect.cpp Obj.h Obj.cpp Test.cpp --std=c++11

 

更多推荐

游戏Buff系统

本文发布于:2023-06-27 19:26:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/915900.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:系统   游戏   Buff

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!