天天看点

【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现动画进行时慢动作\设置游戏加减速进行

最近也一直在忙,所以也只能每周的某一天抽出时间来分享一些知识点给童鞋们,希望童鞋们体谅下~

         那么废话不多说了,本篇知识点两个:

               1.利用CCSpeed当精灵执行CCAnimate动作途中设置其播放的速度;

           2.设置游戏的速率,让你自由设置整个游戏的速度;

        首先介绍第一个知识点:

        对于第一个知识点,精灵执行CCAnimate动作途中设置播放速度,说白一点就是当主角或者怪物播放一套帧动作(动画)的时候,可能突然受到其他因素影响希望主角或者怪物等动作放慢,也就是慢动作的感觉,那么这时候我们就需要设置动作的播放速度拉,也就是今天要介绍的CCSpeed这个类;可能Himi这里哇哇哇的说这么多还是没亭台明白吧...=。 = 那么下面我们来看看代码等就应该明白了;

         直接上一段代码如下:

[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"animationsFrames.plist"];   

        CCSprite*mySprite=[CCSprite spriteWithSpriteFrameName:@"himi1.png"];   

        mySprite.position=ccp(120,150);   

        [self addChild:mySprite];    

        CCAnimation*anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];    

        CCAnimate* animate = [CCAnimate actionWithAnimation:anim];   

        CCSequence *seq = [CCSequence actions:animate,nil];    

        CCRepeatForever* repeat = [CCRepeatForever actionWithAction:seq];   

        [mySprite runAction:repeat];    

以上代码创建一个帧动画(帧资源都在animationFrames.plist加载到内存中了),然后创建一个精灵并让其永久循环执行这个帧动画;

  童鞋们想一想,如果在这个永久动作执行后,你想在一个任意时间设置这个动画播放的速度,那么就利用CCSpeed来实现了,代码如下:

//左侧正常速度的播放   

CCSprite*mySprite=[CCSprite spriteWithSpriteFrameName:@"himi1.png"];   

mySprite.position=ccp(120,150);   

[self addChild:mySprite];    

CCAnimation*anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];    

CCAnimate* animate = [CCAnimate actionWithAnimation:anim];   

CCSequence *seq = [CCSequence actions:animate,nil];    

//让你的永久动作放入speed中   

CCSpeed *speed =[CCSpeed actionWithAction:[CCRepeatForever actionWithAction:seq] speed:1.0f];   

[speed setTag:888];//设置tag能任意获取到其实例,并且对其进行操作   

[mySprite runAction:speed];   

这段代码和第一段代码不同点就是第二段将CCRepeatForever永久动作又包装到了CCSpeed中,整个动作等同与交给了CCSpeed来控制了,那么下面我还设置了[speed setTag:888];这个是留出接口,当你需要设置整个CCSpeed包装的动作速度的时候利用tag获取到,这个大家肯定很熟悉,那么获取动作方式如下:

CCSpeed *speed=(CCSpeed*)[sprite getActionByTag:88];   

获取的时候是你之前runAction的精灵来利用getActionByTag来获取的!

那么下面继续添加代码,我们让一个由CCSpeed包装一个帧动画并让精灵执行后的5秒后让其速度变成原有播放速度的一半,代码如下:

CCSprite *mySpriteByF =[CCSprite spriteWithSpriteFrameName:@"himi1.png"];   

mySpriteByF.position=ccp(360,150);   

[self addChild:mySpriteByF z:0 tag:66];    

anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];    

animate = [CCAnimate actionWithAnimation:anim];     

seq =[CCSequence actions:animate, nil];   

CCSpeed *speed =[CCSpeed actionWithAction:[CCRepeatForever actionWithAction:seq] speed:1.0f];    

[speed setTag:88];   

[mySpriteByF runAction:speed];   

[self schedule:@selector(slowForHimi) interval:5];  

-(void)slowForHimi{   

    [self unschedule:@selector(slowForHimi)];//解除此选择器   

    CCSprite*sprite=(CCSprite*)[self getChildByTag:66];   

    CCSpeed *speed=(CCSpeed*)[sprite getActionByTag:88];   

    [speed setSpeed:0.5];//放慢原有速度的0.5倍   

}   

CCSpeed的创建很简单,那么设置速率的方法如下:

[CCSpeed* setSpeed:XX];  

