对应游戏来说,重要的功能分为,战斗,副本等等,这里先来介绍下游戏副本功能设计,当然,本人只是工作半年的游戏服务器开发的屌丝代码工,如果有什么问题希望多拍砖。
副本这里介绍的使用工程模式来进行创建的。
首先做一个工厂基类用于整个游戏的工厂基类: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
接下来,创建副本的虚基类,这里定义副本逻辑的所有需要的功能,方面之后派生的相应副本功能。
副本基类:
ifndef __BASECOPYWORLD_H__ #define __BASECOPYWORLD_H__ class QCopyWorldLogic { public: QCopyWorldLogic(); ~QCopyWorldLogic(); public: virtual int GetID()=0; }; #endif
这里要说明一点,如果需要一些关于副本相对于的开启时间的配置信息,那么可以在这里来继承一下。
这里是虚基类的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来测试下喽。。