cocos creator主程入门教程(二)—— 弹窗管理_cocos 弹窗设计 同时可以存在几个-程序员宅基地

技术标签: cocoscreator  

我们已经知道怎样制作、加载、显示界面。但cocos没有提供一个弹窗管理模块,对于一个多人合作的项目,没有统一的管理,界面层级容易混乱。作为主程,在项目开始就应该处理好这些问题,将弹窗划分为不同的层次,不同类型的信息显示在不同的层中。下面将讲解怎样设计弹窗堆栈。

一般地,从下向上,我会将弹窗划分为以下层:

1)内容层,展示游戏相关的信息界面。

2)tips层,显示提示性信息界面,例如获得物品的浮窗、网络异常的提示。

3)新手引导层,主要显示新手引导的手指、新手提示文本框等。

4)alert层,主要显示系统级的信息、错误,例如断网、被踢下线。

5)loading层,显示加载动画。

具体怎样实现?弹窗通常有统一的动画,所以定义一个界面逻辑的基类ViewCtrl,定义一些通用的属性和方法。每个层中可能同时存在多个界面,我把每个层做成组ViewGroup。再写一个类PopupCtrl,对界面分层,并对外提供编程接口。

先来说说ViewCtrl这个类,继承自cc.Component,这样我们写的ViewCtrl子类就可以挂载到prefab的节点上。定义两个boolean属性:hasMask、touchOutClose,用于控制是否有灰色半透明遮罩,和是否点击弹窗外关闭。后面在介绍ViewGroup时会介绍怎样实现这两个功能。

cc.Component本身有onEnable,onDisable两个生命周期方法,但我们希望同屏不出现太多弹窗,弹出新弹窗时隐藏上一个弹窗,这会导致这两个方法频繁调用。对于打开界面时的刷新,在界面放到堆栈时回调更合适。同理对重用的界面的重置,在界面移出堆栈时回调重置。可以在ViewCtrl定义onAddToStack和onRemoveFromStack两个生命周期方法,在ViewGroup里在合适的时机触发,后面会介绍。再添加两个方法,onPlayShowAni,onPlayHideAni,在这里可以实现统一的弹窗动画。子类的特殊显示和关闭动画由子类重写这两个方法实现。这两个方法也由ViewGroup在合适的时机触发。


const {ccclass, property} = cc._decorator;

@ccclass
export default class ViewCtrl extends cc.Component {

    @property
    hasMask: boolean = true;

    @property
    touchOutClose: boolean = false;

    public onAddToStack(): void {
     }

     public onRemoveFromStack(): void {
     }

     public onPlayShowAni(): void {
     }

     public onPlayHideAni(): void {
     }
}

接下来是ViewGroup这个类,它代表一个弹窗层,也继承自cc.Component,它的node可以添加到PopupCtrl的node上从而展示这个弹窗层。它应该有自己的maskLayer、blockLayer,用于显示灰色半透明遮罩,和屏蔽下层界面的触屏事件。当然,像tips层,我们不希望屏蔽下层界面的触屏事件,可以提供接口来控制这两个layer是否生效。

ViewGroup最重要的作用是管理一层的弹窗。所以它应该有一个Array<ViewCtrl>类型的viewArr属性。基本的操作包括:


export default class ViewGroup extends cc.Component {

     private maskLayer: cc.Node = null;
     private blockLayer: cc.Node = null;
     private viewArr: Array<ViewCtrl> = [];

     public pushView(ctrl: ViewCtrl, hideOld: boolean): void {
     }

     public popView(cleanup: boolean): void {
     }

     public insertView(ctrl: ViewCtrl): void {
     }

     public removeView(ctrl: ViewCtrl): void {
     }

     public pushViews(ctrls: Array<ViewCtrl>, hideOld: boolean): void {
     }

     public removeAllViews(cleanup: boolean): void {
     }

     public lastView(): ViewCtrl {
     }

     public getViewByName(name: string): ViewCtrl {
     }

     public getViewCount(): number {
     }

     public isEmpty(): boolean {
     }
}

其中pushView、insertView、pushViews会将对应ViewCtrl放入viewArr,并触发ViewCtrl.onAddToStack。通过ViewGroup.node.addChild将ViewCtrl.node添加为子节点将对应界面显示出来。具体是否要添加到界面要看是否在hideOld的界面下面。pushViews主要是为自动弹窗设计的,例如登录后自动显示公告、签到等,关闭一个自动打开下一个。

popView、removeView、removeAllViews通过ViewCtrl.node.removeFromParent将ViewCtrl.node移出界面,同时将ViewCtrl移出viewArr,并触发ViewCtrl.onRemoveFromStack。pushView、popView还会触发onPlayShowAni,onPlayHideAni这两个生命周期方法。

现在来说说PopupCtrl这个类,它也继承自cc.Component,可以直接挂载到prefab的节点上,在介绍游戏入口时我们给Canvas添加了popupLayer子节点,通过添加组件将PopupCtrl挂上去。PopupCtrl要实现分层,它有Array<ViewGroup>类型的groupArr属性。在onLoaded生命周期方法里按弹窗层顺序,通过PopupCtrl.addChild添加对应的弹窗层。PopupCtrl提供跟ViewGroup类似的接口,不同的是PopupCtrl的pushView、insertView、pushViews提供layer参数,用于指定弹窗添加的层。

enum PopupLayer {
    CONTENT = 0,
    TIPS,
    GUIDE,
    ALERT,
    LOADING
}

弹窗管理先说到这里,下一篇我们将介绍下怎样做资源加载管理。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/houjia159/article/details/108420017

智能推荐

Windows的torch + Cuda + cuDNN_cuda必须安装在c盘吗-程序员宅基地

