iOS-Cocos2d游戏开发之二十一自定义精灵类并为你的精灵设置攻击帧以及动画创建二

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

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

下面Himi来介绍第二个知识点:两种方式让精灵利用多帧播放动画

      Himi这里就不细说了,直接提供给大家Himi封装好的两个方法:(Himi使用的cocos2d-iphone版本是1.0.0)

    先唠叨一句,刚才上面说过了,创建精灵一种是利用直接索引文件名字来创建,另外一种就是直接利用帧缓存来创建,那么让一个精灵实现动画的播放当然也一样对应分为两种方式;直接上代码:

                   CCAnimationHelper.h

  1. //   
  2. //  CCAnimationHelper.h   
  3. //  SpriteProject   
  4. //   
  5. //  Created by Himi on 11-8-6.   
  6. //  Copyright 2011 __MyCompanyName__. All rights reserved.   
  7. //   
  8. #import "cocos2d.h"   
  9. @interface CCAnimation (Helper)   
  10. //直接索引图片名称   
  11. +(CCAnimation*) animationWithFile:(NSString*)name frameCount:(int)frameCount delay:(float)delay;   
  12. //利用帧缓存中的帧名称   
  13. +(CCAnimation*) animationWithFrame:(NSString*)frame frameCount:(int)frameCount delay:(float)delay;   
  14. @end   

 CCAnimationHelper.m

  1. //  CCAnimationHelper.m   
  2. //  SpriteProject   
  3. //   
  4. //  Created by Himi    
  5. #import "CCAnimationHelper.h"   
  6. @implementation CCAnimation (Helper)   
  7. //直接索引图片名称   
  8. +(CCAnimation*) animationWithFile:(NSString*)name frameCount:(int)frameCount delay:(float)delay   
  9. {   
  10.     NSMutableArray* frames = [NSMutableArray arrayWithCapacity:frameCount];   
  11.     NSString* file;   
  12.     for (int i = 0; i <frameCount; i++)   
  13.     {    
  14.         file =nil;   
  15.         file = [NSString stringWithFormat:@"%@%i.png", name, i];   
  16.         CCTexture2D* texture = [[CCTextureCache sharedTextureCache] addImage:file];   
  17.         CGSize texSize = texture.contentSize;   
  18.         CGRect texRect = CGRectMake(0, 0, texSize.width, texSize.height);   
  19.         CCSpriteFrame* frame = [CCSpriteFrame frameWithTexture:texture rect:texRect];   
  20.         [frames addObject:frame];   
  21.     }    
  22.     return  [CCAnimation animationWithFrames:frames delay:delay];   
  23. }   
  24. //利用帧缓存中的帧名称   
  25. +(CCAnimation*) animationWithFrame:(NSString*)frame frameCount:(int)frameCount delay:(float)delay   
  26. {   
  27.     NSMutableArray* frames = [NSMutableArray arrayWithCapacity:frameCount];   
  28.     NSString* file;   
  29.     for (int i = 1; i <= frameCount; i++)   
  30.     {   
  31.         file =nil;   
  32.         file = [NSString stringWithFormat:@"%@%i.png", frame, i];   
  33.         CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];   
  34.         CCSpriteFrame* frame = [frameCache spriteFrameByName:file];   
  35.         [frames addObject:frame];   
  36.     }   
  37.     return  [CCAnimation animationWithFrames:frames delay:delay];   
  38. }   
  39. @end   
  1. +(CCAnimation*) animationWithFile:(NSString*)name frameCount:(int)frameCount delay:(float)delay{};   
  2. //参数讲解:name:资源文件名  ;frameCount 总帧数   ;   delay :每一帧的刷新时间   
  3. +(CCAnimation*) animationWithFrame:(NSString*)frame frameCount:(int)frameCount delay:(float)delay{};   
  4. //参数讲解:frame:帧文件名  ;frameCount 总帧数   ;   delay :每一帧的刷新时间   

