游戏服务器之角色背包

角色背包设计上包括多种类型的背包:仓库背包、装备背包、主背包、镶嵌背包、洗练背包等。


1、物品格子

后端计算物品格子的目的是为了防止作弊,避免物品在背包里重叠或者超过需要的背包大小。针对背包分了很多种这情况,对于需要存储东西的类型的背包,需要后端计算格子的大小,比如仓库背包、装备背包、主背包。不需要存储物品的,实际上后端就不需要计算格子了,可以前端计算好发过来就可以,比如镶嵌背包、洗练背包。

思路:

有些游戏的物品一个物品就占掉几个格子,其他的游戏使用简单的做法就是一个物品占一个格子。

占几个格子的物品的设计一般是配置了物品的长和宽。这就有个问题:怎样后端判断物品之间不会重叠。

效率较高的是使用图的思想,使用变量的位。如一个物品如果是2*2的,那它就要占去4个位。怎么记录呢?如果是小于64个格子的背包(一页中),就使用位长64的变量(如unsigned long long) 。如果背包的格子还要大,就需要自己拓展,使用自定义的变量。

拿仓库作为例子是因为仓库的大小在所有包裹中是最大的。

设计如下:

新加入一个物品到仓库中占用的位置,是要把该位置信息(类型ItemLocation)转化为一个位置记录(StorePosCal),该位置记录重载了操作符 |=,可以方便把所有的该仓库中的某页的记录合成一个记录,然后重载了操作符&,判断的是占用的位是否有重叠。可以判断新加入的物品是否会跟仓库中该页的所有的物品。


仓库一页的最大的大小是8*13,但如果没有开启,就可能小于这个值,可能是8*x。

StorePosCal 来记录仓库的位置。(uint64 是unsigned long long.)记录的数据在StorePosCal 成员的pos1和pos2中。

仓库包裹继承包裹类(struct StorePack:public Package)。仓库包裹里的所有的物品在其成员_map中(PackItemMap _map,std::map类型)。


代码如下:

仓库位置(8 * 13)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值