文章浏览阅读2k次。windows下的pytorch-gpu安装_cuda必须安装在c盘吗

java/jsp/ssm酒店客房管理系统的设计与实现【2024年毕设】-程序员宅基地

文章浏览阅读38次。springboot基于小程序的临沂大学非机动车车辆管理系统。开发软件:eclipse/myeclipse/idea。springboot基于微信小程序的线下剧本杀管理系统。springboot微信小程序的代驾系统的设计与实现。springboot一品萫茶馆管理系统的设计与实现。springboot交通违章处理系统的设计与实现。springboot洛阳地铁信息查询与管理系统。ssm基于微信小程序的多多母婴购物商城的设计与。springboot企业客户信息反馈平台。springboot校园篮球联赛管理系统。

【操作系统-Windows】使用“任务计划程序”延时启动程序_任务计划延时启动程序-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏16次。第一步、打开任务方式一、控制面板中打开控制面板 &gt;所有控制面板项 &gt; 管理工具 ,任务计划程序方式二、运行中打开【Win+R】输入taskschd.msctaskschd.msc第二步、创建任务选中并右击【任务计划程序库】,点击【新文件夹】,命名为【Rsszy】。点击【操作】-【创建基本任务…】输入【名称】和【描述】,点击【下一步..._任务计划延时启动程序

【信息安全】数据安全与信息安全_信息安全的指标有什么-程序员宅基地

文章浏览阅读5.2k次,点赞2次,收藏26次。数据安全与信息安全的关系,是包含的关系,信息安全包括了数据安全与网络安全,数据安全主要是数据使用的安全。_信息安全的指标有什么

赛道A:“58 到家”家政服务订单分配问题_家政服务分配数学建模-程序员宅基地

文章浏览阅读828次。2022 年MathorCup 高校数学建模挑战赛——大数据竞赛赛道A:“58 到家”家政服务订单分配问题“58 到家”是“58 同城”旗下高品质、高效率的上门家政服务平台,平台向用户提供家政保洁、保姆、月嫂、搬家、维修等众多生活领域的服务。在家政保洁场景中,用户在平台下单购买服务后,平台会将订单分配给一个保洁阿姨,阿姨接到订单后按照用户指定的服务时间上门,进行保洁服务。_家政服务分配数学建模

如何为Java面试准备项目经验_java项目经验面试-程序员宅基地

文章浏览阅读2.9k次,点赞12次,收藏75次。如何为Java面试准备项目经验_java项目经验面试

随便推点

图的遍历算法:DFS、BFS-程序员宅基地

文章浏览阅读228次。在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS)。DFS(深度优先搜索)算法Depth-First-Search深度优先算法,是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。 这一过程一直进行到已发现从..._写出不同搜索算法访问上图所有节点的顺序

vue项目中el-tree 支持横向和纵向滚动条设置_eltree横向滚动条-程序员宅基地

文章浏览阅读1.9w次,点赞13次,收藏37次。vue项目中el-tree 支持横向和纵向滚动条设置,如下所示。①纵向滚动条容易设置,只需要在el-tree组件中设置height即可②横向滚动条稍微复杂,如下代码<template> <div class="tree-scroll"> <el-input style="width: 180px;margin-top: 10px" ..._eltree横向滚动条

基于Android的个人记账助手APP的设计与实现开题报告_记账类app的国内外研究现状-程序员宅基地

文章浏览阅读290次。1980年代开始,人们就把图像的处理工作逐步的交给微型计算机去完成,伴随着时代的发展集成电路的成本在一定程度上有所下降,由于集成电路的发展微型计算机处理图像的速度也有一定的提升。由于逐渐增多的图像信息,在二十世纪九十年代,计算机处理图像的速度任然有待提升,为了结局这一问题,科研工作者针对不同领域的不同特点,进行了详细的分类归纳总结。比如微信朋友圈,便产生大量图像数据的源泉之一,由于网络信息受到的限制因素(地域、方言)较少,所以在某些领域和应用场合,图片传递信息的方式在某些领域正在逐步替代文字。_记账类app的国内外研究现状

springboot校园二手交易平台的设计与实现 毕业设计 附源码260839_基于springboot二手市场论文-程序员宅基地

文章浏览阅读136次。用户管理模块:(1)用户注册登录:用户注册为会员并登录校园二手交易平台;用户对个人信息的增删改查,比如个人资料,密码修改。(2)用户查看商品:用户进行商品信息的阅览,通过发现喜欢的商品后可以购买+评论+收藏。(3)校园资讯:用户进行资讯的阅览,查看管理者发布的校园资讯信息。(4)留言板:用户在留言板这一菜单下对用户提交的查看、同时也可以发布、评论。(5)商品购买:用户对喜欢的商品可以加购,在购物车里面,当用户确定提交完毕后,将其提交给服务器后台系统,并生成订单。(6)我的订单:用户在提交订单后,_基于springboot二手市场论文

Root Cause org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean wi_root cause org.springframework.beans.factory.unsat-程序员宅基地

文章浏览阅读81次。字面意思是找不到你的某个名叫XXX的文件,但是,在确认了该bean已经在spring中被定义后依然出错,就很头疼了。后来才发现,因为我做的项目是SSM整合的联系,在web.xml中配置的spring.xml文件并不完整将web.xml中的配置信息修改正确后终于成功!..._root cause org.springframework.beans.factory.unsatisfieddependencyexception:

如何在WebGL中画图-程序员宅基地

文章浏览阅读597次。Original article: https://aralroca.com/blog/how-to-draw-gears-in-webgl 原始文章: https : //aralroca.com/blog/how-to-draw-gears-in-webgl In this article we continue what we started in “First steps in WebG..._webgl绘制图片

推荐文章

热门文章

相关标签