九、CCAction_cc.sequence 传入列表-程序员宅基地

技术标签: cocos2d  

之前介绍CCNode的时候说过,动作是指在特定时间内完成移动、缩放、旋转等操作的行为,节点可以通过运行动作来实现动画效果,这里的动作就是指CCAction对象,它有很多的子类,每个子类都封装了不同的动作效果。

先来看看CCAction的继承结构图

这里我省略了瞬时动作(CCActionInstant)和间隔动作(CCActionInterval)的子类,因为它们又包含了非常多的子类,待会再介绍它们的子类。

CCAction和CCFiniteTimeAction都是抽象类,只定义了一些基本属性和方法,没有实际用途,我们需要使用它们的子类来初始化动作,然后运行到节点上。


间隔动作

间隔动作就是指需要经过一段时间才能完成的动作,所有的间隔动作 都继承自CCActionInterval。比如CCRotateBy, 可以在指定时间内旋转指定的角度

[java]  view plain copy
  1. // 1秒内顺时针旋转360°  
  2. CCRotateBy *rotate = [CCRotateBy actionWithDuration:1 angle:360];  
  3. [sprite runAction:rotate];  


间隔动作的继承结构图:(只列出部分常用的)


由于CCActionInterval的子类太多了,这里就不一一介绍了,可以查阅下API文档

下面列举一下常见的CCActionInterval的子类:

1.CCBlink

闪烁效果

[java]  view plain copy
  1. // 5秒内闪烁20次  
  2. CCBlink *blink = [CCBlink actionWithDuration:5 blinks:20];  
  3. [sprite runAction:blink];  

2.CCMoveBy和CCMoveTo

CCMoveBy是移动一段固定的距离,CCMoveTo是移动到指定的位置

[java]  view plain copy
  1. // 在1秒内,向右移动100单位,同时向上移动80单位  
  2. CCMoveBy *moveBy = [CCMoveBy actionWithDuration:1 position:CGPointMake(10080)];  

[java]  view plain copy
  1. // 在1秒内,从节点的当前位置移动到(100, 80)这个位置  
  2. CCMoveTo *moveTo = [CCMoveTo actionWithDuration:1 position:CGPointMake(10080)];  

3.CCRotateBy和CCRotateTo

CCRotateBy是在当前旋转角度的基础上再旋转固定的角度,CCRotateTo是从当前旋转角度旋转到指定的角度

假设精灵在初始化的时候已经顺时针旋转了 45°

[java]  view plain copy
  1. sprite.rotation = 45;  


如果使用了CCRotateBy

[java]  view plain copy
  1. CCRotateBy *rotateBy = [CCRotateBy actionWithDuration:1 angle:90];  
  2. [sprite runAction:rotateBy];  
  3.   
  4. // 在1秒内,再顺时针旋转90°,那么sprite的最终旋转角度是45° + 90° = 135°  

如果使用了CCRotateTo
[java]  view plain copy
  1. CCRotateTo *rotateTo = [CCRotateTo actionWithDuration:1 angle:90];  
  2. [sprite runAction:rotateTo];  
  3.   
  4. // 在1秒内,顺时针旋转到90°,sprite的最终旋转角度就是90°  

4.CCScaleBy和CCScaleTo

CCScaleBy是在当前缩放比例的基础上再缩放固定的比例,CCScaleTo是从当前缩放比例缩放到指定的比例

假设精灵在初始化的时候的缩放比例为0.8

[java]  view plain copy
  1. sprite.scale = 0.8;  

如果使用了 CCScaleBy
[java]  view plain copy
  1. CCScaleBy *scaleBy = [CCScaleBy actionWithDuration:1 scale:0.5];  
  2. [sprite runAction:scaleBy];  
  3. // 在1秒内,宽度和高度再缩小50%,那么sprite最终缩放比例是0.8 * 0.5 = 0.4  

如果使用了 CCScaleTo

