CocosCreator 教你玩转Animation动画(第十四篇)

Stella981
• 阅读 1765

前言:
Animation动画在游戏中是必不可少的,各种人物的走跑跳飞,以及各种表情动作,反正做游戏Animation动画是必修课了。
这一篇章可以学会制作和控制各种动画,主要从一下几个方面介绍:

  1. 动画制作流程;
  2. 使用Animation动画编辑器制作动画;
  3. 代码控制动画;

一、动画制作的流程

创建节点 ----> 挂载Animation组件 ----> 创建Animation Clip文件 ----> 将Animation Clip文件挂载到相应的节点上 ----> 编辑Animation Clip文件 ----> 最后代码控制动画。
上面顺序不唯一,但基本是上面步骤;
部分截图:
CocosCreator 教你玩转Animation动画(第十四篇)
CocosCreator 教你玩转Animation动画(第十四篇)
CocosCreator 教你玩转Animation动画(第十四篇)


二、使用Animation动画编辑器制作动画

CocosCreator 教你玩转Animation动画(第十四篇)

1. 基本操作介绍

这些操作按钮一般鼠标放上去都是有提示信息的;
这编辑器的使用和Flash差不多;

能够支持一下功能:

  1. 添加和删除一个新的属性轨道
  2. 添加、移动、选择、更改、复制、粘贴关键帧
  3. 双击连接连编辑时间曲线
  4. 添加动画事件
  5. 添加一个新的属性轨道

CocosCreator 教你玩转Animation动画(第十四篇)
CocosCreator 教你玩转Animation动画(第十四篇)
双击两帧之间的连接线编辑时间曲线:
可以通过时间曲线在两帧之间实现 EaseInOut 等缓动效果
CocosCreator 教你玩转Animation动画(第十四篇)

添加帧事件:
CocosCreator 教你玩转Animation动画(第十四篇)
CocosCreator 教你玩转Animation动画(第十四篇)

2. 编辑帧动画

通过添加不同的属性,然后可以在时间轴上插入关键帧,然后在关键帧上修改属性.
CocosCreator 教你玩转Animation动画(第十四篇)


三、使用脚本控制动画 (重点)

1. Animation 组件

停止状态,则 Animation 会直接重新播放这个动画;
暂停状态,则 Animation 会恢复动画的播放,并从当前时间继续播放下去;
播放状态,则 Animation 会先停止这个动画,再重新播放动画。

举例:

var anim = this.getComponent(cc.Animation);
// 如果没有指定播放哪个动画,并且有设置 defaultClip 的话,则会播放 defaultClip 动画
anim.play();

// 指定播放 test 动画
anim.play('test');

// 指定从 1s 开始播放 test 动画
anim.play('test', 1);

// 使用 play 接口播放一个动画时,如果还有其他的动画正在播放,则会先停止其他动画
anim.play('test2');

// 播放第一个动画
anim.playAdditive('position-anim');

// 播放第二个动画
// 使用 playAdditive 播放动画时,不会停止其他动画的播放。如果还有其他动画正在播放,则同时会有多个动画进行播放
anim.playAdditive('rotation-anim');

// 指定暂停 test 动画
anim.pause('test');

// 暂停所有动画
 anim.pause();

// 指定恢复 test 动画
anim.resume('test');

// 恢复所有动画
 anim.resume();

// 指定停止 test 动画
anim.stop('test');

// 停止所有动画
 anim.stop();

设置动画的当前时间:

var anim = this.getComponent(cc.Animation);
anim.play('test');

// 设置 test 动画的当前播放时间为 1s
anim.setCurrentTime(1, 'test');

// 设置所有动画的当前播放时间为 1s
 anim.setCurrentTime(1);

你可以在任何时候对动画设置当前时间,但是动画不会立刻根据设置的时间进行状态的更改,需要在下一个动画的 update 中才会根据这个时间重新计算播放状态。


2. AnimationState

Animation 只提供了一些简单的控制函数,希望得到更多的动画信息和控制的话,需要使用到 AnimationState。

2.1 获取 AnimationState

var anim = this.getComponent(cc.Animation);
// play 会返回关联的 AnimationState
var animState = anim.play('test');

