对应游戏来说,重要的功能分为,战斗,副本等等,这里先来介绍下游戏副本功能设计,当然,本人只是工作半年的游戏服务器开发的屌丝代码工,如果有什么问题希望多拍砖。
副本这里介绍的使用工程模式来进行创建的。
首先做一个工厂基类用于整个游戏的工厂基类: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来测试下喽。。