注意:1、 类有(help)的表示对原有的类进行扩展;2、动作帧都要按照himi0.png,himi1.png,himi2.png,这样子命名,当然拉你不想这样可以修改这两个方法即可;

            3. 注意Himi这里的两个方法,一个是从0开始喔,另外一个是从1开始的,如果你用帧缓存进行创建动作就要从himi1.png,开始命名,嘿嘿~

下面是使用方法:

  1. //--@@@@@@@--第二个知识点--@@@@@@@   
  2. //利用文件名创建动作    
  3. //--首先导入#import "CCAnimationHelper.h"   
  4. MySprite*mySprite=[MySprite mySpriteInitWithImage:@"himi0.png"];   
  5. mySprite.position=ccp(140,mySprite.contentSize.height*0.5);   
  6. [self addChild:mySprite];   
  7. CCAnimation*anim=[CCAnimation animationWithFile:@"himi" frameCount:12 delay:0.1];    
  8. CCAnimate* animate = [CCAnimate actionWithAnimation:anim];   
  9. CCSequence *seq = [CCSequence actions:animate,nil];    
  10. CCRepeatForever* repeat = [CCRepeatForever actionWithAction:seq];   
  11. [mySprite runAction:repeat];    
  12. //利用帧缓存中的文件名创建动作    
  13. //--首先导入#import "CCAnimationHelper.h"   
  14. [[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"animationsFrames.plist"];   
  15. MySpriteByFrame *mySpriteByF =[MySpriteByFrame mySpriteInitWithFrameName:@"himi1.png"];   
  16. mySpriteByF.position=ccp(350,size.height*0.5);   
  17. [self addChild:mySpriteByF];   
  18. anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];    
  19. animate = [CCAnimate actionWithAnimation:anim];   
  20. seq = [CCSequence actions:animate,nil];    
  21. repeat = [CCRepeatForever actionWithAction:seq];   
  22. [mySpriteByF runAction:repeat];    

这里要提醒童鞋们的有两点:

      1.利用帧缓存创建动画的时候要注意要提前将帧加载到缓存里喔~

      2.Himi这两个方法没有写一样,所以动作帧的命名一个从0开始,另外一个从1开始!童鞋们可以自行改过来哈

运行截图如下:

iOS-Cocos2d游戏开发之二十一自定义精灵类并为你的精灵设置攻击帧以及动画创建二

第三点知识点:为你的精灵设置攻击帧;

    首先跟一些童鞋简单说下何谓攻击帧,假如主角攻击一个怪物的时候,肯定播放攻击动作,但是!你是在攻击动作开始的时候就扣怪物血还是攻击动作结束后扣怪物血呢?都不是!!!因为很不真实!所以我们应该当攻击动作播放到设定的某一帧的时候进行扣怪物血或者其他逻辑,然后继续播放剩下的攻击动作,这样才更加的真实!

   那么OK,这里Himi仍然封装成一个方法让你直接使用即可;首先看下代码:

  1. <strong>//带有攻击帧的动画   
  2. </strong>+(CCAnimation*) animationWithFrameFromStartFrameIndex:(NSString*)frame startFrameCountIndex:(int)startFrameIndex frameCount:(int)frameCount delay:(float)delay   
  3. {   
  4.     NSMutableArray* frames = [NSMutableArray arrayWithCapacity:frameCount];   
  5.     NSString* file;   
  6.     file =nil;   
  7.     for (int i = startFrameIndex; i <frameCount+startFrameIndex; i++)   
  8.     {   
  9.         file = [NSString stringWithFormat:@"%@%i.png", frame, i];   
  10.         CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];   
  11.         CCSpriteFrame* frame = [frameCache spriteFrameByName:file];   
  12.         [frames addObject:frame];   
  13.     }   
  14.     return  [CCAnimation animationWithFrames:frames delay:delay];   
  15. }   

