游戏副本功能开发

对应游戏来说,重要的功能分为,战斗,副本等等,这里先来介绍下游戏副本功能设计,当然,本人只是工作半年的游戏服务器开发的屌丝代码工,如果有什么问题希望多拍砖。

副本这里介绍的使用工程模式来进行创建的。

首先做一个工厂基类用于整个游戏的工厂基类: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来测试下喽。。

你可能感兴趣的:(C++,服务器,游戏开发)