zoukankan      html  css  js  c++  java
  • cocos2d里的各种动作(转载)

    通常调用某个动作的方法: 

    1 // 创建动作
    2  id actionTo = [CCMoveTo actionWithDuration: 2 position:ccp(s.width-40, s.height-40)];
    3  
    4 // 使用动作。(说明:tamara 是一个 CCSprite。)
    5 [tamara runAction: actionTo];


    瞬时动作

    顾名思义。瞬时动作就是不需要时间,马上就完成的动作。瞬时动作的共同基类是 InstantAction。

    放置 – Place 

    效果类似于 node.Position = ccp(x, y)。之所以作为一个动作来实现是为了可以与其他动作形成一个连续动作。

    示例:

    1 - (void) OnPlaceMenue:(id) sender {
    2 CGSize s = [[CCDirector sharedDirector] winSize];
    3 CGPoint p = ccp(CCRANDOM_0_1() * s.width, CCRANDOM_0_1() * s.height);
    4 [sprite runAction:[CCPlace actionWithPosition:p]];
    5 }

     隐藏 – Hide

    效果类似于 [node setVisible:NO]. 

    示例:


    1 - (void) OnHideMenue:(id) sender {
    2 [sprite runAction:[CCHide action]];
    3 }

    显示 – Show

    效果类似于 [node setVisible:YES]. 

    示例:


    1 - (void) OnShowMenue:(id) sender {
    2 [sprite runAction:[CCShow action]];
    3 }

    可见切换 – ToggleVisibility 

    代码如下:


    1 - (void) OnToggleMenue:(id) sender {
    2 [sprite runAction:[CCToggleVisibility action]];
    3 }

    延时动作

    延时动作就是动作的完成需要一定时间。因此,actionWithDuration 是延时动作执行时的第一个参数,延时动作的共同基类是 CCIntervalAction。

    函数的命名规则:

    ***To: 意味着运动到指定的位置。 

    ***By:意味着运动到按照指定癿 x、y 增量的位置。(x、y 可以是负值)

    移动到 – CCMoveTo 

    移动– CCMoveBy 

    跳跃到 – CCJumpTo

    设置终点位置和跳跃癿高度和次数。

    跳跃 – CCJumpBy

    设置终点位置和跳跃癿高度和次数。 

    贝塞尔 – CCBezierBy

    支持 3 次贝塞尔曲线:P0-起点,P1-起点切线方向,P2-终点切线方向,P3-终点。

    首先设置定 Bezier 参数,然后执行。

    放大到 – CCScaleTo

    设置放大倍数,是浮点型。

    放大 – CCScaleBy 

    旋转到 – CCRotateTo 

    旋转 – CCRotateBy 

    闪烁 – CCBlink

    设定闪烁次数

    色调变化到 – CCTintTo 

    色调变换 – CCTintBy 

    变暗到 – CCFadeTo 

    由无变亮 – CCFadeIn

    由亮变无 – CCFadeOut


    组合动作

    按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作。组合动作包括以 下几类:

    序列 – CCSequence

    主要作用就是线序排列若干个动作,然后按先后次序逐个执行。


    01 - (void) OnSequence:(id) sender {
    02 CGSize s = [[CCDirector sharedDirector] winSize];
    03 CGPoint p = ccp(s.width/2, 50);
    04 // 创建5个动作
    05 id ac0 = [sprite runAction:[CCPlace actionWithPosition:p]];
    06 id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)];
    07 id ac2 = [CCJumpTo actionWithDuration:2 position:ccp(150, 50) height:30 jumps:5];
    08 id ac3 = [CCBlink actionWithDuration:2 blinks:3];
    09 id ac4 = [CCTintBy actionWithDuration:0.5 red:0 green:255 blue:255];
    10 //将 5 个动作组合为一个序列,注意不要忘了用 nil 结尾。
    11 [sprite runAction:[CCSequence actions:ac0, ac1, ac2, ac3, ac4, ac0, nil]];
    12 }

    同步 – Spawn Spawn 

    作用就是同时并列执行若干个动作,但要求动作都必须是可以同时执行的。比如:移动式翻转、变色、变大小等。

    需要特别注意的是,同步执行最后的完成时间由基本动作中用时最大者决定。


    01 - (void) OnSpawn:(id) sender {
    02 CGSize s = [[CCDirector sharedDirector] winSize];
    03 CGPoint p = ccp(s.width/2, 50);
    04 sprite.rotation = 0;
    05 [sprite setPosition:p];
    06 // 创建 4 个需要并行的动作,确保动作用时可组合。2 – 2 - (1+1)
    07 id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)];
    08 id ac2 = [CCRotateTo actionWithDuration:2 angle:180];
    09 id ac3 = [CCScaleTo actionWithDuration:1 scale:4];
    10 id ac4 = [CCScaleBy actionWithDuration:1 scale:0.5];
    11 id seq = [CCSequence actions:ac3, ac4, nil];
    12 // 同步动作和组合动作以形成一个连续的新动作。
    13 [sprite runAction:[CCSpawn actions:ac1, ac2, seq, nil]];
    14

    重复有限次数 – Repeate

    重复有限的次数的动作示例代码如下:

    01 - (void) OnRepeat:(id) sender {
    02 CGSize s = [[CCDirector sharedDirector] winSize];
    03 CGPoint p = ccp(s.width/2, 50);
    04 sprite.rotation = 0;
    05 [sprite setPosition:p];
    06 // 创建动作序列
    07 id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)];
    08 id ac2 = [CCJumpBy actionWithDuration:2 position:ccp(-400, -200) height:30 jumps:5];
    09 id ac3 = [CCJumpBy actionWithDuration:2 position:ccp(s.width/2, 0) height:20 jumps:3];
    10 id seq = [CCSequence actions:ac1, ac2, ac3, nil];
    11 //重复运行上述劢作序列 3 次。
    12 [sprite runAction:[CCRepeat actionWithAction:seq times:3]];
    13 }

    反动作 – Reverse

    反动作就是反向(逆向)执行某个动作,支持针对动作序列的反动作序列。反动作不是一个专门的类,而是 CCFiniteAction 引入的一个接口。不是所有的类都支持反动作,XxxxTo 类通常不支持反动作,XxxxBy 类通常支持。示例如下:

    01 - (void) OnReverse:(id) sender {
    02 CGSize s = [[CCDirector sharedDirector] winSize];
    03 CGPoint p = ccp(s.width/2, 50);
    04 sprite.rotation = 0;
    05 [sprite setPosition:p];
    06 id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(190, 220)];
    07 // 创建某个劢作癿反劢作。
    08 id ac2 = [ac1 reverse];
    09 [sprite runAction:[CCRepeat actionWithAction:[CCSequence actions:ac1, ac2,nil] times:2]];
    10 }

    动画 – Animation

    动画就是让精灵自身的连续执行一段影像,形成模拟运动的效果:行走时动精灵状态、打斗时的状态等。

    01 - (void) OnAnimation:(id) sender {
    02 CCAnimation *animation = [AtlasAnimation animationWithName:@"flight" delay:0.2f];
    03 // 每帧的内容定义。
    04 for(int i=0;i<3;i++) {
    05 int x= i % 3;
    06 [animation addFrameWithRect: CGRectMake(x*32, 0, 31,30) ];
    07 }
    08 // 执行劢画效果
    09 id action = [CCAnimate actionWithAnimation: animation];
    10 [sprite runAction:[CCRepeat actionWithAction:action times:10]];
    11 }

    无限重复 – RepeatForever 

    RepeatForever 是从 Action 类直接派生的,因此无法参于序列和同步;自身也无法反向执行。该类的作用就是无限期执行某个动作或动作序列,直到被停止。

    01 - (void) OnRepeatForever:(id) sender {
    02 CGSize s = [[Director sharedDirector] winSize];
    03 CGPoint p = ccp(100, 50);
    04 // 飞行喷火模拟劢画
    05 CCAnimation *animation = [CCAnimation animationWithName:@"flight" delay:0.1f];
    06 for(int i=0;i<3;i++)
    07 {
    08  int x= i % 3;
    09 [animation addFrameWithRect: CGRectMake(x*32, 0, 31,30) ];
    10 }
    11 id action = [CCAnimate actionWithAnimation: animation];
    12 // 将该动画作为精灵的本征动画,一直运行。
    13 [sprite runAction:[RepeatForever actionWithAction:action]];
    14 // 在创建第二个连续无限期动作序列。叠加二者形成完整效果。
    15 ccBezierConfig bezier;
    16 sprite.rotation = 0;
    17 [sprite setPosition:p];
    18 bezier.startPosition = ccp(0,0);
    19 bezier.controlPoint_1 = ccp(0, s.height/2);
    20 bezier.controlPoint_2 = ccp(300, -s.height/2);
    21 bezier.endPosition = ccp(300,100);
    22 id ac10 = [CCBezierBy actionWithDuration:3 bezier:bezier];
    23 id ac11 = [CCTintBy actionWithDuration:0.5 red:0 green:255 blue:255];
    24 id ac1 = [CCSpawn actions:ac10, [Repeat actionWithAction:ac11 times:4], nil];
    25 id ac2 = [CCSpawn actions:[ac10 reverse], [CCRepeat actionWithAction:ac11 times:4], nil];
    26 // 第二个无限期连续运劢。
    27 [sprite runAction:[CCRepeatForever actionWithAction:[CCSequence actions:ac1, ac2,nil]]];
    28 }

    速度变化

    基本动作和组合动作实现了针对精灵的各种运动、动画效果的改变,但这样的改变的速度是不变的,通过 CCEaseAction 为基类的类系和 CCSpeed 类我们可以很方便的修改精灵执行动作的速度:由快至慢还是由慢至快

    EaseIn 由慢至快。

    EaseOut 由快至慢

    EaseInOut 由慢至快再由快至慢。

    EaseSineIn 由慢至快

    EaseSineOut 由快至慢

    EaseSineInOut 由慢至快再由快至慢。

    EaseExponentialIn 由慢至极快。

    EaseExponentialOut 由极快至慢。

    EaseExponentialInOut 由慢至极快再由极快至慢。

    Speed 人工设定速度,还可通过 SetSpeed 不断调整。

    扩展动作

    我们已经掌握了执行各种各样的动作,也可以按照不同的快慢修改动作执行的时间, Cocos2D-iPhone 还提供了针对现有动作的扩展,以实现各种灵活的效果。

    延时动作 – Delay 

    在动作序列中增加一个时间间歇:

    1 - (void) OnDelay:(id) sender {
    2 id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];
    3 id ac2 = [ac1 reverse];
    4 // 实现一个等待间歇
    5 [spriterunAction:[Sequenceactions:ac1,[DelayTime actionWithDuration:1], ac2, nil]];
    6 }

    函数调用 函数

    在动作序列中间或者结束调用某个函数,执行任何需要执行的任务:动作、状态修改等。代码如下:

    1 - (void) OnCallFunc:(id) sender {
    2 id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];
    3 id ac2 = [ac1 reverse];
    4 id acf = [CCCallFunc actionWithTarget:self selector:@selector(CallBack1)];
    5 [sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]];
    6 }

    对应的函数为:(再做一个动作,这就实现了动作、动作序列的任意扩展和连接)

    1 - (void) CallBack1 {
    2 [sprite runAction:[CCTintBy actionWithDuration:0.5 red:255 green:0 blue:255]];
    3 }

    带对象参数 调用自定义函数时,传递当前对象。

    1 - (void) OnCallFuncN:(id) sender {
    2 id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];
    3 id ac2 = [ac1 reverse];
    4 id acf = [CallFuncN actionWithTarget:self selector:@selector(CallBack2:)];
    5 [sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]];
    6 }

    对应的自定义函数:(这里,我们直接使用了该对象)

    1 - (void) CallBack2:(id)sender {
    2 [sender runAction:[CCTintBy actionWithDuration:1 red:255 green:0 blue:255]];
    3 }

    带对象、数据参数调用自定义函数时,传递当前对象和一个常量(也可以是指针)。

    1 - (void) OnCallFuncND:(id) sender {
    2 id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];
    3 id ac2 = [ac1 reverse];
    4 id acf = [CCCallFuncND actionWithTarget:self selector:@selector(CallBack3:data:) data:(void*)2];
    5 [sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]];
    6 }

    对应的自定义函数,我们使用了传递的对象和数据:

    1 -(void) CallBack3:(id)sender data:(void*)data {
    2 [sender runAction:[CCTintBy actionWithDuration:(NSInteger)data red:255 green:0 blue:255]]; }
    
  • 相关阅读:
    Atitit 人脸识别 眼睛形态 attilax总结
    Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
    atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
    Atititi atiitt eam pam资产管理 购物表去年.xlsx
    使用cmd查看电脑连接过的wifi密码(一)
    常见十大web攻击手段 悟寰轩
    常见web攻击方式 悟寰轩
    【MYSQL数据库】MYSQL学习笔记mysql分区基本操作 悟寰轩
    Filter及FilterChain的使用详解 悟寰轩
    启动tomcat spring初始化两次问题(eg:@PostConstruct) 悟寰轩
  • 原文地址:https://www.cnblogs.com/jeekun/p/2032921.html
Copyright © 2011-2022 走看看