【IOS-COCOS2D游戏开发之二十二 】CCSPEED实现CCANIMATE动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 

转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/532.html

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

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

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

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

首先介绍第一个知识点:

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

至于精灵如何利用CCAnimate实现帧集合动画教程在之前已经讲述过,那么这里就不在赘述,如果还不清楚如何利用很多帧形成动画让精灵播放的童鞋请移步到:【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧(指定开始帧)以及扩展Cocos2d源码的CCAnimation简化动画创建!

直接上一段代码如下:

1

2

3

4

5

6

7

8

9

10

[[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来实现了,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

[[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];

//让你的永久动作放入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获取到,这个大家肯定很熟悉,那么获取动作方式如下:

1

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

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

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

1

2

3

4

5

6

7

8

9

10

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];

1

2

3

4

5

6

-(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的创建很简单,那么设置速率的方法如下:

1

[CCSpeed* setSpeed:XX];

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

//

//  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);

        [self addChild: label z:0  ];  

 

        [[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];  

 

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

        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;

}  

 

-(void)slowForHimi{

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

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

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

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

}  

 

// 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

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

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

   这里备注下:除了利用CCSpeed来实现慢动作之外,还有其他的一些方法,不怕麻烦的童鞋甚至可以尝试当需要慢动作的时候,取出当前的帧下标,然后利用指定帧下标的方法创建一个新的帧动画同时增加播放时间即可;(在上一节《iOS-Cocos2d游戏开发之二十一》中Himi封装了一个指定帧下标进行创建帧动画的方法,还没有看过的童鞋请移步到这里:【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧(指定开始帧)以及扩展Cocos2d源码的CCAnimation简化动画创建!);再或者直接去修改Cocos2d-iphone引擎的源码;

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

    

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

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


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

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

1

[[CCScheduler sharedScheduler] setTimeScale:XX];

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

OK,本篇就到此~

     源码下载: “SLowAnimationByHimi.rar”      下载地址:  http://vdisk.weibo.com/s/hq3bF

时间: 2024-12-21 06:26:24

【IOS-COCOS2D游戏开发之二十二 】CCSPEED实现CCANIMATE动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)!的相关文章

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十二)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十二)重构 – 让代码插上翅膀自由飞翔 上一节,我将游戏地图模式进行了一次重大的变动,这在实际开发中意味着项目大规模重置,虽然表面上显得游刃有余,仅仅一个AllMove()方法的改变即实现了完美转型,这全得归功于前20节所搭建起的相对高度可扩展平台.但是,随着开发不断深入,我慢慢的感到些许的不安,因为代码上的日益松散与结构的渐渐稀疏如同Windows系统的磁盘碎片与日俱增,未来维护时的烦琐与痛心疾首已历历在目

Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

原文:Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明 紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAuth2.0的运作模式: 从上图我们可以看到,整个过程进行了2次"握手",最终利用授权的AccessToken进行一系列的请求,相关的过程说明如下: A:由客户端向服务器发出验证请求,请求中

Android简明开发教程二十二:使用资源Resources

在前面的例子中,我们忽略了一个重要的原则,在代码和Layout中,直接使用了字符串常量,比如: <Button android:text="Pattern" android:id="@+id/btnPattern" android:layout_width="wrap_content" android:textColor="@color/black" android:checked="true" an

Windows 8开发入门(十二) windows 8的文件管理 1

File创建和String Stream Buffer方式读写 在本文中我们将学习Windows 8中的文件创建和多种读写方式以及设置文档库访问权限和文件类型的访问. 当然我们需要做以下准备工作: 首先:设置程序允许访问的文件位置为:"库\文档",设置方法:点击"Package.appxmanifest ",然后选择"功能"选项卡,在功能列表中勾选"文档库访问".如下图: 开发入门(十二) windows 8的文件管理 1-w

Windows 8风格应用开发入门 二十二 MessageDialog

MessageDialog概述 MessageDialog指的就是对话框. 对话框的命令栏中最多包含三个命令.如果我们指定任何命令,将会有一个默认命令添加到对话框中,目的是关闭对话框. 对话框弹出后界面中所有元素将在对话框下面显示,并且将会阻塞任何触摸事件直到用户进行响应对话框. 另外对话框应该尽量少用. 注意:Windows 8风格应用中取消了MessageBox对象,取而代之的是MessageDialog对象. MessageDialog常用属性和方法 MessageDialog类包含两类构

Android开发入门(十二)列表控件 12.3 ListView的总结范例

使用一个例子,来总结一下ListView的基本使用. 1. 新建一个工程:ListViewDemo. 2. main.xml中的代码. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_pare

Android开发入门(十二)列表控件 12.2 ListView的扩展功能

ListView是一个可以被深度扩展的视图.在做项目的时候,扩展ListView去显示数据是必不可免的.接下 来会展示如何在ListView中去选择多个物件,以及如何使用ListView的"过滤"功能. 1. 使用上一 节的工程:BasicViews5. 2. 在BasicViews5Activity.java中添加一些代码. String[] presidents; /** Called when the activity is first created. */ @Override

Android开发入门(十二)列表控件 12.1 ListView的基本使用

今天总结一下Android中的列表控件:ListView和Spinner. ListView可以垂直并可滑动地地显示 一些信息.下面阐述如何使用ListView显示一系列的信息. 1. 创建一个工程:BasicViews5. 2. strings.xml中的代码. <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">He

UWP开发入门(十二)——神器Live Visual Tree

原文:UWP开发入门(十二)--神器Live Visual Tree 很久以前,我们就有Snoop这样的工具实时修改.查看正在运行的WPF程序,那时候调个样式,修改个模板,相当滋润.随着历史的车轮陷进WP的泥潭中,无论WP7的Silverlight还是WP8.1的runtime,偶们都不能方便快捷的查看APP的可视化树(Visual Tree)了,呜呼哉,是可忍孰不可忍放下筷子就骂微软.没想到Visual Studio 2015倒是给了我们一个惊喜,自带了一套非常强大的调试工具Live Visu