[java]  view plain copy
  1. CCScaleTo *scaleTo = [CCScaleTo actionWithDuration:1 scale:0.5];  
  2. [sprite runAction:scaleTo];  
  3. // 在1秒内,宽度和高度缩小为0.5倍,那么sprite最终缩放比例是就0.5  

5.CCFadeIn和CCFadeOut和CCFadeTo

CCFadeIn是淡入,即由暗转亮,从没有到有;CCFadeOut是淡出,即由亮转暗,从有到没有;CCFadeTo用来修改节点的不透明度

[java]  view plain copy
  1. // 在2秒内,从没有到有  
  2. CCFadeIn *fadeIn = [CCFadeIn actionWithDuration:2];  
  3.   
  4. // 在2s内,从有到没有  
  5. CCFadeOut *fadeOut = [CCFadeOut actionWithDuration:2];  
  6.   
  7. // 在2s内,不透明度变为120,即变为半透明 (不透明度取值范围是0-255)  
  8. CCFadeTo *fadeTo = [CCFadeTo actionWithDuration:2 opacity:120];  


6.CCRepeat

重复执行某个动作,可以指定重复的次数

[java]  view plain copy
  1. // 1秒中顺时针旋转360°  
  2. CCRotateBy *rotateBy = [CCRotateBy actionWithDuration:1 angle:360];  
  3. // 重复执行2次旋转动画  
  4. CCRepeat *repeat = [CCRepeat actionWithAction:rotateBy times:2];  
  5.   
  6. [sprite runAction:repeat];  

7.CCAnimate

按顺序地播放图片,可以实现帧动画。

例如有下面10张图片:(玩过街机的同学应该很熟悉,赵云的大鹏展翅)

不难发现,如果从1.png 到 10.png按顺序显示图片的话会形成一个动画

下面用CCAnimate实现动画效果

[java]  view plain copy
  1. // 用来存放所有的帧  
  2. NSMutableArray *frames = [NSMutableArray array];  
  3. // 加载所有的图片  
  4. for (int i = 1; i<= 10; i++) {  
  5.     // 文件名  
  6.     NSString *name = [NSString stringWithFormat:@"zy.bundle/%i.png", i];  
  7.     // 根据图片名加载纹理,一个图片对应一个纹理对象  
  8.     CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage:name];  
  9.     // 根据纹理初始化一个帧  
  10.     CGRect retct = CGRectMake(00, texture.contentSize.width, texture.contentSize.height);  
  11.     CCSpriteFrame *frame = [[[CCSpriteFrame alloc] initWithTexture:texture rect:retct] autorelease];  
  12.     // 添加帧到数组中  
  13.     [frames addObject:frame];  
  14. }  
  15.   
  16. // 根据帧数组初始化CCAnimation,每隔0.1秒播放下一张图片  
  17. CCAnimation *animation = [CCAnimation animationWithFrames:frames delay:0.1];  
  18.   
  19. // 根据CCAnimation对象初始化动作  
  20. CCAnimate *animate = [CCAnimate actionWithAnimation:animation];  
  21.   
  22. [sprite runAction:animate];  
动画效果如下:

里是将10帧分为10张不同的png图片。为了性能着想,其实最好将10帧打包成一个图片,到时从这张图片上面切割每一帧,这种图片我们可以称为"纹理相册",可以用TexturePacker制作纹理相册


8.CCSequence

一般情况下,如果给节点同时添加几个动作时,它们会同时运行。比如下面的代码效果是一边旋转一边缩放

[java]  view plain copy
  1. CCRotateBy *rotateBy = [CCRotateBy actionWithDuration:1 angle:360];  
  2. CCScaleBy *scaleBy = [CCScaleBy actionWithDuration:1 scale:2];  
  3.   
  4. [sprite runAction:rotateBy];  
  5. [sprite runAction:scaleBy];  
但是有时候我们想让动作一个接着一个运行,那么就要用到 CCSequence
下面演示的效果是,让精灵先变为红色,再从红色变为绿色,再从绿色变为蓝色