// 或是直接获取
var animState = anim.getAnimationState('test');

2.2 获取和设置动画信息

var anim = this.getComponent(cc.Animation);
var animState = anim.play('test');

// 获取动画关联的clip
var clip = animState.clip;

// 获取动画的名字
var name = animState.name;

// 获取动画的播放速度
var speed = animState.speed;

// 获取动画的播放总时长
var duration = animState.duration;

// 获取动画的播放时间
var time = animState.time;

// 获取动画的重复次数
var repeatCount = animState.repeatCount;

// 获取动画的循环模式
var wrapMode = animState.wrapMode

// 获取动画是否正在播放
var playing = animState.isPlaying;

// 获取动画是否已经暂停
var paused = animState.isPaused;

// 获取动画的帧率
var frameRate = animState.frameRate;

设置动画 循环模式 与 循环次数
var animState = anim.play('test');

// 设置循环模式为 Normal
animState.wrapMode = cc.WrapMode.Normal;

// 设置循环模式为 Loop
animState.wrapMode = cc.WrapMode.Loop;

// 设置动画循环次数为2次
animState.repeatCount = 2;

// 设置动画循环次数为无限次
animState.repeatCount = Infinity;

2.3 动画事件

前面有讲到在关键帧上插入事件。

cc.Class({
   
   
   
    extends: cc.Component,

    onAnimCompleted: function (num, string) {
   
   
   
        console.log('onAnimCompleted: param1[%s], param2[%s]', num, string);
    }
});

注册动画回调

除了动画编辑器中的帧事件提供了回调外,动画系统还提供了动态注册回调事件的方式。
目前支持的回调事件有:
play : 开始播放时
stop : 停止播放时
pause : 暂停播放时
resume : 恢复播放时
lastframe : 假如动画循环次数大于 1,当动画播放到最后一帧时
finished : 动画播放完成时

var animation = this.node.getComponent(cc.Animation);
// 注册
animation.on('play',this.onPlay, this);

// 取消注册
animation.off('play', this.onPlay, this);

// 对单个 cc.AnimationState 注册回调
var anim1 = animation.getAnimationState('anim1');
anim1.on('lastframe',    this.onLastFrame,      this);

动态创建 Animation Clip

var animation = this.node.getComponent(cc.Animation);
// frames 这是一个 SpriteFrame 的数组.
var clip = cc.AnimationClip.createWithSpriteFrames(frames, 17);
clip.name = "anim_run";
clip.wrapMode = cc.WrapMode.Loop;

// 添加帧事件
clip.events.push({
   
   
   
  frame: 1,               // 准确的时间,以秒为单位。这里表示将在动画播放到 1s 时触发事件
  func: "frameEvent",     // 回调函数名称
  params: [1, "hello"]    // 回调参数
});

animation.addClip(clip);
animation.play('anim_run');

推荐阅读:
CocosCreator 经典飞刀小游戏 (实战)
走进Cocos Creator游戏开发(第一篇)

谢谢支持~
CocosCreator 教你玩转Animation动画(第十四篇)

本文同步分享在 博客“战 胜”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Unity 2D角色动画状态切换
一,Idle状态  1,选中角色,打开Animation动画面板;  2,新建一个动画面板Idle;  3,拖动相关角色状态图片,实现动画二,run状态  1,新建一个动画面板run;  2,拖动相关角色状态图片,实现动画三,jump状态  1,新建一个动画面板jump;  2,拖动相关角色状态图片,实现动画四,打开角
Wesley13 Wesley13
2年前
Unity 动画系统 Animation和Animator 常用小功能
👈返回目录(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2F01zxs%2Fp%2F9987225.html)Animation控制动画播放:Animation.Play();//播放默认动画Ani
Wesley13 Wesley13
2年前
Unity中Animator的2DSprite动画控制与使用
关于Unity动画系统几个名词概念,需要了解一下:Animator:动画控制器,控制Mecanim动画系统的接口。Animation:animation组件用于播放动画AnimationClip:动画剪辑片段,储存基于关键帧的动画,是用于Animation来播放动画。Animation编辑面板:此面板可以进行动画的调整,crtl6打开ani
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这