角色背包设计上包括多种类型的背包:仓库背包、装备背包、主背包、镶嵌背包、洗练背包等。
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)