这里我们要设计一个前端红点管理器:
红点管理的实现原理基本就是是一颗树的实现原理,在游戏开始时初始化红点的关联状态,游戏中我们通过对红点树的叶子节点状态进行更新,从而更新父节点的状态。这里我们为了让叶子节点能够关联多个父节点,使用图的方法去实现这个前端红点,并且一个红点key也可以同时注册关联多个红点ui。
在这个红点管理器中我们加入了模块开启的判断,可以通过功能模块的开启状态来改变前端红点的状态。
下面就让我们上代码吧:
import {
util } from "../util";
import {
ModuleId } from "../enum";
export default class RedMgr {
private _toChildrenMap = {
};//向上关联的map
private _toParentMap = {
};//向下关联的map
private _redState = {
};//存储红点状态{key state}
private _redKeyObj = {
};//存储这个对象的所有红点 数组
private _redObjKey = {
};//存储红点关联的所有红点对象 数组
private _red2Mid = {
};//红点关联模块
private _mid2Red = {
};//模块关联红点
//枝干节点则由子节点更新红点状态
private _reallyRed = [];//叶子节点模块未开启时的红点状态
public init(): void {
let map = {
};
let midMap = {
};
//==================【测试红点关联】============================
midMap[ModuleId.Competion] = "V_ARENA_ROLE";//需要注册模块与红点的关联状态和红点的关联数
map["V_ARENA_FILED"] = ["V_ARENA_ROLE"];
map["V_ARENA_ROLE"] = ["V_ARENA_COMPETION"];
map["V_ARENA_COMPETION"] = ["V_ARENA_MATCH"];
//这里我们只需要更新叶子节点状态就可以更新这个红点树
this._mid2Red = midMap;//把红点与模块的正反向关联注册
for (let mid in midMap) {
this._red2Mid[midMap[mid]] = mid;
}
this._toChildrenMap = map;//把父子节点的正反向关联注册
this._toParentMap