当前位置: 首页 > news >正文

CreatorPrimer|从zIndex开始

1. 引言

从Cocos2d-x/lua/js过来的老鸟们肯定发现了,在CocosCreator属性检查器中Node节点竟然没有zIndex属性。

可就因为这一点,UI节点的遮挡关系控制不便,经常让策划、测试、甚至老板经常找程序员麻烦。不知道大家有没想过要用编辑器去控制zIndex呢,请思考一下?我发现自己是用了CocosCreator快一年才去想到这个问题的。

2. zIndex的编辑器实现

那怎么去做呢,请看下面代码:

/**
*SetZIndex.js 控制组件
**/
cc.Class({
    extends: cc.Component,
    //编辑器属性定义
    properties: {
        zIndex: 0
    },
    onLoad () {
        this.node.zIndex = this.zIndex;
    }
});
复制代码

代码非常简单,将这个组件脚本挂载到任意节点上,通过zIndex属性就能控制节点的zIndex了。

但上面的代码还是有点小问题,不知道你看出来没有?

3. 问题

上面的代码有两个小问题,不仔细还不易被发现:

  1. zIndex:0 这样的属性定义zIndex是一个浮点数类型,你可以在编辑器设置0.1这样的值。运行在浏览器或H5环境没什么问题,但跑在原生环境zIndex对应的是cocos2d-x中的Node::setLocalZOrder(int localZOrder)函数,它的参数类型是整型。

  2. 这个组件只在onLoad时设置了节点的zIndex,如果运行过程中,给这个组件的zIndex属性赋值没有任何作用,并且在编辑器中,你设置zIndex也看不到节点层级的变化。

4. 改进

知道问题了就好办了,看下面代码:

/**
*SetZIndex.js 控制组件
**/
cc.Class({
    extends: cc.Component,
    //编辑器属性定义
    properties: {
        zIndex: {
            type: cc.Integer, //使用整型定义
            default: 0,
            //使用notify函数监听属性变化
            notify(oldValue) {
                //减少无效赋值
                if (oldValue === this.zIndex) {
                    return;
                }
                this.node.zIndex = this.zIndex;
            }
        }
    },
    onLoad () {
        this.node.zIndex = this.zIndex;
    }
});
复制代码

使用一个对象来定义zIndex属性,同时监听zIndex的修改,问题解决。

5. 小结

SetZIndex组件它不依赖任何其它组件和节点,可以挂载任意节点,它是一个通用的组件。不要小看了这个组件的设计,它蕴涵了CocosCreator的组件编程模式和思想。

你有使用类似SetZIndex组件的模式编写可复用的组件代码?欢迎留言交流。


关注「奎特尔星球」微信公众号,我们一起成长。

转载于:https://juejin.im/post/5b7584dde51d45556f41c2e9

相关文章:

  • (day6) 319. 灯泡开关
  • python其他模块安装
  • jQuery普通绑定事件和on委托事件对比
  • 微信小程序实例:分享给一个人还是分享到群的判断代码
  • 线程与进程的区别(基础面试题)
  • C#将控件置于最顶层和最底层
  • 带有去重以及字符串拼接、日期拼接、字段相除的SQL语句
  • 面试题收集最新
  • js 数组排序
  • Andrew Ng-ML-第十九章-应用举例:照片OCR(光学字符识别)
  • 泛型的理解(1)
  • 使用阿里云接口进行手机号(三网)实名认证
  • unique()函数使用
  • Install MongoDB to Ubuntu 18.04
  • SpringCloud Gateway入门
  • [nginx文档翻译系列] 控制nginx
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • CEF与代理
  • CentOS6 编译安装 redis-3.2.3
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Linux Process Manage
  • 阿里云购买磁盘后挂载
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 构建工具 - 收藏集 - 掘金
  • 解析带emoji和链接的聊天系统消息
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 阿里云ACE认证之理解CDN技术
  • ​iOS安全加固方法及实现
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (六)激光线扫描-三维重建
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)socket Aio demo
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .Net Winform开发笔记(一)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET命令行(CLI)常用命令
  • .考试倒计时43天!来提分啦!
  • ??eclipse的安装配置问题!??
  • [20161214]如何确定dbid.txt
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [Android] Android ActivityManager
  • [C/C++]数据结构 堆的详解