彻底搞懂Cocos Creator Tween

本文介绍了CocosCreator中的Tween功能,包括其作为容器对象管理执行过程,创建、添加过程(如移动到特定位置)以及API使用。还提到Tween基于Action系统实现,通过分析源码理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cocos 使用了Tween来代替原来的Action系统, 今天来给大家讲解Tween如何使用, 帮助大家掌握Tween的使用,并且对Tween有一个更深入的了解。

1: Tween到底是什么?

 Cocos Creator 里面的Tween你可以理解为是一个容器对象, 在这个容器对象里面可以存放很多的”执行过程”,当执行这个Tween的时候,会一个一个过程的触发执行。这样Tween的使用就归纳总结出3个步骤:

  (1): 创建一个Tween对象;

  (2): 往Tween里面填加一个一个的执行过程;

  (3): 执行Tween对象,引擎会一个一个的执行之前添加进来的过程。

例如:在0.5秒以内,让A物体从当前位置,移动到(100, 0)位置,代码如下

  1.  你要改变A物体位置,所以Tween的目标对象是A物体所在节点。

 var t = cc.tween(A物体对应节点); 创建了一个针对A物体节点的Tween对象。

    

  1. 定制中间执行过程, 这个过程可以是一个,也可以是多个,这里我们是要从当前位置移动到(100, 0)的位置,所以使用tween对象的to函数来指定。

t.to(时间(0.5s), 属性列表{}), 属性列表,可以填写Tween针对的目标对象实例中的任意属性, 我们这里是x, y, 所以 t.to(0.5, {x: 100, y: 0}); 这样就给目标物体创建了一个过程,0.5s之内从当前位置移动到目标位置(100, 0)。

(3) 启动执行这个tween对象: t.start();

代码如下:

2: Tween 可以添加哪些过程

Tween可以添加哪些过程,我们可以去查看一下Tween的API文档,在代码编辑器里面右键Tween对象,然后在”Go to Definition”

这样可以知道往这个Tween里面加入哪些过程。这些过程creator.d.ts里面都有,我这边就不再重复的编写,这里我就想分享一个小技巧,就是很多同学不知道props

怎么写,到底可以写哪些内容?

其实这个很简单,你只要打开target对象的类型,比如节点,cc.Node, 他有哪些属性数据成员,这里的props就可以填写哪些,不用死记硬背。

如果再执行的过程中要停止Tween的执行,可以使用Tween的Stop相关接口即可。

3: Tween的源码实现

打开cocos引擎源码actions/tween.js, 你会发现Tween其实是基于Cocos 的Action系统来实现的, Tween容器对象里面放的是一个一个的TweenAction, 这样Tween实际上是Action系统来实现的。TweenAction是Tween编写的一个Action, 这个Action继承自 cc.ActionInterval, 在update里面来根据进度修改Target对应的属性。还有一些函数调用的Tween,其实就是之前的Action里面的cc.callFunc, 如图所示:

所以看完这些以后,相信你对Tween将会有一个详细的了解了。

### Cocos Creator 中 `tween` 的 `repeat` 功能详解 在 Cocos Creator 中,`cc.tween` 提供了一种灵活的方式来创建复杂的动画序列。自 v2.0.9 版本起引入的新功能支持通过链式调用来构建动画逻辑[^1]。其中,`repeat` 是用于重复执行某个动画片段的关键方法。 #### `repeat` 方法的基本语法 以下是 `repeat` 方法的核心用法说明: - **参数**: - `times`: 表示重复次数的整数值。如果设置为 `-1` 或者省略,则表示无限次循环。 - **返回值**: 返回当前的 `Tween` 实例以便继续链式操作。 #### 示例代码展示 下面是一个简单的例子来演示如何使用 `repeat` 来实现多次重复的动作效果: ```javascript let action = cc.tween() .to(1, { position: cc.v3(200, 200) }, { easing: 'sineIn' }) .to(1, { position: cc.v3(0, 0) }, { easing: 'sineOut' }) .repeat(3); // 设置重复三次 this.node.runAction(action); ``` 上述代码定义了一个平移动画并将其重复播放三次。每次动画都会先将节点位置移动到 `(200, 200)`,然后再回到原点 `(0, 0)`。 对于无限循环的情况可以这样写: ```javascript let infiniteAction = cc.tween() .to(1, { opacity: 0 }) .to(1, { opacity: 255 }) .repeat(-1); this.node.runAction(infiniteAction); ``` 这段代码实现了节点透明度的淡入淡出效果,并且会一直持续下去直到手动停止它。 #### 关于 `call()` 函数未触发的原因分析 有时可能会遇到即使设置了 `.call()` 回调函数却未能正常运行的现象。这可能是由于某些特定条件下的错误配置所致。例如,在上面提到的一个案例中发现当存在多个连续动作时如果没有正确处理状态转换可能导致回调无法被及时唤起[^3]。 因此建议确保每个阶段之间的衔接顺畅无误,同时也要留意是否合理运用了诸如`.startWith()`, `.endWith()`之类的辅助工具来进行边界控制。 #### 总结注意事项 为了更好地利用`tween repeat`特性需要注意以下几点: - 明确指定所需重复的具体次数或者采用负数代表永不停歇; - 结合其他插件如easing调整过渡曲线让视觉呈现更加自然流畅; - 如果涉及复杂流程则考虑加入适当事件监听器以监控进展状况从而做出相应反应; 最后提醒一下关于环境准备方面的工作——务必确认所使用的编辑器版本处于最新稳定态因为不同迭代间可能存在兼容性差异[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值