cocos2d 研究第二天(动作)

今天主要搞的动作:

下面的代码是通常调用某个动作的方法:

// 创建动作
id actionTo = [CCMoveTo actionWithDuration: 2 position:ccp(s.width-40, s.height-40)];

// 使用动作。(说明:tamara 是一个 CCSprite。)

[tamara runAction: actionTo];

//如果要重复使用某个动作,需要考虑手工 retain

 

三个方面来介绍动作

一。瞬时动作

 

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

 

 

              放置 – Place

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

- (void) OnPlaceMenue:(id) sender {

CGSize s = [[CCDirector sharedDirector] winSize];

CGPoint p = ccp(CCRANDOM_0_1() * s.width, CCRANDOM_0_1() * s.height);

[sprite runAction:[CCPlace actionWithPosition:p]]; }

 

  •   隐藏 – Hide

    效果类似于 [node setVisible:NO]. 之所以作为一个动作来实现是为了可以与其

        他动作形成一个连续动作。下面为示例代码:
    

    - (void) OnHideMenue:(id) sender {

    [sprite runAction:[CCHide action]]; }

  •   显示 – Show

    效果类似于 [node setVisible:YES]. 之所以作为一个动作来实现是为了可以与其

        他动作形成一个连续动作。下面为示例代码:
    

    - (void) OnShowMenue:(id) sender {

    [sprite runAction:[CCShow action]]; }

  •   可见切换 – ToggleVisibility 代码如下:

    - (void) OnToggleMenue:(id) sender {

    [sprite runAction:[CCToggleVisibility action]]; }

 

二。延时动作

 

延时动作就是指动作的完成需要一定时间。因此,actionWithDuration 是延时动作执 行时的第一个参数,延时动作的共同基类是 CCIntervalAction(包含了组合动作类)

 

Cocos2d-iPhone 提供以下瞬时动作:(示例代码 G04 中的 IntervalActionLayer 实现 了下面的代码)。函数命名规则是:

XxxxTo: 意味着运动到指定的位置。
XxxxBy:意味着运动到按照指定的 xy 增量的位置。(xy 可以是负值)

  •   移动到 – CCMoveTo

  •   移动– CCMoveBy

  •   跳跃到 – CCJumpTo

      设置终点位置和跳跃的高度和次数。
    
  •   跳跃 – CCJumpBy

      设置终点位置和跳跃的高度和次数。
    
  •   贝塞尔 – CCBezierBy

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

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

           放大到 – CCScaleTo

  设置放大倍数,是浮点型。
  •   放大 – CCScaleBy

  •   旋转到 – CCRotateTo

  •   旋转 – CCRotateBy

  •   闪烁 – CCBlink

    设定闪烁次数

  •   色调变化到 – CCTintTo

  •   色调变换 – CCTintBy

  •   变暗到 – CCFadeTo

  •   由无变亮 – CCFadeIn

  •   由亮变无 – CCFadeOut

三。组合动作

 

  1. 序列 – CCSequence

 

Sequence 的使用非常简单,该类也从 CCIntervalAction 派生,本身就可以被 CocosNode 对象执行。该类的作用就是线序排列若干个动作,然后按先后次序逐个执行。

- (void) OnSequence:(id) sender {

CGSize s = [[CCDirector sharedDirector] winSize]; CGPoint p = ccp(s.width/2, 50);

// 创建5个动作

id ac0 = [sprite runAction:[CCPlace actionWithPosition:p]];

id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)];

id ac2 = [CCJumpTo actionWithDuration:2 position:ccp(150, 50) height:30 jumps:5];

id ac3 = [CCBlink actionWithDuration:2 blinks:3];

id ac4 = [CCTintBy actionWithDuration:0.5 red:0 green:255 blue:255];

//5 个动作组合为一个序列,注意不要忘了用 nil 结尾。

[sprite runAction:[CCSequence actions:ac0, ac1, ac2, ac3, ac4, ac0, nil]];

}

同步 – Spawn
Spawn
的使用非常简单,该类也从 IntervalAction 派生,本身就可以被

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

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