[java]  view plain copy
  1. CCTintTo *tintTo1 = [CCTintTo actionWithDuration:1 red:255 green:0 blue:0];  
  2. CCTintTo *tintTo2 = [CCTintTo actionWithDuration:1 red:0 green:255 blue:0];  
  3. CCTintTo *tintTo3 = [CCTintTo actionWithDuration:1 red:0 green:0 blue:255];  
  4. // CCTintTo也是CCActionInterval的子类,可以用于更改精灵的颜色。  
  5.   
  6. CCSequence *sequence = [CCSequence actions:tintTo1, tintTo2, tintTo3, nil];  
  7. [sprite runAction:sequence];  
CCSequence会 按顺序执行参数中传入的所有动作


9.CCActionEase

当对节点使用CCMoveTo动作时,它会匀速移动到目的地,如果使用CCActionEase就可以使节点由慢到快或者由快到慢地移向目的地。因此CCActionEase是用来改变动作的运行时速度的。

CCActionEase是个非常强大的类,子类非常多,这里只说明其中的几个:

CCEaseIn:由慢到快

CCEaseOut:由快到慢

CCEaseInOut:先由慢到快,再由快到慢

举个代码例子:

[java]  view plain copy
  1. CCMoveTo *moveTo = [CCMoveTo actionWithDuration:4 position:ccp(300200)];  
  2. CCEaseInOut *easeInOut = [CCEaseInOut actionWithAction:moveTo rate:5];  
  3. [sprite runAction:easeInOut];  
你会看到精灵先由慢到快,再由快到慢。rate参数决定了速率变化的明显程度,当它大于1时才 有效


10.CCGridAction

使用CCGridAction的具体子类可以实现三维效果,例如翻页效果(CCPageTurn3D)、波浪效果(CCWaves)、流体效果(CCLiquid)。虽然能实现很好看的3D效果,但是它有很大的缺点,如果不启用深度缓冲,3D效果会有些失真,如果启用了深度缓冲,会特别耗内存。

如果想开启深度缓冲的话,就要修改EAGLView的初始化参depthFormat:

[java]  view plain copy
  1. EAGLView *glView = [EAGLView viewWithFrame:[window bounds]  
  2.                                    pixelFormat:kEAGLColorFormatRGB565     
  3.                                    depthFormat:GL_DEPTH_COMPONENT24_OES];  
可以改 为GL_DEPTH_COMPONENT16_OES(16位深度缓冲)或者GL_DEPTH_COMPONENT24_OES(24位深度缓冲),16位 深度缓冲占用的内存较少,但是仍然会有些失真


瞬时动作

瞬时动作(CCActionInstant)是指能够瞬间完成的动作,可用于改变节点位置、翻转节点形成镜像、设置节点的可视性等。

下面大致看下瞬时动作的继承结构图:


看完这个图,你可能觉得CCActionInstant好像没有一点使用价值,因为它的好多动作都可以通过修改节点属性来完成。比如可以通过设置节点的visible属性来代替使用CCShow\CCHide\CCToggleVisibility、可以通过修改节点的position属性来代替使用CCPlace其实当它们与CCSequence结合使用时才有价值。比如,我们想先让节点运行一个CCMoveTo移动到某个位置,移动完毕后再隐藏节点,这时候我们就可以将CCMoveTo、CCHide两个动作按顺序放进CCSequence中达到想要的效果

[java]  view plain copy
  1. // 移动到(300, 200)  
  2. CCMoveTo *moveTo = [CCMoveTo actionWithDuration:2 position:ccp(300200)];  
  3. // 隐藏节点  
  4. CCHide *hide = [CCHide action];  
  5.   
  6. CCSequence *sequence = [CCSequence actions:moveTo, hide, nil];  
  7.   
  8. [sprite runAction:sequence];  

