Update 2023.2.3
实现红点系统需要注意的点
根据笔者的经验,项目中遇到的红点需求往往有以下几个注意点,需要我们在设计与实现红点系统时,稍加考虑。
- 虽然红点依赖于UI进行显示,但是红点系统的实现不能强依赖于UI。
(如某个UI界面并没有被打开并初始化,但是玩家的数据层已经发生改变需要进行提示,此时根据路径层层向上激活,也是需要在主界面的该功能入口处,进行红点显示。)
- 红点系统中的红点项需要能够动态增删。
(如新手玩家一开始并没有解锁某个模块的全部功能,此时也不需要对该项功能进行红点管理,通过解锁时动态添加,可以让项目更合理且高效。)
- 当大量子红点发生改变时,不宜无脑逐项通知其父节点,尤其是当这些红点的父节点是同一个时,会造成无用的刷新。
(假如仓库的红点需求为,每增加一项物品,就亮起主界面的仓库红点;此时玩家打开一个巨大礼包,一下子获得了100多件物品,同帧内,每个物品都无脑通知其相同的父节点进行刷新,不是一个好做法)
作者:Laughing辣粉酱
链接:https://zhuanlan.zhihu.com/p/453516850
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
首先放上前缀树的维基百科解释:
Trie解释:
在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。
一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
在图示中,键标注在节点中,值标注在节点之下。每一个完整的英文单词对应一个特定的整数。Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的。
键不需要被显式地保存在节点中。图示中标注出完整的单词,只是为了演示 Trie 的原理。
Trie 中的键通常是字符串,但也可以是其它的结构。trie 的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列。比如,bitwise trie 中的键是一串比特,可以用于表示整数或者内存地址。
trie 树常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。
---------------------------------------------------------------------------------------------------------------------------------
红点提醒的要求是达到条件需要在按钮上显示红点 提醒玩家操作
达到条件->显示红点 这是明显的观察者模式
“观察者”模式是我们在开发的时候经常需要用到的。使用Watch.js那么我们就可以实现在“每当对象属性改变的时候,执行你的函数”。
设计思路
按钮上绑定 注册监听 何时显示何时隐藏红点
操作后更新 操作响应/材料变化 变量更新
难点:
1.功能复杂的模块是层层嵌套的关系
比如:人物页签-装备子模块-神装子模块-1号装备位上可升级
这里当1号装备位可升级时 红点的出现和消失逻辑都需要一层层向上传递
这种逻辑关系可以通过配置文件来生成代码 达到自动维护的目的
2.满足红点条件的一般有这么几类 消耗物品 角色等级 金币或钻石数目 开服日期 通关
其中消耗物品占比80% 针对这一类可再设计
我的做法是维护一张表 物品ID对应操作名称
在同步物品变化时check_item()找到对应的操作 在操作中check下一次是否满足红点显示
mibao_upskill() {
return ro.redpoints.client.mibao_upskill = Number(ro.role.mibao.check_enble_skillup(-1));
}
module ro {
export class ConstRedPoint {
public static MATERIAL3 = "client.Material3";
public static MATERIAL4 = "client.Material4";
public static MATERIAL6 = "client.Material6";
public static MATERIAL1 = "client.Material1";
public static MATERIAL5 = "client.Material5";
public static MATERIAL2 = "client.Material2";
public static EXPFUBEN1 = "client.ExpFuben1";
public static EXPFUBEN3 = "client.ExpFuben3";
public static EXPFUBEN2 = "client.ExpFuben2";
public static TOWERDAYREWARD = "client.TowerDayReward";
public static TOWERTURN = "client.TowerTurn";
public static TOWERPOINT = "client.TowerPoint";
public static DUOLICATE_MATERFUBEN = "client.duolicate_MaterFuben";
public static DUOLICATE_EXPFUBEN = "client.duolicate_ExpFuben";
public static DUOLICATE_TOWER = "client.duolicate_Tower";
public static ZHUZAO_UPLEVEL = "client.zhuzao_uplevel";
public static QIANGHUA_UPLEVEL = "client.qianghua_uplevel";
public static JINGLIAN_UPLEVEL = "client.jinglian_uplevel";
public static FORGE_CAST = "client.forge_cast";
public static FORGE_ENCHAN = "client.forge_enchan";
public static FORGE_CARD = "client.forge_card";