cocos creator新缓动系统-cc.tween

2023-05-16

前言

一直对于cocos creator的action系统有着深深的埋怨,原因是用起来太麻烦了。习惯了Unity的Tween插件的用法,我也试着自己封装了下action系统,用起来像Tween那样,具体参照Cocos Creator 游戏开发之action缓动系统的封装,看到cocos creator 2.0.9版本的之后推出了tween,心中那是无比的欢乐啊。

关于Tween

Tween 提供了一个简单灵活的方法来创建 action。相对于 Cocos 传统的 cc.Action,cc.Tween 在创建动画上要灵活非常多:

  • 支持以链式结构的方式创建一个动画序列。
  • 支持对任意对象的任意属性进行缓动,不再局限于节点上的属性,而cc.Action 添加一个属性的支持时还需要添加一个新的 action 类型。
  • 支持与 cc.Action 混用。
  • 支持设置 Easing 或者 progress 函数。

tween源码链接:https://github.com/cocos-creator/engine/blob/26031bddd1aecdbf9bbdebe19ecaa672b1c35061/cocos2d/actions/tween.js#L179

主要函数说明

  • constructor
  • stopAll 停止所有缓动
  • stopAllByTag 停止所有指定标签的缓动
  • stopAllByTarget 停止所有指定对象的缓动
  • then 插入一个 action 或者 tween 到队列中
  • target 设置 tween 的 target
  • start 运行当前 tween
  • stop 停止当前 tween
  • tag 设置缓动的标签
  • clone 克隆当前 tween
  • union 将之前所有的 action 整合为一个 action。
  • bezierTo 按照贝塞尔路径设置目标的 position 属性。
  • bezierBy 按照贝塞尔路径设置目标的 position 属性。
  • flipX 翻转目标的 scaleX 属性
  • flipY 翻转目标的 scaleY 属性
  • blink 通过设置目标的 opacity 属性达到闪烁效果
  • to 添加一个对属性进行绝对值计算的 action
  • by 添加一个对属性进行相对值计算的 action
  • set 直接设置 target 的属性
  • delay 添加一个延时 action
  • call 添加一个回调 action
  • hide 添加一个隐藏 action
  • show 添加一个显示 action
  • removeSelf 添加一个移除自己 action
  • sequence 添加一个队列 action
  • parallel 添加一个并行 action
  • repeat 添加一个重复 action,这个 action 会将前一个动作作为他的参数。
  • repeatForever 添加一个永久重复 action,这个 action 会将前一个动作作为他的参数。
  • reverseTime 添加一个倒置时间 action,这个 action 会将前一个动作作为他的参数。

实例以及用法

简单实例:

cc.tween(node)   //要进行缓动的节点
            .to(1, { scale: 2, position: cc.v3(100, 100, 100) })   //这里的意思是在1秒时间进行缩放和移动到指定数值
            .call(() => { console.log('This is a callback'); })    //完成上面动作的回调
            .by(1, { scale: 3, position: cc.v3(200, 200, 200) }, { easing: 'sineOutIn' })  //这里的意思是在1秒时间进行缩放和移动指定改变量
            .start();
            //to 对属性进行绝对值计算,最终的运行结果即是设置的属性值,即改变到某个值
            //by 对属性进行相对值计算,最终的运行结果是设置的属性值加上开始运行时节点的属性值,即变化值

从代码我们可以看出来,tween的用法比之间action的用法简洁了不是一点点啊。

cc.tween 的每一个 API 都会在内部生成一个 action,并将这个 action 添加到内部队列中,在 API 调用完后会再返回自身实例,这样就可以通过链式调用的方式来组织代码。

cc.tween 在调用 start 时会将之前生成的 action 队列重新组合生成一个 cc.sequence 队列,所以 cc.tween 的链式结构是依次执行每一个 API 的,也就是会执行完一个 API 再执行下一个 API

cc.tween方法参数里是我们要缓动的节点,接着就是你想要什么效果就不断的进行链式调用就完事了。最后在后面加上start开启你的缓动动作。

