游戏开发中的红点提示

前言

当我们的游戏开发进度接近尾声的时候,不仅要做教学引导的事情,还有一件对于中大型游戏来说非常重要的事情就是红点提示。它有别于教学引导,但也是引导的作用,指引性更明确,而且不会影响UI外观和体验的流畅。

开始

  1. 通过配置两张数据表来记录红点提示的相关数据。


    image.png

    提示信息表,仅表明都有哪些提示类型。


    image.png

    每个红点提示使用的界面及控件名称。
    第二列为属于哪个提示,所以声明为索引类型。比如1来说,就是由GridLayerListViewTest的buttonBack和ItemView的bg两个按钮组成,也就是当有新道具添加时,GridLayerListViewTest的buttonBack和ItemView两个控件都应该有红点。

    第三列和第四列声明为类名和控件名
    第五列标识控件是否为道具,因为道具和普通控件的记录方式不同。

  2. 读取配置数据,初始化信息。
    init() {
        let redtipData: XlsxData = ModuleManager.dataManager.get(RedTipItemModel.CLASS_NAME)
        redtipData.forEach((key, data) => {
            let item = new RedTipItemModel()
            item.init(key, data)
            this.redtipMap.set(key, item)
        })

        let redtipStep: XlsxData = ModuleManager.dataManager.get(RedTipStepModel.CLASS_NAME)
        let indexs = redtipStep.getIndex(Redtip_step_dataEnum.tipID);
        for (const key in indexs) {
            if (indexs.hasOwnProperty(key)) {
                const list = indexs[key];
                for (let index = 0; index < list.length; index++) {
                    const stepID = list[index];
                    let step = new RedTipStepModel()
                    step.init(stepID, redtipStep.getRowData(stepID))
                    this.redtipMap.get(step.getTipID()).addStep(step)
                    // if (index == 0) {
                    let className = step.getClassName();
                    let classMap = this.classNameMap.get(className)
                    if (!classMap) {
                        classMap = []
                        this.classNameMap.set(className, classMap)
                    }
                    classMap.push(step.getTipID())
                }
            }
        }

    }

初始化函数中主要做了两件事情:
一是 产生提示所对应的界面和控件数据。


image.png

二是 产生界面对应的提示id信息。主要是为了快速判定某个界面是否存在某个提示


image.png
  1. 当获得新物品时调用添加函数


    image.png

添加函数也是做了两件事情
一是排重:记录哪些正在进行中的提示,如果已经存在将不再添加。


image.png

二是更新记录数据并通知界面处理红点操作。


image.png
  1. 当一个新物品被点击时,移除红点提示


    image.png

    此方法与添加提示的方法是相对的。也做了更新记录数据和通知ui的事情。

  2. 在添加和移除时更新记录的数据

    /**
     * 
     * @param eventName 事件名称
     * @param step 哪个控件
     * @param id 道具id
     */
    private updateRecordCount(eventName: string, step: RedTipStepModel, id: number = -1) {
        let className = step.getClassName();
        let widgetName = step.getWidgetName();
        let tipID = step.getTipID();
        let widgetMap = this.getWidgetMap(className, widgetName)

        if (eventName == RedTipEventName.ADD_ITEM_TIP) {//添加
            if (!step.isItem()) {//如果控件不是道具,只是界面上的按钮
                let list = widgetMap.get(tipID)
                if (!list) {
                    list = []
                    widgetMap.set(tipID, list)
                }
                list.push(id)
                if (list.length == 1) {
                    this.emit(eventName + className, step, id)
                }
            } else {//如果是道具
                let list = widgetMap.get(id)
                if (!list) {
                    list = []
                    widgetMap.set(id, list)
                }
                list.push(tipID)
                if (list.length == 1) {
                    this.emit(eventName + className, step, id)
                }
            }

        } else {//移除
            if (!step.isItem()) {
                let list = widgetMap.get(tipID)
                if (list.length > 0) {
                    list.shift()
                    if (this.isWidgetMapNull(widgetMap)) {
                        this.emit(eventName + className, step, id)
                    }
                }
            } else {
                let list = widgetMap.get(id)
                let index = list.indexOf(tipID)
                if (index >= 0) {
                    list.splice(index, 1)
                    if (list.length <= 0) {
                        this.emit(eventName + className, step, id)
                    }
                }
            }

        }
    }

使用

  1. 如果是普通的控件,将WidgetRedTip托到 界面的预制体的根节点上即可。

  2. 如果是道具首先需要将ItemRedTip组件拖到道具预制体的根节点上。然后在道具中声明一个ItemRedTip类型的属性,在更新数据时调用。


    image.png
  3. 产生新道具时调用提示管理器的添加函数


    image.png
  4. 点击道具时移除提示


    image.png
  5. demo展示


    image.png

只是一个简单的demo,点击添加物品按钮,登陆按钮上会出现红点;直接点击道具红点会消失,所有道具都点过一遍后左上角按钮的红点才会消失。

注意事项

  1. 由于使用了事件通知的方式,所以需要注意监听者的数量,如果道具成百上千,而且并没有使用ListView的方式,那么最好不要使用这种通知的方式,监听者太多。
  2. 由于使用的是控件名称的方式,所以同一界面中的控件不可以重名
  3. 如果滑动层没有做分层管理,需要注意红点图片产生的dc数量。

结语

制作红点的方式很多,我见过有人把所有红点手动添加到指定的按钮上,然后再通过代码显示和隐藏。我比较懒,所以我选择动态添加红点图片。

欢迎关注公众号《微笑游戏》,浏览更多内容。

image

欢迎扫码关注公众号《微笑游戏》,浏览更多内容。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342