- (void) OnSpawn:(id) sender {

CGSize s = [[CCDirector sharedDirector] winSize]; CGPoint p = ccp(s.width/2, 50);

          sprite.rotation = 0;
          [sprite setPosition:p];

// 创建 4 个需要并行的动作,确保动作用时可组合。2 2 - (1+1)

id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)];

id ac2 = [CCRotateTo actionWithDuration:2 angle:180];

id ac3 = [CCScaleTo actionWithDuration:1 scale:4];
id ac4 = [CCScaleBy actionWithDuration:1 scale:0.5];

 

 

id seq = [CCSequence actions:ac3, ac4, nil];

// 同步 动作和组合动作 以形成一个连续的新动作。
[sprite runAction:[CCSpawn actions:ac1, ac2, seq, nil]];

}

  •   重复有线次数 – Repeate

    重复有限的次数的动作,该类也从 IntervalAction 派生,可以被 CocosNode

    象执行。示例代码如下:

    - (void) OnRepeat:(id) sender {

    CGSize s = [[CCDirector sharedDirector] winSize]; CGPoint p = ccp(s.width/2, 50);

           sprite.rotation = 0;
           [sprite setPosition:p];
    

    // 创建动作序列

    id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)];

    id ac2 = [CCJumpBy actionWithDuration:2 position:ccp(-400, -200) height:30 jumps:5];

    id ac3 = [CCJumpBy actionWithDuration:2 position:ccp(s.width/2, 0) height:20 jumps:3];

    id seq = [CCSequence actions:ac1, ac2, ac3, nil];

    // 重复运行上述动作序列3次。

    [sprite runAction:[CCRepeat actionWithAction:seq times:3]];

    }

  •   反动作 – Reverse

    反动作就是反向(逆向)执行某个动作,支持针对动作序列的反动作序列。反动作

    不是一个专门的类,而是 CCFiniteAction 引入的一个接口。不是所有的类都支持

    反动作,XxxxTo 类通常不支持反动作,XxxxBy 类通常支持。示例如下:

    - (void) OnReverse:(id) sender {

    CGSize s = [[CCDirector sharedDirector] winSize];

    CGPoint p = ccp(s.width/2, 50);

           sprite.rotation = 0;
           [sprite setPosition:p];
    

    id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(190,220)];

     

// 创建某个动作的反动作。 id ac2 = [ac1 reverse];