有时候,在一个动作 序列(CCSequence)里面,我们需要在一个动作运 行完毕后,调用某个方法执行一些操作,然后再执行下一个动作。那我们就可以 结合CCCallFunc和CCSequence完成 这个功能。

比如,我们让精灵先变为红色,再从红色变为绿色,再从绿色变为蓝色,而且在每次变换颜色后都调用某个方法执行一些操作:

[java]  view plain copy
  1. // 变为红色  
  2. CCTintTo *tintTo1 = [CCTintTo actionWithDuration:2 red:255 green:0 blue:0];  
  3. // 变为红色后调用self的turnRed方法  
  4. CCCallFunc *fn1 = [CCCallFunc actionWithTarget:self selector:@selector(turnRed)];  
  5.   
  6. // 变为绿色  
  7. CCTintTo *tintTo2 = [CCTintTo actionWithDuration:2 red:0 green:255 blue:0];  
  8. // 变为绿色后调用self的turnGreen:方法,参数是运行当前动作的节点  
  9. CCCallFuncN *fn2 = [CCCallFuncN actionWithTarget:self selector:@selector(turnGreen:)];  
  10.   
  11. // 变为蓝色  
  12. CCTintTo *tintTo3 = [CCTintTo actionWithDuration:2 red:0 green:0 blue:255];  
  13. // 变为蓝色后调用self的turnBlue:data:方法,第一个参数是运行当前动作的节点,第二个参数是data的值  
  14. CCCallFuncND *fn3 = [CCCallFuncND actionWithTarget:self selector:@selector(turnBlue:data:) data:@"blue"];  
  15.   
  16. // 最后调用turnDone:方法,传递了一个@"done"字符串作为参数  
  17. CCCallFuncO *fn4 = [CCCallFuncO actionWithTarget:self selector:@selector(turnDone:) object:@"done"];  
  18.   
  19. CCSequence *sequence = [CCSequence actions:tintTo1, fn1, tintTo2, fn2, tintTo3, fn3, fn4, nil];  
  20. [sprite runAction:sequence];  
下面是回调方法的实现:

[java]  view plain copy
  1. - (void)turnRed {  
  2.     NSLog(@"变为红色");  
  3. }  
  4.   
  5. // node是运行当前动作的节点  
  6. - (void)turnGreen:(id)node {  
  7.     NSLog(@"变为绿色:%@", node);  
  8. }  
  9.   
  10. // node是运行当前动作的节点  
  11. - (void)turnBlue:(id)node data:(void *)data {  
  12.     NSLog(@"变为蓝色,%@,%@", node, data);  
  13. }  
  14.   
  15. - (void)turnDone:(id)param {  
  16.     NSLog(@"变换完毕:%@", param);  
  17. }  
你会发现,精灵变为红色后 就会调用turnRed方法,变为绿色后会调用turnGreen:方法,变为蓝色后会先调用turnBlue:data:方法,最后调用turnDone:方法

最后做一个总结:

下面这几个类都会在运行动作时调用一个方法

CCCallFunc :调用方法时不传递参数

CCCallFuncN :调用方法时,可以传递1个参数,参数值是运行当前动作的节点

CCCallFuncND :调用方法时,可以传递2个参数,第1个参数是运行当前动作的节点,第2个参数是actionWithTarget:selector:data:方法中的data值

CCCallFuncO :调用方法时,可以传递1个参数,参数值是actionWithTarget:selector:object:方法中的object值


CCRepeatForever

CCRepeatForever直接继承自CCAction,可以不停地运行某个间隔动作(CCActionInterval)。

如果你想让精灵不停地旋转,可以这样写:

[java]  view plain copy
  1. // 1秒内顺时针旋转360°  
  2. CCRotateBy *rotate = [CCRotateBy actionWithDuration:1 angle:360];  
  3. // 使用CCRepeatForever重复CCRotateBy动作  
  4. CCRepeatForever *repeat = [CCRepeatForever actionWithAction:rotate];  
  5. [sprite runAction:repeat];  
