focus on linux, c/c++, lua

游戏中的容器设计

经过几天的思考,我开始动手写游戏容器这块,我设计的初衷就是KISS。基本上把容器的类别定格为:背包,仓库,快捷栏,邮箱。多人共享的容器被我砍掉了,目前还无此需求。我做的方向就是,把容器做成部件,每个部件仅有一个admin。

容器中的物品类:
struct IGoods : public IThing
{
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual int GetGoodsID() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual void SetBind(char cBind) = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual char GetBind() = 0;
}
;

我做了这样一个设计,物品全部由资源管理器生成,背包中的物品单独做扩展,如下:
struct IContainerGoods
{
    
/*
     *    @Param: bReleaseGoods为false,只删除背包物品,为true,真实的IGoods*
                也要删除
     *    @Return:
     *    @Description: NULL
     
*/

    
virtual void Release(bool bReleaseGoods = true= 0;
    
/*
     *    @Param: 获得物品ID
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual int GetGoodsID() = 0;    
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 获取在容器中的位置
     
*/

    
virtual int GetLocation() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 获取所在的容器
     
*/

    
virtual IContainer* GetContainer() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 获取该物品的真实物品指针
     
*/

    
virtual IGoods* GetGoods() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 锁定该物品
     
*/

    
virtual bool LockGoods() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 解锁该物品
     
*/

    
virtual bool UnlockGoods() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 是否被锁定
     
*/

    
virtual bool IsLocked() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual int GetCount() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual void SetCount(int nCnt) = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual char GetBind() = 0;
}
;

背包的接口,提供最基本的几个功能,消息格式我是这样设计的:
1,玩家第一次进入游戏后,服务器把整个背包内容发给玩家更新
2,玩家(服务器)对某个格子的物品做更新时,单独对该格子做消息更新,这样就会在玩家频繁操作背包的时候,同一格式(注意是格式)的消息
      会频繁发送多条,当然每个消息内容是不一样的。
有个问题待思考:无聊的玩家在背包中,把两个物品频繁做调换位置,服务器肯定也要同时更新的,那么服务器是否让客户端做cold down??
struct IContainer : public IThingPart
{
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 销毁容器,彻底销毁容器内的物品
     
*/

    
virtual void Release() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 获得容器ID
     
*/

    
virtual int GetContainerID() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 获得容器尺寸
     
*/

    
virtual int GetSize() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 获取容器类型
     
*/

    
virtual char GetType() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 判断容器是否是空
     
*/

    
virtual bool IsEmpty() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 获取一个空的位置,为-1时表示无空位置
     
*/

    
virtual int GetOneFreeLocation() = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 根据位置获取容器物品
     
*/

    
virtual IContainerGoods* GetGoodsByLoc(uint nLocation) = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 根据GoodsID获取容器物品
     
*/

    
virtual IContainerGoods* GetGoodsByID(int nGoodsID) = 0;
    
/*
    *    @Param: NULL
    *    @Return: NULL
    *    @Description: NULL
    
*/

    
virtual int GetGoodsCount(int nGoodsID, char cBind) = 0;
    
/*
    *    @Param: NULL
    *    @Return: NULL
    *    @Description: 能否向容器中添加若干个物品
    
*/

    
virtual bool CanAddGoods(int nGoodsID, int nCount, char cBind = 0= 0;
    
/*
     *    @Param: uDstContainerID:把物品移向的容器ID
     *    @Return: NULL
     *    @Description: NULL
     
*/

    
virtual bool CanRemoveGoods(int nPID, IContainerGoods* pGoods) = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 向容器的固定位置放置物品
     
*/

    
virtual bool AddGoods(int nPID, IContainerGoods* pGoods) = 0;
    
/*
    *    @Param: bUpdateClient:是否发消息通知客户端 bPile:是否堆叠
    *    @Return: 成功添加的物品数量
    *    @Description: NULL
    
*/

    
virtual bool AddGoods(int nPID, int nGoodsID, int nCount, 
        
bool bUpdateClient = truechar cBind = 0= 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 从容器中移除物品
     
*/

    
virtual bool RemoveGoods(int nPID, IContainerGoods* pGoods) = 0;
    
/*
    *    @Param: bUpdateClient:是否发消息通知客户端 bPile:是否堆叠
    *    @Return: 成功删除的物品数量
    *    @Description: NULL
    
*/

    
virtual bool RemoveGoods(int nPID, int nGoodsID, int nCount, 
        
bool bUpdateClient = truechar cBind = 0= 0;    
    
/*
    *    @Param: nPID:玩家角色ID nCount:分割出去的数量 pContainer:分割出去的目的容器为
                NULL时即为本容器  nDstPos:为分割出去的目的位置,为-1为自动寻找
                的第一
    *    @Return: 分割后的物品指针
    *    @Description: NULL
    
*/

    
virtual IContainerGoods* SplitGoods(int nPID, IContainerGoods* pSrcGoods, int nCount, 
        IContainer
* pContainer = NULL, int nDstPos = -1= 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 容器的物品位置交换操作
     
*/

    
virtual bool SwapGoods(int nPID, IContainerGoods* pSrcGoods, 
        IContainer
* pContainer, IContainerGoods* pDstGoods) = 0;
    
/*
     *    @Param: NULL
     *    @Return: NULL
     *    @Description: 判断该容器是否有效
     
*/

    
virtual bool IsValid() = 0;
}
;

posted on 2010-05-01 09:44 zuhd 阅读(1661) 评论(2)  编辑 收藏 引用 所属分类: server

评论

# re: 游戏中的容器设计 2010-05-02 10:56 expter

对于物品背包一般采用容器这种设计。而你说的物品移动都会与服务器验证应该是必须得...。  回复  更多评论   

# re: 游戏中的容器设计 2010-05-03 09:15 zuhd

@expter
是必须的,我思考的是无聊的玩家频繁交换两个格子内的物品,不做增减操作,是否有必要给个cold down?  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理