[sprite runAction:[CCRepeat actionWithAction:[CCSequence actions:ac1, ac2,nil] times:2]];

}

  •   动画 – Animation

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

    态、打斗时的状态等。

    - (void) OnAnimation:(id) sender {

    CCAnimation *animation = [AtlasAnimation animationWithName:@"flight" delay:0.2f];

    // 每帧的内容定义。 for(int i=0;i<3;i++) {

    int x= i % 3;

    [animation addFrameWithRect: CGRectMake(x*32, 0, 31, 30) ];

    }

    // 执行动画效果
    id action = [CCAnimate actionWithAnimation: animation]; [sprite runAction:[CCRepeat actionWithAction:action

    times:10]];

    }

  •   无限重复 – RepeatForever
    RepeatForever
    是从 Action 类直接派生的,因此无法参与序列和同步;自身也无

    法反向执行。该类的作用就是无限期执行某个动作或动作序列,直到被停止。

    - (void) OnRepeatForever:(id) sender
    {
        CGSize s = [[CCDirector sharedDirector] winSize];
        CGPoint p = ccp(10, 10);
        
        CCSpriteBatchNode *mgr = (CCSpriteBatchNode *)[self getChildByTag:4];
        
        CCSpriteFrame * frame = [CCSpriteFrame frameWithTexture:mgr.texture rect:CGRectMake(0, 0, 31, 30)];
        NSArray * array = [[NSArray alloc] initWithObjects:frame, nil];
        CCAnimation * animation = [CCAnimation animationWithFrames:array delay:0.1f];
        for (int i = 0; i < 3; i++) {
            int x= i%3;
            [animation addFrameWithTexture:mgr.texture rect:CGRectMake(x*32, 0, 31, 30)];
        }
        
    //    CCAnimation *animation = [CCAnimation animationWithName:@"flight" delay:0.1f];
    //    for(int i=0;i<3;i++) {
    //        int x= i % 3;
    //        [animation addFrameWithTexture:mgr.texture rect:CGRectMake(x*32, 0, 31, 30) ];
    //    }        
        
        id action = [CCAnimate actionWithAnimation: animation];
        
        [sprite runAction:[CCRepeatForever actionWithAction:action]];            
        
        ccBezierConfig bezier;        
        
        sprite.rotation = 0;
        [sprite setPosition:p];
        
            //bezier.startPosition = ccp(0,0);
        NSLog(@"s %@",NSStringFromCGSize(s));
        bezier.controlPoint_1 = ccp(0, s.height/2);
        bezier.controlPoint_2 = ccp(300, -s.height/2);
        bezier.endPosition = ccp(100,100);
        
        id ac10 = [CCBezierBy actionWithDuration:3 bezier:bezier];
        id ac11 = [CCTintBy actionWithDuration:0.5 red:0 green:255 blue:255];
        
        id ac1 = [CCSpawn actions:ac10, [CCRepeat actionWithAction:ac11 times:1], nil];
        id ac2 = [CCSpawn actions:[ac10 reverse], [CCRepeat actionWithAction:ac11 times:1], nil];
        
        
        [sprite runAction:[CCRepeatForever actionWithAction:[CCSequence actions:ac1, ac2,nil]]];
        
        /*    
         id ac2 = [JumpBy actionWithDuration:2 position:ccp(-400, -200) height:30 jumps:5];
         id ac3 = [JumpBy actionWithDuration:2 position:ccp(s.width/2, 0) height:20 jumps:3];
        
         id seq = [Sequence actions:ac1, ac2, ac3, nil];
        
         [sprite runAction:[Repeat actionWithAction:seq times:3]];
         */    
        
    }

动画中都会有速度的控制

下面介绍下速度动画
  •   EaseIn 由慢至快。

  •   EaseOut 由快至慢

  •   EaseInOut 由慢至快再由快至慢。

  •   EaseSineIn 由慢至快。

  •   EaseSineOut 由快至慢

  •   EaseSineInOut 由慢至快再由快至慢。

  •   EaseExponentialIn 由慢至极快。

  •   EaseExponentialOut 由极快至慢。

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

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

 

最后剩下的就是扩展动作:

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

- (void) OnDelay:(id) sender

{
id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200,

   200)];
       id ac2 = [ac1 reverse];

// 实现一个等待间歇

[sprite runAction:[Sequence actions:ac1, [DelayTime actionWithDuration:1], ac2, nil]];
}

函数调用函数

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

- (void) OnCallFunc:(id) sender {

id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];

       id ac2 = [ac1 reverse];

id acf = [CCCallFunc actionWithTarget:self selector:@selector(CallBack1)];

[sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]];

}

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

- (void) CallBack1

{
[sprite runAction:[CCTintBy actionWithDuration:0.5

red:255 green:0 blue:255]]; }

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

- (void) OnCallFuncN:(id) sender {

id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];

   id ac2 = [ac1 reverse];

id acf = [CallFuncN actionWithTarget:self selector:@selector(CallBack2:)];

[sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]];

}

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

- (void) CallBack2:(id)sender

{
[
sender runAction:[CCTintBy actionWithDuration:1 red:255

green:0 blue:255]];
}

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

- (void) OnCallFuncND:(id) sender {

id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];

   id ac2 = [ac1 reverse];

id acf = [CCCallFuncND actionWithTarget:self selector:@selector(CallBack3:data:) data:(void*)2];

[sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]];

}

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

-(void) CallBack3:(id)sender data:(void*)data

{
[
sender runAction:[CCTintBy

actionWithDuration:(NSInteger)data red:255 green:0 blue:255]];
}

 

 

posted on 2012-11-13 18:47  罗凇  阅读(181)  评论(0编辑  收藏  举报