對應遊戲來講,重要的功能分爲,戰鬥,副本等等,這裏先來介紹下游戲副本功能設計,固然,本人只是工做半年的遊戲服務器開發的屌絲代碼工,若是有什麼問題但願多拍磚。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來測試下嘍。。