关于Cocos2d-x的动作和动画
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的动作和动画的更多相关文章
- [一位菜鸟的COCOS-2D编程之路]COCOS2D中得动作,特效和动画
一,CCActionManager 管理所有节点动作的对象 来看看打飞机里面的一个onEnter 方法 - (void)onEnter { [super onEnter]; //一定要注意添加此方法, ...
- cocos2d-x开发记录:二,基本概念(动作,动画,坐标系统)
既然我们选择用cocos2d,那么他里面的一些基本概念我们肯定是要熟悉下的,以下资料来源于官网,英语好的可以直接去官网看. 一.Actions(动作) 动作都由于CCNode对象发出.这些动作通常修改 ...
- cocos基础教程(7)动作与动画
动作类(Action) 动作类(Action)是所有动作的基类,它创建的一个对象代表一个动作.动作作用于Node,因此每个动作都需要由Node对象执行.动作类(Action)作为基类,实际上是一个接口 ...
- [cocos2d] 利用texture atlases生成动画
texturepacker可以方便地制作纹理贴图集(Texture Atlases),而且可以免费试用.(可在官网申请免费liscence) //利用软件将5帧png贴图生成1张大的png贴图和pli ...
- Cocos Creator 动作(动画)笔记
动作cc.ActionInterval 和cc.ActionInstant; var action = cc.moveTo(2, 100, 100); // 创建一个移动动作node.runActio ...
- cocos2d-x JS 利用重复动作实现动画播放(实现倒计时)
cocos2d-js: cc.delayTime() and cc.repeatForever() don't work together in cc.sequence() this.numm = 1 ...
- cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能
cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...
- Cocos2D iOS之旅:如何写一个敲地鼠游戏(八):为动画建立属性列表
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- (转)Unity3D - 动作动画忽略timeScale
转自:http://blog.csdn.net/ynnmnm/article/details/46866347 最近在调战斗时的动画与特效,Unity3D对加/减速提供了Time.timeScale支 ...
随机推荐
- Python fabs() 函数
描述 fabs() 方法返回数字的绝对值,如math.fabs(-10) 返回10.0. fabs() 函数类似于 abs() 函数,但是他有两点区别: abs() 是内置函数. fabs() 函数在 ...
- Linux使用技巧5--格式化U盘
通常来说,格式化一个分区的U盘还是非常easy的.仅仅须要使用mkfs命令指定目标文件系统就能够了,样例例如以下: $ sudo fdisk -l $ sudo mkfs -t vfat /dev/s ...
- 导入sklearn 报错,找不到相关模块
1.问题原因::安装包的来源问题,也可以理解为包版本兼容问题,有的包使用官方出版,有的包使用whl文件安装解决方案:将所有包都统一来源,要么全部使用官方出版的包,要么全部使用whl里面的包,问题就解决 ...
- python标准库介绍——28 sha 模块详解
==sha 模块== ``sha`` 模块提供了计算信息摘要(密文)的另种方法, 如 [Example 2-39 #eg-2-39] 所示. 它与 ``md5`` 模块类似, 但生成的是 160 位签 ...
- svnserve配置文件详析
svnserve是SVN自带的一个轻型服务器,客户端通过使用以svn://或svn+ssh://为前缀的URL来访问svnserve服务 器,实现远程访问SVN版本库. svnserve可以通过配置文 ...
- [Jobdu] 题目1529:棋盘寻宝
题目描述: 现在有一个8*8的棋盘,上面放着64个价值不等的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0小于1000),一个人的初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应 ...
- paip.索引的种类以及实现attilax 总结
paip.索引的种类以及实现attilax 总结 1. 索引的类型 1 2. Btree索引(分块索引) 1 3. Hash 索引(编号索引) 1 4. 倒排索引 2 5. 对大型文本文件做索引 2 ...
- SDUT 1941-Friday the Thirteenth(水)
Friday the Thirteenth Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 Is Friday the 13 ...
- json格式详解
一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标准变量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的 ...
- ny523 亡命逃串 hdoj 1253胜利大逃亡
亡命逃窜 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 从前有个叫hck的骑士,为了救我们美丽的公主,潜入魔王的老巢,够英雄吧.不过英雄不是这么好当的.这个可怜的娃被魔 ...