对应游戏来讲,重要的功能分为,战斗,副本等等,这里先来介绍下游戏副本功能设计,固然,本人只是工做半年的游戏服务器开发的屌丝代码工,若是有什么问题但愿多拍砖。ios
副本这里介绍的使用工程模式来进行建立的。服务器
首先作一个工厂基类用于整个游戏的工厂基类:BaseFactory.h框架
#ifndef __BASEFACTORY_H__ #define __BASEFACTORY_H__ template <typename T, int nSize> class FactoryLogicMgr_T { public: FactoryLogicMgr_T(); ~FactoryLogicMgr_T(); virtual bool init(void)=0; T* GetLogicById( int const ID); void RegisterLogic(int nID, T* pLogic); protected: bool m_bReady; T* m_pLogics[nSize]; }; template <typename T, int nSize> FactoryLogicMgr_T<T, nSize>::~FactoryLogicMgr_T() { m_bReady = false; for(int i = 0; nSize > i; ++i) { if(NULL != m_pLogics[i]) { delete(m_pLogics[i]); m_pLogics[i] = NULL; }; }; } template <typename T, int nSize> FactoryLogicMgr_T<T, nSize>::FactoryLogicMgr_T() { for (int i = 0; i < nSize; ++i) { m_pLogics[i] = NULL; } m_bReady = init(); } template <typename T, int nSize> void FactoryLogicMgr_T<T, nSize>::RegisterLogic( int nID, T* pLogic ) { m_pLogics[nID] = pLogic; } template <typename T, int nSize> inline T* FactoryLogicMgr_T<T, nSize>::GetLogicById( int const ID ) { if (0<ID && nSize > ID && true == m_bReady) { return m_pLogics[ID]; } return NULL; } template <typename T, int nSize> inline bool FactoryLogicMgr_T<T, nSize>::init( void ) { return false; } #define REGISTER_LOGIC(LOGIC) \ { \ LOGIC* pLogic = NULL; \ pLogic = new LOGIC ; \ RegisterLogic(pLogic->GetID(), pLogic); \ } #endif
接下来,定义副本的工厂模板,这里继承自基类模板测试
#ifndef __COPYWORLDFACTORY_H__ #define __COPYWORLDFACTORY_H__ #include "BaseCopyWorld.h" enum ECopyWorldID { ECopyWorldID_Test = 0, ECopyWorldID_Max, }; //作头文件声明 #include "TestClass.h" template<typename T, int nSize> class CopyWorldMgr_T:public FactoryLogicMgr_T<T, nSize> { public: CopyWorldMgr_T(){}; virtual ~CopyWorldMgr_T(){}; public: //注册全部副本信息 virtual bool init(void); }; template<> inline bool CopyWorldMgr_T<QCopyWorldLogic, ECopyWorldID_Max>::init( void ) { REGISTER_LOGIC(TestClass); m_bReady = true; for (int i = 0; i < ECopyWorldID_Max; ++i) { if (NULL != m_pLogics[i]) { //这里直接初始化每一个副本的数据信息 //m_pLogics[i]; } } return true; } typedef class CopyWorldMgr_T<QCopyWorldLogic, ECopyWorldID_Max> QCopyWorldLogicMgr_T; extern QCopyWorldLogicMgr_T G_CopyWorldLogicMgr; inline QCopyWorldLogic* GetCopyWorldLogic(int nID) { return G_CopyWorldLogicMgr.GetLogicById(nID); } #endif
接下来,建立副本的虚基类,这里定义副本逻辑的全部须要的功能,方面以后派生的相应副本功能。spa
副本基类:设计
ifndef __BASECOPYWORLD_H__ #define __BASECOPYWORLD_H__ class QCopyWorldLogic { public: QCopyWorldLogic(); ~QCopyWorldLogic(); public: virtual int GetID()=0; }; #endif
这里要说明一点,若是须要一些关于副本相对于的开启时间的配置信息,那么能够在这里来继承一下。code
这里是虚基类的CPP文件继承
#include "stdafx.h" #include "BaseCopyWorld.h" QCopyWorldLogicMgr_T G_CopyWorldLogicMgr; QCopyWorldLogic::QCopyWorldLogic() { } QCopyWorldLogic::~QCopyWorldLogic() { }
以后定义一个测试副本的类:接口
#ifndef __TESTCLASS_H__ #define __TESTCLASS_H__ class TestClass: public QCopyWorldLogic { public: TestClass(){}; virtual ~TestClass(){}; public: virtual int GetID(){return ECopyWorldID_Test;} }; #endif
由于只是作一个副本框架的形式,因此不作具体的接口定义,若是有须要使用相应的功能,能够在虚基类中定义,这里继承虚基类,进行重写就能够。游戏
这里是头文件:
/ stdafx.h : 标准系统包含文件的包含文件, // 或是常常使用但不常更改的 // 特定于项目的包含文件 // #pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h> #include <iostream> using namespace std; // TODO: 在此处引用程序须要的其余头文件 #include "BaseFactory.h" #include "BaseCopyWorld.h" #include "CopyWorldFactory.h"
以后须要测试的话:那就本身写个main来测试下喽。。