c++ 游戏中事件触发逻辑处理

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

class Player;
typedef void (*func)(Player *player);

class Event{
public:
    void addf(const char* evType, func f)
    {
        auto vec = mapf[evType];
        vector v;
        if(vec.size()>0)
        {
            v = mapf[evType];
            v.push_back(f);
        }
        else
        {
            v.push_back(f);
        }
        mapf[evType] = v;
    }

    bool isExist(const char * evType)
    {
        auto vec = mapf[evType];
        if(vec.size()>0)
            return true;
        return false;
    }

    void excute(const char *evType, Player* player)
    {
        std::vector v = mapf[evType];
        auto it = v.begin();
        for(; it!= v.end(); ++it)
        {
            func f = *it;
            f(player);
        }
    }

private:
    map > mapf;
};

class Events
{
public:
    Events(){}
    ~Events(){
        auto it = vec.begin();
        for(; it != vec.end();)
        {
            Event *et = *it;
            delete et;
            it = vec.erase(it);
        }
    }
    bool addEvent(Event *e)
    {
        vec.push_back(e);
    }
    Event* findEvent(const char* evType)
    {
        auto it = vec.begin();
        for(;it != vec.end();++it)
        {
            Event *ev = *it;
            if(ev->isExist(evType))
                return ev;
        }
        return nullptr;
    }

    void callevent(const char* evType, Player *player)
    {
        Event* ev = findEvent(evType);
        if(ev != nullptr)
        {
            ev->excute(evType, player);
        }
    }

    static Events *getInstance()
    {
        return instance;
    }
private:
    vector vec;
    static Events *instance;
};

Events* Events::instance = new Events;

class Player
{
public:
    Player():level(0){}
    ~Player(){
    }
    void uplevel()
    {
        level += 1;
        Events *ets = Events::getInstance();
        ets->callevent("PlayerUplevelEvent", this);
    }

    void killboss()
    {
        Events *ets = Events::getInstance();
        ets->callevent("PlayerKillBossEvent", this);
    }
    static void print(Player *player)
    {
        cout << player->level <addEvent(evuplvl);
    Player *player = new Player;
    evuplvl->addf("PlayerUplevelEvent", Player::print);
    evuplvl->addf("PlayerUplevelEvent", VIP::print);
    player->uplevel();
    Event *evkillboss = new Event;
    ets->addEvent(evkillboss);
    evkillboss->addf("PlayerKillBossEvent", Player::killboss);
    evkillboss->addf("PlayerKillBossEvent", VIP::killboss);
    evkillboss->addf("PlayerKillBossEvent", Task::killboss);
    player->killboss();
    delete player;
    delete ets;
    return 0;
}

 

你可能感兴趣的:(c/c++)