如何设计游戏中的道具功能(三)
对于道具的交换,我原则上是鼓励使用另一个容器去实现。所有要交易的道具可以放在交易盒子中进行交换。
#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]