1.动作,在cocos2d-x中有非常多种的动作,各种移动,旋转,缩放,淡入淡出....等等非常多,但是这些动作只是作用于节点,最常作用于的就是精灵节点。而且我们可以把很多个动作放进一个Sequence类型的动作中,一次性可以执行多个动作。还有很多类似Sequence类型的类型,只是作用不同而已。

  2.帧动画,这种动画是按照一定的速度draw出一定数量的图片,从而达到连环画的效果,也就好比我们一个人的攻击动作分解成很多个步骤,每个步骤都有一张完整的人的图,这时候我们在查看图片的管理器中,连续点击下一张,就会出现连贯的攻击动作,而我们点击的速度其实等价于游戏中的一秒几帧,是可以自己设置的。动画可以直接使用动画帧实现,也可以用动画帧缓冲实现,动画动作也可以直接使用动画帧实现,或者用动画帧缓冲实现。第二种方法比第一种的优势就是效率非常高,它只需第一次把所有图片或者动画加载进缓冲区,然后在需要的时候调用就行了。而第一种方法每一次都要去调用需要的图片或者动画,非常地浪费性能。但是第二种方法需要用到的游戏资源就比第一种的多。第一种只需要很多的动作分解的PNG小图片,而第二种需要会被放进精灵帧缓存的管理所有分解图片的plist文件,还要管理所有动画动作的plist文件,还要一张包含所有动作分解的PNG小图的PNG大图,还要所有的动作分解的PNG小图。第二种方法的核心理念就是先缓存再使用。

  当然,这种性能上的差别只有在大的游戏中才有,所以目前我觉得我只要使用第一种就可以了,毕竟第一种比较好理解。而且制作plist文件感觉很麻烦,而且现在还没有找到什么好的制作工具。

  以上说的动画都是帧动画,还有一种常用的动画是骨骼动画,目前我可以用Spine工具制作骨骼动画,但是自己做的很丑,输出是jason文件,atls文件,PNG大图,jason文件其实是plist文件的前辈。

1.执行帧动画

//创建行走的帧动画
Animation * animation = Animation::create();
animation->addSpriteFrameWithFile("s_1.png");
animation->addSpriteFrameWithFile("s_2.png");
animation->addSpriteFrameWithFile("s_3.png");
animation->addSpriteFrameWithFile("s_4.png");
animation->addSpriteFrameWithFile("s_5.png");
animation->addSpriteFrameWithFile("s_6.png");
animation->setDelayPerUnit(0.1f);  //设置每张图片之间的时间间隔
animation->setRestoreOriginalFrame(true);
//设置动画型的动作
auto animate = Animate::create(animation);
this->runAction(RepeatForever::create(animate));

2.执行一个动作队列

例子1

//停止之前的所有动作
this->stopAllActions();
sprite->stopAllActions();

//把帧动画变成跳跃的纹理
this->setTexture(jump);

startPosition = size.height / 4;
JumpTo *jump = JumpTo::create(1, Vec2(200, startPosition), startPosition, 1);
//回调函数把状态重新设置成行走,执行程序时跳过这个函数,这个函数处于等待被调用的状态,直到有人用它的时候才调用
CallFunc *call = CallFunc::create([this](){
  setState(0);
});
//设置动作队列,先跳跃,再回去调用call,变成行走的动作
this->runAction(Sequence::create(jump, call, NULL));

例子2

//停止之前的所有动作
this->stopAllActions();
//sprite->stopAllActions();

//把帧动画变成受伤的纹理,同时创建一个闪烁的动作
this->setTexture(creep);
Blink * hurt = Blink::create(1, 5);

startPosition = size.height / 4;
auto moveTo = MoveTo::create(0.5, Vec2(200, startPosition));
//回调函数把状态重新设置成行走,执行程序时跳过这个函数,这个函数处于等待被调用的状态,直到有人用它的时候才调用
CallFunc *call = CallFunc::create([this](){
  setState(0);
});
//设置动作队列,先闪烁,再移动到默认的位置,再回去调用call,变成行走的动作
this->runAction(Sequence::create(hurt, moveTo, call, NULL));

3.执行一个动作队列的过程中延迟一定的时间

auto setHurtImg = CallFunc::create([this, hurt](){
  this->setSpriteFrame(hurt);
});

auto setOldImg = CallFunc::create([this, old](){
  this->setSpriteFrame(old);
});

auto hurtAction = Sequence::create(setHurtImg, DelayTime::create(0.2), setOldImg, nullptr);

this->stopAllActions();
this->runAction(hurtAction);

注意:

1) DelayTime的create方法

static DelayTime* create ( float d )

用延迟时间创建DelayTime动作。

参数
d 持续时间,以秒为单位。
返回
一个自释放的DelayTime对象。

2) Blink的create方法

static Blink * create (float duration, int blinks)

用持续时间和闪现次数创建Blink动作。

例如

Blink * hurt = Blink::create(1, 5);

持续1秒,闪烁5次。

3) 当this是一个包含myHero子节点的父节点的时候

