遊戲副本功能開發

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

相關文章
相關標籤/搜索