这里的XX参数指的是倍率,传入1表示原速,大于1表示增快,小于1表示放慢速度~

下面直接给出全部测试项目代码:

//   

//  HelloWorldLayer.m   

//  SLowAnimationByHimi   

//  Created by 华明 李 on 11-11-21.   

//  Copyright Himi 2011年. All rights reserved.   

// Import the interfaces   

#import "HelloWorldLayer.h"   

#import "CCAnimationHelper.h"   

// HelloWorldLayer implementation   

@implementation HelloWorldLayer   

+(CCScene *) scene   

{   

    // 'scene' is an autorelease object.   

    CCScene *scene = [CCScene node];   

    // 'layer' is an autorelease object.   

    HelloWorldLayer *layer = [HelloWorldLayer node];   

    // add layer as a child to scene   

    [scene addChild: layer];   

    // return the scene   

    return scene;   

//CCJumpTo实现,抛物线   

// on "init" you need to initialize your instance   

-(id) init{   

    if( (self=[super init])) {   

        CCLabelTTF *label = [CCLabelTTF labelWithString:@"暂缓动作&设置整个游戏加速/减速" fontName:@"Marker Felt" fontSize:24];   

        label.position =  ccp(260,260);   

        [self addChild: label z:0  ];    

        label = [CCLabelTTF labelWithString:@"正常速度的播放" fontName:@"Marker Felt" fontSize:12];   

        label.position =  ccp(120,220);   

        [self addChild: label z:0 tag:99];    

        label = [CCLabelTTF labelWithString:@"左侧动态放慢的速度的动作" fontName:@"Marker Felt" fontSize:12];   

        label.position =  ccp(350,220);   

        [[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"animationsFrames.plist"];   

        //左侧正常速度的播放   

        //左侧动态放慢的速度的动作    

        CCSprite *mySpriteByF =[CCSprite spriteWithSpriteFrameName:@"himi1.png"];   

        mySpriteByF.position=ccp(360,150);   

        [self addChild:mySpriteByF z:0 tag:66];    

        anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];    

        animate = [CCAnimate actionWithAnimation:anim];     

        seq =[CCSequence actions:animate, nil];   

        CCSpeed *speed =[CCSpeed actionWithAction:[CCRepeatForever actionWithAction:seq] speed:1.0f];    

        [speed setTag:88];   

        [mySpriteByF runAction:speed];   

        [self schedule:@selector(slowForHimi) interval:5];   

    }   

    return self;   

// on "dealloc" you need to release all your retained objects   

- (void) dealloc   

    // in case you have something to dealloc, do it in this method   

    // in this particular example nothing needs to be released.   

    // cocos2d will automatically release all the children (Label)   

    // don't forget to call "super dealloc"   

    [super dealloc];   

@end   

运行截图如下:  (图片中有个"左"写错了,应该是"右",懒得改了,大家知道就行了 娃哈哈)

<a target="_blank" href="http://blog.51cto.com/attachment/201111/220954179.png"></a>

从截图中可能童鞋们看不出什么效果。等文章最后放出源码,大家运行就可以看到效果了-。 -  

    Himi当时做的时候因为用CCSpeed方式有问题一直不行,就去改了源码弄的。后来才发现CCSpeed正确用法,我去了=。 =

这里Himi必须强调一点!!!!!!!

    很多时候你的主角的动作利用CCAction来实现,移动则是在update刷帧函数或者一些选择器的方法中进行的,那么为了让你的主角慢动作比较逼真,那么Himi建议不要使用scheduleUpdate函数,因为这个你无法修改每次调用update的时间默认都是每帧都调用,那么你应该自己定义一个选择器当刷逻辑的函数,这样就能配合CCSpeed实现逼真慢动作拉~

  下面我们来介绍第二个知识点:设置游戏速度

    对于游戏速度最常见的出现在塔防游戏中,当玩家创建好防守的东东后开始出怪后,可能怪物移动速度慢,而玩家着急看到结果,那么我们就会人性化的加上加快游戏速度的按钮拉~那么这个功能在Cocos2d引擎中封装好的,一句代码即可完成,如下代码即可:

[[CCScheduler sharedScheduler] setTimeScale:XX];   

这里的XX仍然是倍率:传入1表示原速,大于1表示增快,小于1表示放慢速度~

      OK,本篇就到此~

本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/723894,如需转载请自行联系原作者

继续阅读