【包教包会】CocosCreator3.x框架——节点扩展(仿2.x风格直接设置属性、渐变色、振动、实时销毁)

对CocosCreator3.x节点Node进行扩展,简化书写,提升性能。

演示Demo:https://gitee.com/szrpf/NodeEx

image

一、需求整理
相信很多从2.x转过来的同学对3.x的节点属性调整会比较别扭,例如:

2.x可以直接写:
this.node.x++;
this.node.width = 100;
this.node.anchorX = 1;
tween(this.node).to(1,{x:100,scaleX:3}).start();

3.x必须这么写:
this.node.setPosition(this.node.position.x+1,this.node.position.y);
let uiTrans = this.node.getComponent(UITransform);
uiTrans.width = 100;
uiTrans.anchorX = 1;
tween(this.node).to(1,{position:cc.v3(this.node.position.x+100,this.node.position.y)}).start();
tween(uiTrans).to(1,{width:100,anchor:cc.v2(1,uiTrans.anchorY)}).start();

image

二、构思方案
分析引擎源码,我猜官方是想合并事件消息才这么处理的

拿setPosition举例:
2.x
this.node.x = 3;this.node.y = 10;this.node.z = 0;
这样会emit3个位置变更事件
3.x
直接一句setPosition就设置3个坐标,只emit一个事件
但问题是,如果只设置x或y,那么setPosition也要象征性的把另一个捎带上,属实有点der~

优化思路
如果this.node.x只变更位置,不emit事件是不是就不存在以上问题了?
不但写起来省事,效率还更高(少了emit事件)
再扩展一下把2.x的scaleX、scaleY、width、height、anchorX,anchorY统统按照以上思路重写
那么UITransform的属性和node的属性可以在一个tween处理了

三、验证可行性
Object.defineProperties重定义属性

image

照抄引擎setPosition相关的源码,去掉emit事件发送的代码

image

发现".x"报错,说明底层并没有给Node设置x这个属性,运行一下看看。

BearMove

节点确实移动了,符合预期。

image

至于报错问题,编写一个.d.ts文件声明一下就可以了。
至此,报错问题也顺利解决,而且在任何脚本里,节点对象按.都能出现x的语法提示

其余方法如法炮制,是不是2.x熟悉的感觉又回来了。

image

这里有2个坑:
1、扩展width、height、anchorX、anchorY的时候提示重定义

image

应该是引擎已经将这4个属性声明为废弃了
退而求其次,只能在后面加个后缀UT(代表UITransform)
希望官方能解除这个废弃声明

2、扩展color的时候,发现虽然直接node.color = cc.color(xxxx)有效
但是tween里面渐变color属性会闪,这是因为:
3.x的tween直接将color作为_val进行数值渐变,而非对r、g、b、a分别渐变
这个要重写tween来解决,不属于今天的讨论范围。

四、其他扩展函数
既然扩展了Node,顺便把以前写的节点函数也丢进来,分别是:
1、返回所有名称为name的子节点
findChildren(name: string, isStartWith: boolean = false): cc.Node[]
例如:this.node.findChildren(‘Title’); //返回所有名称为’Title’的子节点
this.node.findChildren(‘Tit’,true); //返回所有名称以’Tit’开头的子节点

2、在不改变世界坐标的前提下,设置锚点
setAnchor: (point: Vec2 | number, y?: number);

3、节点颜色time秒内渐变到color色值
setColor: (time: number, color?: Color);
例如:this.node.setColor(3,cc.color(255,0,0)); //节点颜色3秒内渐变到255,0,0
this.node.setColor(2); //节点颜色2秒内复原

setColor

注意:所有子节点也会跟着一起变色

4、节点震动repeat次,振幅amplitude,频率frequency
shake: (repeat: number, amplitude?: Vec3, frequency?: number);
例如:
this.node.shake(7,cc.v3(100,0,0),0.1); //节点振动7次,水平振幅100逐次递减,频率0.1秒
this.node.shake(-1,cc.v3(0,-50,0),0.5); //节点振动无限次,垂直振幅-50逐次递减,频率0.5秒
this.node.shake(0); //节点立即停止振动

shake

5、实时销毁
this.node.destroyRealtime(); //销毁节点,并立即从层级树中移除
this.node.destroyChildrenRealtime(); //销毁所有子节点,并立即从层级树中移除子节点

五、结束语

NodeEx扩展的优势:
1、简化了书写
对于大量做项目的实战选手来说,这个很重要

2、提高了性能
大部分节点属性的emit事件是没必要的,NodeEx直接移除了emit,提高性能
如果需要监听事件,再用setPosition、setScale这些函数就行了

3、降低了2.x转型3.x的难度
很多代码都不用改了

演示Demo:https://gitee.com/szrpf/NodeEx

如何导入自己项目:
1、将Demo中NodeEx.ts复制到自己项目assets目录下

2、将Demo中NodeEx.d.ts复制到自己项目根目录下(与assets同级)

3、任意Node对象,按 . 就可以出现语法提示,可以像2.x一样调用

image

技术基本功决定下限
设计架构能力决定上限
不想面临35岁裁员危机
就多多锻炼框架设计能力吧
加油✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️

Gitee地址:水煮肉片饭 (szrpf) - Gitee.com

EMail地址:27185709@qq.com

推荐链接:

1、【包教包会】CocosCreator3.x框架——资源管理(秒Loading、大厅子游戏、同步加载、极简对象池、多语言)

2、【包教包会】CocosCreator Assembler经典案例第一期——2D实现3D透视翻转(附Demo源码)

3、【包教包会】对CocosCreator富文本RichText进行全面优化

4、【包教包会】对CocosCreator拖尾组件MotionStreak做了全面优化

5、权重随机算法,解决游戏中一切可控随机(刷怪、掉宝、转盘、抽卡等等)

mi

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习本课程至少节省3-7天时间!荐语:3.0的版本我个人觉得非常好用!使用下来开发效率明显提升了不少    但是!    3.0对于2.x的版本来言改变较大    近日有开发者们在群里有发出抱怨    “资料实在太少了”,“有没有例子呀???”          甚至出现2.0项目移植到3.0过程中,出现卡问题的情况     主要原因是:对新的代码架构不熟悉,老接口不知道如何转换        从而浪费大量了的时间摸索,导致了项目进度没有确定性        为此制作了这期课程和项目     对于有经验的开发者,只需要阅读源码即可快速过渡到3.0     对于新手用户也有详细的视频教程    学习本课程至少节省3-7天时间! 课程目录01搭建开发环境02 搭建游戏场景03 控制猫移动04生成无缝地图05生成障碍物和鱼06 碰撞检测+动画编辑器07 UI模块09 动态加载资源-复活页010 场景切换010 声音模块+数据存取011 场景设置+课程总结 知识点包括开发环境的搭建和断点,通过VScode进行编译和运行资源导入和导出3d编辑器的使用模型材质的设置和优化动画系统的使用(动画编辑器+配置模型动画)预制体的制作和使用ui制作和ui适配碰撞器                       游戏编码设计和架构代码动态加载资源,切换场景数据存取声音模块ui管理类单例模式对象池理解脚本生命周期碰撞检测 以上是 学习任何开发引擎都要经过步骤和思想课程的设计是一款已经上线并且的盈利的项目把游戏工业化中最常用的功能整理,并且精简出来之所以这样设计,是为了把教学和商业实战结合起来把学习的时间和成本降到最低
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值