#pragma once #include #include //收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收朽 // struct MSG_BASE; class GameObject; //收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收朽 // 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 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 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); ////////////////////////////////////////////////////////////////////////// // 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) //收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收朽 // //收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收收朽 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(""); } };