头文件
#pragma once
#ifndef __OBJ
#define __OBJ
#include "LBuff.h"
#include "LSocket.h"
#include "LRunnable.h"
#include "LMsg.h"
class Object
{
public:
Object() {}
virtual ~Object() {}
};
class Event
{
public:
enum SYSEVENTTYPE
{
LS_2_LM_EVENT,
LM_2_LS_EVENT,
CLIENT_2_LM_EVENT,
CLIENT_2_LS_EVENT,
TICK_TIME_LM_EVENT,
TICK_TIME_LC_EVENT
};
Lint m_iEventType;
std::vector<Object*> m_arvgList;
public:
void PushState(Object* _state)
{
if (_state != NULL)
m_OptStack.push_back(_state);
else
LLOG_ERROR(">>>> PushState(Object* _state): _state is NULL");
}
Object* PopState()
{
Object* obj = m_OptStack.back();
m_OptStack.pop_back();
return obj;
}
private:
std::vector<Object*> m_OptStack;
};
class BaseAction: public Object
{
public:
BaseAction() {};
virtual Lint ActionInit(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) = 0;
virtual Lint ActionDoing(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) = 0;
virtual bool isFinish(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) = 0;
};
enum enu_SERVER_TYPE
{
LM_SERVER=1,
LS_SERVER
};
class State: public Object
{
public:
enum enu_STATE
{
STATE_INIT_PREPARE=1,
STATE_INIT,
STATE_INIT_FINISH,
STATE_PROC,
STATE_OVER_PREPARE,
STATE_OVER,
STATE_OVER_RELEASE,
STATE_END
};
public:
static Lint m_ServerType;
virtual Lint StateInit() = 0;
virtual Lint StateProc(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) = 0;
virtual Lint StateOver() = 0;
};
//--------------------------------------------
class BaseState: public State
{
protected:
Lstring m_stateName;
BaseAction* m_Action;
Lint m_iState;
std::map<Lint, BaseAction*> m_RegActionList;
bool m_isActionFinish;
Lint Doing(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn);
public:
BaseState() { m_iState = 0; m_Action = NULL; };
Lint GetState() { return m_iState; }//获取当前状态
Lint SetState(Lint _state); //强制设置 当前状态,慎用,有可能有未处理完成的状态。
//当前状态事件处理
virtual bool IsStateFinish() { if (m_iState == m_RegActionList.size()) return true; return false; };
// 通过 BaseState 继承, 初始化 注册动作列表
virtual Lint StateInit() =0;
virtual Lint StateProc(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) override;
// 释放动作列表
virtual Lint StateOver() =0;
protected:
BaseAction* CreateAction() { return m_RegActionList[m_iState]; };
public:
virtual void DestroyState() { m_Action = NULL; m_isActionFinish = false; };
};
class BaseStateState : public BaseState
{
protected:
std::map<Lint, BaseState*> m_listSubState;
Lint m_StateIndex;
bool m_isMyFinish;
public:
BaseStateState() { m_iState = 0; m_Action = NULL; m_StateIndex = 0; };
Lint GetState() { return m_iState; }//获取当前状态
Lint SetState(Lint _state) { return 0; }; //强制设置 当前状态,慎用,有可能有未处理完成的状态。
//当前状态事件处理
virtual bool IsStateFinish() { if (m_iState == m_listSubState.size()) return true; return false; };
// 通过 BaseState 继承, 初始化 注册动作列表
virtual Lint StateInit() = 0;
virtual Lint StateProc(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) override;
// 释放动作列表
virtual Lint StateOver() = 0;
public:
virtual void DestroyState();
};
//------------------------------------------------------------------
实现文件
Lint BaseState::Doing(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) {
Lint ret = -1;
if (m_Action != NULL)//已分配 事情要做
{
ret = m_Action->ActionDoing(_obj, _obj2, _obj3, _objdata, _msg);//处理事情
if (m_Action->isFinish(_obj, _obj2, _obj3, _objdata, _msg))// 是否满足结束条件
{
m_iState++;
DestroyState();//摧毁action
if (m_iState < m_RegActionList.size())
{
m_Action = CreateAction();
if (m_Action)
ret = m_Action->ActionInit(_obj, _obj2, _obj3, _objdata, _msg);//初始化
}
}
}
else // 没有分配事情做
{
while (m_Action == NULL && m_iState < m_RegActionList.size())//找需要做的事情,找到并创建成功
{
m_Action = CreateAction();
if (m_Action)// 是否创建成功
{
ret = m_Action->ActionDoing(_obj, _obj2, _obj3, _objdata, _msg);//处理事情
if (m_Action->isFinish(_obj, _obj2, _obj3, _objdata, _msg))// 是否满足结束条件
{
m_iState++;
DestroyState();//摧毁action
if (m_iState < m_RegActionList.size())
{
m_Action = CreateAction();
if(m_Action)
ret = m_Action->ActionInit(_obj, _obj2, _obj3, _objdata, _msg);//初始化
}
}
break;
}
}
}
return ret;
}
Lint BaseState::SetState(Lint _state)
{
m_iState = _state;
DestroyState();
m_Action = CreateAction();
return m_iState;
}
Lint BaseState::StateProc(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn)
{//当前状态 ,当收到 需要处理的数据时, 调用该函数。
return BaseState::Doing(_obj, _obj2, _obj3,_objdata, _msg);
}
Lint BaseStateState::StateProc(Object * _obj, Object * _obj2, Object * _obj3, Object * _objdata, LMsg * _msg, Event & _evn)
{
if (m_isMyFinish == true)
return 0;
while (m_listSubState[m_StateIndex]->IsStateFinish())
{
m_StateIndex++;
if (m_StateIndex > m_listSubState.size() || m_listSubState[m_StateIndex] == NULL)
break;
}
if (m_listSubState[m_StateIndex] != NULL)
{
if (!(m_listSubState[m_StateIndex]->IsStateFinish()))
{
_evn.PushState(this);
m_listSubState[m_StateIndex]->StateProc(_obj, _obj2, _obj3, _objdata, _msg, _evn);
_evn.PopState();
}
else
{
m_StateIndex++;
if (m_StateIndex > m_listSubState.size())
{
m_isMyFinish = true;
Lint i = 0;
while (i <= m_listSubState.size())
{
m_listSubState[i++]->DestroyState();
}
}
}
}
return Lint();
}
void BaseStateState::DestroyState()
{
m_isActionFinish = false;
m_StateIndex = 0;
Lint i = 0;
while (i <= m_listSubState.size())
{
m_listSubState[i++]->DestroyState();
}
};