也能够利 用CCRepeatForever重复一个动作序列(CCSequence)

[java]  view plain copy
  1. // 变为红色  
  2. CCTintTo *tintTo1 = [CCTintTo actionWithDuration:1 red:255 green:0 blue:0];  
  3. // 变为绿色  
  4. CCTintTo *tintTo2 = [CCTintTo actionWithDuration:1 red:0 green:255 blue:0];  
  5. // 变为蓝色  
  6. CCTintTo *tintTo3 = [CCTintTo actionWithDuration:1 red:0 green:0 blue:255];  
  7. CCSequence *sequence = [CCSequence actions:tintTo1, tintTo2, tintTo3, nil];  
  8.   
  9. CCRepeatForever *repeat = [CCRepeatForever actionWithAction:sequence];  
  10.   
  11. [sprite runAction:repeat];  

你会发现精灵的颜色状态是:红 -> 绿 -> 蓝 -> 红 -> 绿 -> 蓝 -> 红 ...,一直在红绿蓝3种颜色之间按顺序切换


CCSpeed

CCSpeed也是直接继承自CCAction,可以影响间隔动作(继承自CCActionInterval的动作)的运行速度

[java]  view plain copy
  1. // 1秒内顺时针旋转360°  
  2. CCRotateBy *rotate = [CCRotateBy actionWithDuration:1 angle:360];  
  3. // 速度变为原来的一半  
  4. CCSpeed *speed = [CCSpeed actionWithAction:rotate speed:0.5];  
  5. [sprite runAction:speed];  
本来 1秒就完成旋转的,设置speed为0.5后,就需要2秒才能 完成旋转
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wildfireli/article/details/23199667

智能推荐

5个超厉害的资源搜索网站,每一款都可以让你的资源满满!_最全资源搜索引擎-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏41次。生活中我们无时不刻不都要在网站搜索资源,但就是缺少一个趁手的资源搜索网站,如果有一个比较好的资源搜索网站可以帮助我们节省一大半时间!今天小编在这里为大家分享5款超厉害的资源搜索网站,每一款都可以让你的资源丰富精彩!网盘传奇一款最有效的网盘资源搜索网站你还在为找网站里面的资源而烦恼找不到什么合适的工具而烦恼吗?这款网站传奇网站汇聚了4853w个资源,并且它每一天都会持续更新资源;..._最全资源搜索引擎

