Files
Sun1602/Tools/WiseClient/Object/ObjectManager.h
T
2022-10-26 12:25:11 +08:00

152 lines
4.9 KiB
C++

#pragma once
#include <Object/GameObject.h>
#include <Object/RenderObject.h>
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´
//
struct MSG_BASE;
class GameObject;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´
// <ObjectManager>
class ObjectManager
{
friend class ObjectManagerUpdater;
friend struct OBJ_OP_BASE;
friend struct OBJ_OP_USER;
friend struct OBJ_OP_PLAYER;
friend struct OBJ_OP_MONSTER;
private:
typedef STLX_MAP<DWORD, RenderObject*> GAME_OBJECT_MAP;
typedef GAME_OBJECT_MAP::iterator GAME_OBJECT_MAP_IT;
private: ObjectManager();
~ObjectManager();
public: static void CreateInstance();
static void DestroyInstance();
//////////////////////////////////////////////////////////////////////////
//
class ObjectManagerUpdater : public IWorkNode
{
public:
ObjectManagerUpdater() {}
~ObjectManagerUpdater() {}
public:
virtual BOOL DoInit();
virtual BOOL DoProcess();
virtual BOOL IsComplete();
virtual BOOL DoRelease();
virtual void OnMsg(sSIG_MSG* pSIG_MSG);
};
//////////////////////////////////////////////////////////////////////////
//
public: static RenderObject* FindObject(DWORD dwObjectKey);
static BOOL RegisterObject(RenderObject* pOBJECT);
static BOOL UnRegisterObject(RenderObject* pOBJECT);
inline static
void OnMsg(sSIG_MSG* pSIG_MSG) { Updater().OnMsg(pSIG_MSG); }
inline static
ObjectManagerUpdater& Updater() { return m_pInstance->m_Updater; }
template<typename _TY_RENDER_INFO> inline static
_TY_RENDER_INFO& ALIGN_RENDER_INFO(RenderObject* pRENDER, _TY_RENDER_INFO* IN pINFO)
{
const DWORD dwOffset = offsetof(_TY_RENDER_INFO, m_StateTotalInfo);// (DWORD) (__int64)&(((_TY_RENDER_INFO*)0)->m_StateTotalInfo);
_TY_RENDER_INFO& rINFO = pRENDER->RenderTypeOf<_TY_RENDER_INFO>();
DWORD dwAppendSize = sizeof(STATE_TOTAL_INFO) * pINFO->m_StateTotalInfo.m_Count;
CopyMemory(&rINFO, pINFO, dwOffset+dwAppendSize);
return rINFO;
}
private: RenderObject* AllocObject(GAME_OBJECT::TYPE eOBJTYPE);
BOOL FreeObject(RenderObject* pOBJECT);
//private: void OnEnter(sSIG_OBJCTRL* pSIG_MSG);
// void OnLeave(sSIG_OBJCTRL* pSIG_MSG);
// void OnAttack(sSIG_OBJCTRL* pSIG_MSG);
// void OnMove(sSIG_OBJCTRL* pSIG_MSG);
// void OnStatus(sSIG_OBJCTRL* pSIG_MSG);
//////////////////////////////////////////////////////////////////////////
// <FIELDs>
private: static ObjectManager* m_pInstance;
ObjectManagerUpdater m_Updater;
GAME_OBJECT_MAP m_OBJMAP;
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´
//
//
#define OBJCTRL_HANDLER_DECL(prefix, name) \
virtual void On##name(ObjectManager& rMANAGER, sSIG_OBJCTRL& rSIG_MSG)
#define OBJCTRL_HANDLER_IMPL(prefix, name) \
void prefix::On##name(ObjectManager& rMANAGER, sSIG_OBJCTRL& rSIG_MSG)
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´
// <HANDLERs>
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´
struct OBJ_OP_BASE
{
OBJ_OP_BASE() {}
virtual ~OBJ_OP_BASE() {}
OBJ_OP_BASE(RenderObject* pOBJECT) : m_pOBJECT(pOBJECT) {}
OBJ_OP_BASE(OBJ_OP_BASE& rCHILD) : m_pOBJECT(rCHILD.m_pOBJECT) {}
OBJCTRL_HANDLER_DECL(OBJ_OP_BASE, RenderInfo);
OBJCTRL_HANDLER_DECL(OBJ_OP_BASE, Enter);
OBJCTRL_HANDLER_DECL(OBJ_OP_BASE, Leave);
OBJCTRL_HANDLER_DECL(OBJ_OP_BASE, Attack) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_BASE, Move) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_BASE, Status) { DEBUGGING_CODE_L3(""); }
RenderObject* m_pOBJECT;
};
struct OBJ_OP_USER : OBJ_OP_BASE
{
OBJ_OP_USER(RenderObject* pOBJECT) : OBJ_OP_BASE(pOBJECT) {}
OBJCTRL_HANDLER_DECL(OBJ_OP_USER, RenderInfo);
OBJCTRL_HANDLER_DECL(OBJ_OP_USER, Attack) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_USER, Move) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_USER, Status) { DEBUGGING_CODE_L3(""); }
};
struct OBJ_OP_PLAYER : OBJ_OP_BASE
{
OBJ_OP_PLAYER(RenderObject* pOBJECT) : OBJ_OP_BASE(pOBJECT) {}
OBJCTRL_HANDLER_DECL(OBJ_OP_PLAYER, RenderInfo);
OBJCTRL_HANDLER_DECL(OBJ_OP_PLAYER, Enter) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_PLAYER, Leave) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_PLAYER, Attack) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_PLAYER, Move) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_PLAYER, Status) { DEBUGGING_CODE_L3(""); }
};
struct OBJ_OP_MONSTER : OBJ_OP_BASE
{
OBJ_OP_MONSTER(RenderObject* pOBJECT) : OBJ_OP_BASE(pOBJECT) {}
OBJCTRL_HANDLER_DECL(OBJ_OP_MONSTER, RenderInfo);
OBJCTRL_HANDLER_DECL(OBJ_OP_MONSTER, Enter);
OBJCTRL_HANDLER_DECL(OBJ_OP_MONSTER, Leave);
OBJCTRL_HANDLER_DECL(OBJ_OP_MONSTER, Attack) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_MONSTER, Move) { DEBUGGING_CODE_L3(""); }
OBJCTRL_HANDLER_DECL(OBJ_OP_MONSTER, Status) { DEBUGGING_CODE_L3(""); }
};