当然,有可能有些人很讨厌这样很长的链式结构,我们也可以把你分离出来,最后再统一接上去

let scale = cc.tween().to(1, { scale: 2 });
        let rotate = cc.tween().to(1, { rotation: 90 });
        let move = cc.tween().to(1, { position: cc.v3(100, 100, 100) });
        // 先缩放再旋转再移动
        cc.tween(node).then(scale).then(rotate).then(move).start();

事件回调

可能有些同学想要在某个缓动有完成回调,或者每个缓动要想要一个完成回调,那我们在你想要回调的那个动作后面加上call方法就行。

let scale = cc.tween().to(1, { scale: 2 }).call(() => { console.log('scale complete'); })
        let rotate = cc.tween().to(1, { rotation: 90 }).call(() => { console.log('rotate commplete') })
        let move = cc.tween().to(1, { position: cc.v3(100, 100, 100) }).call(() => { console.log('move commplete') })
        // 先缩放再旋转
        cc.tween(this.root).then(scale).then(rotate).then(move).start();

这样他就会在前面的动作完成会进入到call回调方法里

easing

你可以使用 easing 来使缓动更生动,cc.tween 针对不同的情况提供了多种使用方式。

// 传入 easing 名字,直接使用内置 easing 函数
cc.tween().to(1, { scale: 2 }, { easing: 'sineOutIn'})

更多的内置缓动函数,我会在最后面放出来

同时执行多个属性

cc.tween(this.node)
    // 同时对 scale, position, rotation 三个属性缓动
    .to(1, { scale: 2, position: cc.v2(100, 100), rotation: 90 })
    .start()

那如果我要这三个属性动作的时间都是不一样的要怎么办,这时候我们就要用到parallel函数来进行分别处理

let t = cc.tween;
t(this.node)
    // 同时执行两个 cc.tween
    .parallel(
        t().to(1, { scale: 2 }),
        t().to(2, { position: cc.v2(100, 100) })
    )
    .call(() => {
        console.log('All tweens finished.')
    })
    .start()

cc.tween 在链式执行时是按照 sequence 的方式来执行的,但是在编写复杂缓动的时候可能会需要同时并行执行多个队列,cc.tween 提供了 parallel 接口来满足这个需求。

重复执行

repeat/repeatForever 函数会将前一个 action 作为作用对象。但是如果有参数提供了其他的 action 或者 tween,则 repeat/repeatForever 函数会将传入的 action 或者 tween 作为作用对象。

cc.tween(this.node)
    .by(1, { scale: 1 })
    // 对前一个 by 重复执行 10次
    .repeat(10)
    // 最后 node.scale === 11
    .start()

// 也可以这样用
cc.tween(this.node)
    .repeat(10,
        cc.tween().by(1, { scale: 1 })
    )
    .start()

// 一直重复执行下去
cc.tween(this.node)
    .by(1, { scale: 1 })
    .repeatForever()
    .start()

注意:这个只对于by有用,因为to是指定到的绝对值,而by是增加值

延迟执行

有时候,我们需要每个动作之间性需要延迟执行时间,这时候可以用到delay函数

cc.tween(this.node)
    // 延迟 1s
    .delay(1)
    .to(1, { scale: 2 })
    // 再延迟 1s
    .delay(1)
    .to(1, { scale: 3 })
    .start()

支持缓动任意对象的任意属性

let obj = { a: 0 }
cc.tween(obj)
  .to(1, { a: 100 })
  .start()

自定义 progress

相对于 easing,自定义 progress 函数可以更自由的控制缓动的过程。

// 对所有属性自定义 progress
cc.tween().to(1, { scale: 2, rotation: 90 }, {
  progress: (start, end, current, ratio) => {
    return start + (end - start) * ratio;
  }
})

// 对单个属性自定义 progress
cc.tween().to(1, {
  scale: 2,
  position: {
    value: cc.v3(),
    progress: (start, end, current, t) => {
      // 注意,传入的属性为 cc.Vec3,所以需要使用 Vec3.lerp 进行插值计算
      return start.lerp(end, t, current);
    }
  }
})

