道具、实体堆叠

道具x99的实现

道具堆叠

常用变量

一个道具类通常会有三个核心字段

1
2
3
4
5
class Item {
    count: number;            // 数量
    uid: Uid;    // 道具唯一id,类型不一定是数字或字符串
    itemId: ItemId;            // 道具id
}

根据itemId可以从配置找到堆叠的最大数量maxOverlap


需要一个容器来维护所有道具,我们定义一个背包类,里面有个变量维护堆叠

1
2
3
4
class BagBase {
    // 用于维护堆叠的变量
    itemPool: Map<ItemId, Map<Uid, number>>;
}

实现

添加道具

添加道具的时候,首先是要判断当前是否存在堆叠(道具数量为一时也算是一个堆叠)。

  • 如果没有堆叠,需要再次判断背包是否有空格。如果满足条件则new一个道具对象,将道具信息维护在背包类BagBaseitemPool中。
  • 如果存在堆叠,则会有以下情况:
    • 新增道具数量 + 原有道具数量 > 堆叠上限。因为原有的道具堆叠可能存在多个,因此需要索引道具id找到对应的堆叠,然后遍历找到未满的堆叠,然后将新增数量填充到未满的堆叠上面。如果在填满旧堆叠之后,新增数量仍大于0,需要创建新的道具对象,此时需要判断背包各自是否充足。
    • 新增道具数量 + 原有道具数量 <= 堆叠上限。这时候就可以直接修改Item对象的count字段,以及修改背包类BagBaseitemPool的数量。返回成功

删除道具

具体要看策划要求是从数量最少的堆叠开始删还是不做要求。

itemPool中找到一个道具对象,删除对应数量即可

实体堆叠

类似装备,符文等

实体堆叠添加、删除、维护和道具堆叠一样,不过可能会出现穿戴和卸下的情况

分离

分离是指从原本的堆叠中分离出一个新的实体对象obj,即类型相同,uid不同。用于区分新的实体和堆叠实体,防止影响原本的堆叠。

穿戴

当实体堆叠数量时最后一个的时候,需要分离的时候可以new一个新的对象,直接沿用堆叠中的last one。同时要注意在穿戴最后一个实体的时候,如果当前模块存在背包容量的设定,需要给当前背包腾出一个空格。

卸下

当实体卸下的时候,如果这个实体是背包中的第一个堆叠(背包中原本没有这种类型的堆叠),可以沿用这个实体类型(可以少new一次对象)。同时要注意背包格子是否允许创建堆叠。

升级、升阶等

同样是先分离,后操作。根据策划的需求可以维护不同的堆叠,即维护itemPool.

假如策划需要同实体类型,同等级的实体叠在一起,这时候itemPool旧需要创建多一层映射

1
itemPool: Map<ItemId, Map<Level, Map<Uid, number>>>;
Built with Hugo
Theme Stack designed by Jimmy