Book类的设计(Java)_6-1 book类的设计java-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏18次。阅读测试程序,设计一个Book类。函数接口定义:class Book{}该类有 四个私有属性 分别是 书籍名称、 价格、 作者、 出版年份,以及相应的set 与get方法;该类有一个含有四个参数的构造方法,这四个参数依次是 书籍名称、 价格、 作者、 出版年份 。裁判测试程序样例:import java.util.*;public class Main { public static void main(String[] args) { List <Book>_6-1 book类的设计java

基于微信小程序的校园导航小程序设计与实现_校园导航微信小程序系统的设计与实现-程序员宅基地

文章浏览阅读613次,点赞28次,收藏27次。相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低学校的运营人员成本,实现了校园导航的标准化、制度化、程序化的管理,有效地防止了校园导航的随意管理,提高了信息的处理速度和精确度,能够及时、准确地查询和修正建筑速看等信息。课题主要采用微信小程序、SpringBoot架构技术,前端以小程序页面呈现给学生,结合后台java语言使页面更加完善,后台使用MySQL数据库进行数据存储。微信小程序主要包括学生信息、校园简介、建筑速看、系统信息等功能,从而实现智能化的管理方式,提高工作效率。

有状态和无状态登录

传统上用户登陆状态会以 Session 的形式保存在服务器上,而 Session ID 则保存在前端的 Cookie 中;而使用 JWT 以后,用户的认证信息将会以 Token 的形式保存在前端,服务器不需要保存任何的用户状态,这也就是为什么 JWT 被称为无状态登陆的原因,无状态登陆最大的优势就是完美支持分布式部署,可以使用一个 Token 发送给不同的服务器,而所有的服务器都会返回同样的结果。有状态和无状态最大的区别就是服务端会不会保存客户端的信息。

九大角度全方位对比Android、iOS开发_ios 开发角度-程序员宅基地

文章浏览阅读784次。发表于10小时前| 2674次阅读| 来源TechCrunch| 19 条评论| 作者Jon EvansiOSAndroid应用开发产品编程语言JavaObjective-C摘要:即便Android市场份额已经超过80%,对于开发者来说,使用哪一个平台做开发仍然很难选择。本文从开发环境、配置、UX设计、语言、API、网络、分享、碎片化、发布等九个方面把Android和iOS_ios 开发角度

搜索引擎的发展历史

搜索引擎的发展历史可以追溯到20世纪90年代初,随着互联网的快速发展和信息量的急剧增加,人们开始感受到了获取和管理信息的挑战。这些阶段展示了搜索引擎在技术和商业模式上的不断演进,以满足用户对信息获取的不断增长的需求。

随便推点

控制对象的特性_控制对象特性-程序员宅基地

文章浏览阅读990次。对象特性是指控制对象的输出参数和输入参数之间的相互作用规律。放大系数K描述控制对象特性的静态特性参数。它的意义是:输出量的变化量和输入量的变化量之比。时间常数T当输入量发生变化后,所引起输出量变化的快慢。(动态参数) ..._控制对象特性

FRP搭建内网穿透(亲测有效)_locyanfrp-程序员宅基地

文章浏览阅读5.7w次,点赞50次,收藏276次。FRP搭建内网穿透1.概述:frp可以通过有公网IP的的服务器将内网的主机暴露给互联网,从而实现通过外网能直接访问到内网主机;frp有服务端和客户端,服务端需要装在有公网ip的服务器上,客户端装在内网主机上。2.简单的图解:3.准备工作:1.一个域名(www.test.xyz)2.一台有公网IP的服务器(阿里云、腾讯云等都行)3.一台内网主机4.下载frp,选择适合的版本下载解压如下:我这里服务器端和客户端都放在了/usr/local/frp/目录下4.执行命令# 服务器端给执_locyanfrp

UVA 12534 - Binary Matrix 2 (网络流‘最小费用最大流’ZKW)_uva12534-程序员宅基地

文章浏览阅读687次。题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93745#problem/A题意:给出r*c的01矩阵,可以翻转格子使得0表成1,1变成0,求出最小的步数使得每一行中1的个数相等,每一列中1的个数相等。思路:网络流。容量可以保证每一行和每一列的1的个数相等,费用可以算出最小步数。行向列建边,如果该格子是_uva12534

免费SSL证书_csdn alphassl免费申请-程序员宅基地

文章浏览阅读504次。1、Let's Encrypt 90天,支持泛域名2、Buypass:https://www.buypass.com/ssl/resources/go-ssl-technical-specification6个月,单域名3、AlwaysOnSLL:https://alwaysonssl.com/ 1年,单域名 可参考蜗牛(wn789)4、TrustAsia5、Alpha..._csdn alphassl免费申请

测试算法的性能(以选择排序为例)_算法性能测试-程序员宅基地

文章浏览阅读1.6k次。测试算法的性能 很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见testSort()。【思想】:用clock_t计算某排序算法所需的时间,(endTime - startTime)/ CLOCKS_PER_SEC来表示执行了多少秒。【关于宏CLOCKS_PER_SEC】:以下摘自百度百科,“CLOCKS_PE_算法性能测试

Lane Detection_lanedetectionlite-程序员宅基地

文章浏览阅读1.2k次。fromhttps://towardsdatascience.com/finding-lane-lines-simple-pipeline-for-lane-detection-d02b62e7572bIdentifying lanes of the road is very common task that human driver performs. This is important ..._lanedetectionlite

推荐文章

热门文章

相关标签