使用方法如下:

  1. <strong></strong>       //--@@@@@@@--第三个知识点--@@@@@@@   
  2.         [[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"animationsFrames.plist"];   
  3.         MySpriteByFrame *mySpriteAni =[MySpriteByFrame mySpriteInitWithFrameName:@"himi1.png"];   
  4.         mySpriteAni.position=ccp(260,size.height*0.5);   
  5.         [self addChild:mySpriteAni];   
  6.         //首先执行前6帧动画   
  7.         CCAnimation*anim=[CCAnimation animationWithFrameFromStartFrameIndex:@"himi" startFrameCountIndex:1 frameCount:6 delay:0.1];   
  8.         CCAnimate* animate = [CCAnimate actionWithAnimation:anim];    
  9.         //攻击帧执行的函数   
  10.         CCCallFunc *downEnemyHp =[CCCallFunc actionWithTarget:self selector:@selector(downEnemyHp)];   
  11.         //后6帧动画   
  12.         anim=[CCAnimation animationWithFrameFromStartFrameIndex:@"himi" startFrameCountIndex:7 frameCount:6 delay:0.1 ];   
  13.         CCAnimate* animateForAttackIndex = [CCAnimate actionWithAnimation:anim];   
  14.         CCSequence *seq = [CCSequence actions:animate,downEnemyHp,animateForAttackIndex,nil];   
  15.         [mySpriteAni runAction:seq];    
  16. ---------回调函数   
  17. -(void)downEnemyHp{   
  18.     CCLabelTTF *label = (CCLabelTTF*)[self getChildByTag:99];   
  19.     [label setString:@"攻击帧"];   
  20. }   

前六帧-》回调downEnemyHp函数-》继续播放剩下的播放帧数

运行截图如下:

iOS-Cocos2d游戏开发之二十一自定义精灵类并为你的精灵设置攻击帧以及动画创建二

iOS-Cocos2d游戏开发之二十一自定义精灵类并为你的精灵设置攻击帧以及动画创建二

  OK,继续忙了~由于本文知识点较多和较细节,这里Himi放出源码,我的动作相关的封装都在CCAnimationHelper.h/.m中喔,注意不要改类名,因为这个类是Himi对cocos2d源码进行的扩展!

     源码地址:  http://www.himigame.com/iphone-cocos2d/525.html

更多相关文章
一周排行
  • 以前本人找工作也有过类似的经历,但是没有面试过这么多的企业,看了作者的经历,让我深深的感触到,如今找份工作是多么的难,如果你现在正在找工作,希望你真的不要放弃,如果你现在已有了一份不错的工作,千万不要随意丢弃,特此谢 ...
  • 故障原因: 安装时候选择英文安装,安装完毕之后,更改语言,但是相应的文字编码方式,以及字体库不完整导致,中文乱码. 一般情况,缺少fonts-chinese 安装办法:yum -y install fonts-chi ...
  • proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的.下面简要介绍其下 ...
  • ASP.NETWebApi实践系列一自我寄宿
        从今天开始,研究ASP.NET Web Api(以下有时会简称Web Api).我 ...
  • 结合组策略和注册表对IE进行安全进阶配置
             在上一篇博文结束时提到了还可以在组策略中对 Internet Explo ...
  • 老男孩linux培训的一名网络班初级学生期中实战架构作业文档目录展示特别说明:(内部学员博文,非老男孩的学生可以绕过本博文)<?xml:namespace prefix="o">?xm ...
  • 很早就开始看了51cto的文章. 感触很深. 我只是一个涉世未深的菜鸟. 以前一直以为自己知道的够多了. 看了前辈们的文章, 才懂得自己原来什么也不是. 我想通过51cto学到更多的东西. 成就自己的网络梦想. 今天 ...
  • 第二章ESXi安装和SphereClient5.0
    ESXi 安装安装 ESXi,作为拥有运行的虚拟机过程中的第一步.运行ESXi 虚拟化软件 ...
  • 职业社交网站为何比微博更有价值
            “微时代”的风生水起,让越来越多的企业一头热地投入到微博营销中去,这当然与 ...
  • PXE+TFTP+DHCP网络自动引导安装Linux 9 5 标签:Linux网络PXEDHCPTFTP [推送到技术圈] PXE最直接的表现是,在网络环境下工作站可以省去硬盘,但又不 ...