easing 内置缓动函数

缓动函数类,为 Tween 提供缓动效果函数。
函数效果演示: https://easings.net/

  • quadIn 平方曲线缓入函数。
  • quadOut 平方曲线缓出函数。
  • quadInOut 平方曲线缓入缓出函数。
  • cubicIn 立方曲线缓入函数。
  • cubicOut 立方曲线缓出函数。
  • cubicInOut 立方曲线缓入缓出函数。
  • quartIn 四次方曲线缓入函数。
  • quartOut 四次方曲线缓出函数。
  • quartInOut 四次方曲线缓入缓出函数。
  • quintIn 五次方曲线缓入函数。
  • quintOut 五次方曲线缓出函数。
  • quintInOut 五次方曲线缓入缓出函数。
  • sineIn 正弦曲线缓入函数。
  • sineOut 正弦曲线缓出函数。
  • sineInOut 正弦曲线缓入缓出函数。
  • expoIn 指数曲线缓入函数。
  • expoOut 指数曲线缓出函数。
  • expoInOut 指数曲线缓入和缓出函数。
  • circIn 循环公式缓入函数。
  • circOut 循环公式缓出函数。
  • circInOut 指数曲线缓入缓出函数。
  • elasticIn 弹簧回震效果的缓入函数。
  • elasticOut 弹簧回震效果的缓出函数。
  • elasticInOut 弹簧回震效果的缓入缓出函数。
  • backIn 回退效果的缓入函数。
  • backOut 回退效果的缓出函数。
  • backInOut 回退效果的缓入缓出函数。
  • bounceIn 弹跳效果的缓入函数。
  • bounceOut 弹跳效果的缓出函数。
  • bounceInOut 弹跳效果的缓入缓出函数。
  • smooth 平滑效果函数。
  • fade 渐褪效果函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cocos creator新缓动系统-cc.tween 的相关文章

  • Ubuntu下不能切换中文,qt creator无法输入中文,sogo输入法(详细步骤)

    目录 xff1a 1 解决ubuntu 不支持切换中文 xff0c 并安装sogo输入法步骤 xff1b 2 解决Qt Creator不支持中文输入 xff1a 详细步骤 xff1a 一 解决ubuntu 不支持切换中文 xff0c 并安装
  • 【Qt】Creator调试卡死挂起-starting debugger cdbengine for abi 【2023.03.23】

    解决方案 xff1a 删除这个文件 xff1a C Users 你的用户名 AppData Roaming QtProject qtcreator debuggers xml 重启QtCreator
  • Qt Creator 与Python混合编程配置

    第一步 创建Qt工程 第二步 在项目 pro文件下添加python解释器安装路径 添加代码如下 xff0c 大家可复制后更改python版本以及安装路径 INCLUDEPATH 43 61 C Python include LIBS 43
  • Qt Creator 3.0.1 部署远程调试

    QT Creator3 0 1 部署远程调试 远程目标板连接配置 从菜单栏选择options gt devices gt add gt generic linux device gt 开始向导 输入目标板的IP与登录用户信息 完成后会自动测
  • Creator-配置MSVC调试器

    安装完QT后会看到Qt Creator中的MSVC构建组件带有黄色的感叹号 xff0c 那是因为没有调试器的原因 由于Qt MSVC版本套件没有默认安装调试器 需要我们自己手动下载安装 根据官方文档Setting Up Debugger Q
  • 从零开始编写一个上位机(串口助手)QT Creator + C++

    提示 xff1a 本博客作为学习笔记 xff0c 有错误的地方希望指正 xff0c 此文可能会比较长 xff0c 作为学习笔记的积累 xff0c 希望对来着有帮助 绪论 xff1a 笔者这里使用的是QTCreator和C 43 43 来实现
  • 【Cocos creator】Cocos creator介绍和入门

    目录 一 工作流程二 安装和启动三 入门示例四 项目结构五 编辑器界面 Cocos Creator 是一个完整的游戏开发解决方案 xff0c 包含了 cocos2d x 引擎的 JavaScript 实现 xff0c 以及快速开发游戏所需求
  • Qt Creator使用CMake配置第三方库

    语法 include directories 添加第三方库头文件路径 这里的 include directories 直接向括号里加入第三方库的头文件路径即可 span class token function include direct
  • 链游

    一 前言 身为一名从事移动互联网App开发多年的从业人员 一直在关注前沿的技术方向 以免被时代的列车遗落 从18年底开始关注DApp技术的发展 COCOS发起的COCOS BCX以区块链为底层技术 专注区块链游戏领域的DApp游戏开发框架自
  • 链游

    一 前言 身为一名从事移动互联网App开发多年的从业人员 一直在关注前沿的技术方向 以免被时代的列车遗落 从18年底开始关注DApp技术的发展 COCOS发起的COCOS BCX以区块链为底层技术 专注区块链游戏领域的DApp游戏开发框架自
  • 【Cocos谁学谁会】定制属于自己的脚本模板

    版权申明 本文原创首发于以下网站 您可以自由转载 但必须加入完整的版权声明 博客园 https www cnblogs com MogooStudio csdn博客 https blog csdn net nmjkl001 知乎 https
  • CocosCreator3.8研究笔记(十四)CocosCreator 资源管理Asset Manager

    在游戏的开发过程中 需要使用到大量的图片 音频等资源来 从而带来管理上的困难 Asset Manager 资源管理模块具备加载资源 查找资源 销毁资源 缓存资源 Asset Bundle 等功能 帮助开发者管理其资源的使用 一 资源的加载
  • CocosCreator3.8研究笔记(二)windows环境 VS Code 编辑器的配置

    一 设置文件显示和搜索过滤步骤 为了提高搜索效率以及文件列表中隐藏不需要显示的文件 VS Code 需要设置排除目录用于过滤 比如 cocoscreator 中 编辑器运行时会自动生成一些目录 build temp library 所以应该
  • cocos creator 中读取Excel表格中的数据

    一 使用相应工具将Excel文件转化成JSON文件导入到cocos creator资源文件 二 在VS中对Excel文本中的数据进行转换 Excel文本中各项数据的名称对应代码中的data export default class Task
  • ccui.TextBMFont

    local myTextBMFont ccui TextBMFont create myTextBMFont setFntFile ui project ui res font Newfont TTF 其中setFntFile 只要是字体文
  • [Cocos Creator] Cocos Creator 下拉框(Dropdown)组件的实现

    模仿Unity写了一个Dropdown的组件 使用方法可以见工程 链接见底下 https github com ETRick CocosCreator Dropdown tree master Dropdown
  • cocoscreator 3.x 获取像素颜色

    const pos v2 世界坐标 const color as camera rt targetTexture readPixels pos v2 x pos v2 y 1 1 获得颜色 cc color color as 0 color
  • 在 AS3 中设置属性是否会阻止时间线补间?

    如果我有一个分配有类的影片剪辑 并且我在代码中更改了该影片剪辑的属性 则该属性似乎无法再在时间轴上进行补间 例如 如果我的类设置 this x 100 并且稍后在时间轴上补间对象的位置 则不会发生该时间轴补间 更改scaleX或scaleY
  • 为什么我在设置 LibGDX 时没有通用补间引擎

    接下来是关于设置 LibGDX 项目的教程 教程说在第三方部分应该有一个通用 Tween 引擎 地雷不显示 有什么办法可以显示吗 我需要下载什么 提前致谢 Gdx setup new ui jar 不附带 TweenEngine 库 还有另
  • 在 ActionScript 中移动数组中的对象,产生体育场波浪效果

    我想移动数组中的所有对象 产生体育场波浪效果 我想根据舞台上的 y 值移动对象 我所有的方块大小都是 50x50 我想将它们向上移动然后向下移动 下面是我的代码 import fl transitions Tween import fl t

随机推荐