freeeyes 发表于 2014-2-21 15:04:38

如何设计游戏中的道具功能(三)

对于道具的交换,我原则上是鼓励使用另一个容器去实现。
所有要交易的道具可以放在交易盒子中进行交换。
#ifndef _ITEMDEALBOX_H
#define _ITEMDEALBOX_H

#include "Bag.h"

//交易盒子
//add by freeeyes

#define MAX_DEALBOX_COUNT 10

//交易盒子内容
struct _ItemDealBox
{
      CBag*m_pFromBag;         //来源Bag
      CBag*m_pToBag;         //目的Bag
      CItem* m_pItem;            //道具信息

      _ItemDealBox()
      {
                m_pFromBag = NULL;
                m_pToBag   = NULL;
                m_pItem    = NULL;
      }
};

class CItemDealBox : public CContainer<_ItemDealBox>
{
public:
      CItemDealBox(uint16 u2Count = MAX_DEALBOX_COUNT);
      virtual ~CItemDealBox();

      /*
      *    @Description: 添加进入交易盒子
      */
      bool AddDealBox(CBag* pFromBag, CBag* pToBag, CItem* pItem);

      /*
      *    @Description: 交换盒子
      */
      bool ExangeItem();

      /*
      *    @Description: 回滚操作
      */
      void RollBack();

      /*
      *    @Description: 序列化写入,此类暂不实现
      */
      bool ReadFromBuffer(const char* pFileName);

      /*
      *    @Description: 从容器序列化入数据流,需要从子类去实现,此类暂不实现
      */
      bool WriteToBuffer(const char* pFileName);

};

#endif


双方通过AddDealBox这个函数,将要交易的数据放入盒子。
然后调用ExangeItem函数进行交换,或者调用RollBack函数回滚交易。

关于邮件,很多时候我们需要对邮件总量进行控制。
于是,我把邮件设置成了一个环

#ifndef _MAIL_H
#define _MAIL_H

//邮件具体结构
//add by freeeyes

#include <time.h>
#include "Object.h"

#define MAX_USERMIAL_NAME    50
#define MAX_USERMIAL_CONTANT 1000

class CUserMail : public CBaseObject
{
public:
      CUserMail();
      ~CUserMail();

      /*
      *    @Description: 初始化一个邮件
      */
      void Init();

      /*
      *    @Description: 设置一个邮件内容
      */
      void SetMailInfo(const char* pFromName, const char* pToName, const char* pContant);

      /*
      *    @Description: 得到来源名
      */
      char* const GetFromName();

      /*
      *    @Description: 得到目标名
      */
      char* const GetToName();

      /*
      *    @Description: 得到内容
      */
      char* const GetContant();

      /*
      *    @Description: 得到时间
      */
      uint32 GetDate();

//邮件存取相关方法
public:
      /*
      *    @Description: 从数据流还原Item对象
      */
      bool ReadFromBuffer(char* pBuffer, int& nSize);

      /*
      *    @Description: 序列化入数据流
      */
      bool WriteToBuffer(char* pBuffer, int& nSize);

private:
      char   m_szFromUserName;
      char   m_szToUserName;
      char   m_szMailContant;
      uint32 m_u4Date;
};

#endif

邮件继承自CBaseObject,并提供相关方法。顺便,把邮件列表做成一个环,用数据去管理提高效率。

#ifndef _MAILLIST_H
#define _MAILLIST_H

//邮件列表
//add by freeeyes

#include "Mail.h"

#define MAX_MIALLIST_COUNT 10

#define MAILLIST_FILE_NAME "maillist.pmf"

class CMailList
{
public:
        CMailList(uint16 u2MailtCount = MAX_MIALLIST_COUNT);
        ~CMailList();

        /*
        *    @Description: 添加一个邮件内容
        */
        void AddMailInfo(const char* pFromName, const char* pToName, const char* pContant);

        /*
        *    @Description: 回收邮件列表
        */
        void Close();

        /*
        *    @Description: 从数据流还原容器对象,需要从子类去实现
        */
        bool ReadFromBuffer(const char* pFileName);

        /*
        *    @Description: 从数据流还原容器对象,需要从子类去实现
        */
        bool WriteToBuffer(const char* pFileName);

        /*
        *    @Description: 得到当前邮件个数
        */
        uint16 GetMailCount();

        /*
        *    @Description: 得到当前最大个数
        */
        uint16 GetMaxCount();

        /*
        *    @Description: 得到倒序的邮件列表
        */
        CUserMail* GetMailBySort(uint16 u2Index);

        /*
        *    @Description: 得到当前的列表数据
        */
        CUserMail* GetMail(uint16 u2Index);

private:
        /*
        *    @Description: 根据相对位置换算成数组绝对下标
        */
        uint16 GetListPos(uint16 u2Index);

private:
        CUserMail* m_pMailList;
        uint16   m_u2MaxCount;
        uint16   m_u2CurrIndex;
        uint16   m_u2CurrCount;
        bool       m_blTurnover;
};

#endif

好了,整个代码差不多就是这样啦。
你可以下载本用例的全部代码。



页: [1]
查看完整版本: 如何设计游戏中的道具功能(三)