this->stopAllActions();  //停止父节点(this)的所有动作和动画,不会停止子节点(myHero)的动作和动画(因为动画是要动作来驱使的,所以动画也算在里面)
myHero->stopAllActions();  //停止子节点(myHero)的所有动作和动画。

4)关于一些动作结束后的位置

auto moveTo = MoveTo::create(1, Vec2(0, block->getContentSize().height));
block->runAction(Sequence::create(moveTo, NULL));

这里的block是在Baby实例里面的,这个位移的动作的最终位置为Vec2(0, block->getContentSize().height),其实是在Baby实例里面的位置,不是相对整个屏幕的位置

  

  

关于Cocos2d-x的动作和动画相关推荐

  1. Cocos2D研究院之精灵与动画

    转载自雨松MOMO程序研究院本文链接地址:Cocos2D研究院之精灵与动画(六) 通过对导演.场景.层和节点的剖析,现在我们已经可以写出一个完整的游戏体系了,在实际应用中,场景一般都是作为游戏的关卡, ...

  2. cocos2dx 第七课 动作和动画

    一.动作的行为 runAction(Action * act);//运行动作 stopAction(Action * act);//停止动作 stopActionByTag(int tag);//停止 ...

  3. cocos2d的常用动作及效果总结之五:Animation

    这一篇是讲一下如何在cocos2d中实现动画. 实现动画的步骤: 加载帧 生成动画对象 运行动画 加载帧我用过两种方式: 第一种是使用.plist文件,通过CCSpriteFrameCache读取动画 ...

  4. 【动态ppt制作软件】Focusky教程 | 怎么让动作路径动画发挥作用

    Focusky 动画演示大师(以下简称为"FS软件")中的动画编辑器给予每一位用户自己创造动画演示文稿的机会. 在动画编辑器当中, 可以为任何物体添加各种动画特效, 其中包括进场, ...

  5. 老版启用aero_在Windows Vista中启用慢动作Aero动画

    老版启用aero This tip really isn't very useful, but it's an interesting hack to show your friends. You c ...

  6. 随机攻击动作(动画蒙太奇,动画蒙太奇插槽,蒙太奇数组)

    实现效果: 本案例实现攻击动作的随机播放. 原理: 动画蒙太奇保证在同一个插槽下,利用随机访问蒙太奇数组中的蒙太奇对象,实现随机播放. 一:动画蒙太奇 选择动画资源,创建动画蒙太奇.注意:本案例是实现 ...

  7. Cocos2D引擎学习-动作类的学习(一)

    首先,动作类不会单独存在.动作类的对象需要作用在精灵丶图层等对象上才能发挥作用.动作类包含有许多类型,包括位移丶缩放和旋转 CCAction为所有动作的父类 基础瞬时动作 CCFlipX :X轴镜像翻 ...

  8. cocos2d 用MotionStreak给骨骼动画的刀加拖尾(刀光拖尾)

    最近刚去公司工作,没有一点经验,真是苦逼,做一个demo,当骨骼动画(刀这个骨骼砍得时候能够出现拖尾效果,真是想破脑袋),经过不断的尝试,总结出了一个方法: 直接上代码: MotionStreak * ...

  9. android 按键上浮动画_android – 浮动动作按钮动画

    从@Zielony的回答中,我确切地说到了我想要的地方. 下面是正确应用效果的代码. scale_fab_in.xml android:duration="500" android ...

最新文章

  1. C#集合类(HashTable, Dictionary, ArrayList,List)与HashTable线程安全
  2. 怎样远程连接服务器后上传文件,远程登录服务器后怎样上传文件
  3. 第十三章:Python の 网络编程进阶(二)
  4. gradle各版本下载地址
  5. java web scala_spring boot+scala编写web接口
  6. 利用python求解度中心性
  7. mysql浮点数据怎么_MySQL数据浮点类型的实际应用操作
  8. linux中忘记mysql用户root密码解决方案
  9. 关于安装TOMCAT解压版环境配置流程
  10. 华为交换机命令基础入门学习,小白也能看得懂!
  11. 腾讯微博开放平台开发吐槽
  12. 并发编程、并行、多线程、锁、同步、异步、多线程、单线程、阻塞io、非阻塞io
  13. JSP+实验室设备管理 毕业设计-附源码191409
  14. Wincc报表案例_设备运行报表
  15. 1月24日源码中国VB源码下载排名
  16. 如何用 canvas 画出分形图
  17. 西方哲学智慧2018网课考题(本人亲测,已满分)
  18. 示波器探头需要补偿校准的根本原因
  19. UEFI启动和Bios(Legacy)启动的区别
  20. TIOBE 11 月编程语言排行榜:Rust 在 Top 20 站住脚!

热门文章

  1. 【PL/SQL】 使用游标
  2. 网络管理与维护作业8
  3. Lingo解决最优化问题
  4. 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
  5. MySql存储过程异常处理示例
  6. 2019腾讯广告算法大赛 决赛 Rank16解决方案
  7. tomcat报错:This is very likely to create a memory leak问题解决
  8. JS获取url多个参数及解决中文乱码问题
  9. 在Htdocs之外创建XAMPP / Apache服务文件[关闭]
  10. hdfs mv命令_Hadoop2.x HDFS shell命令