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

简介:

下面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.     
  9. #import "cocos2d.h"   
  10.    
  11. @interface CCAnimation (Helper)   
  12. //直接索引图片名称   
  13. +(CCAnimation*) animationWithFile:(NSString*)name frameCount:(int)frameCount delay:(float)delay;   
  14. //利用帧缓存中的帧名称   
  15. +(CCAnimation*) animationWithFrame:(NSString*)frame frameCount:(int)frameCount delay:(float)delay;   
  16. @end   

 CCAnimationHelper.m

 


  
  
  1. //  CCAnimationHelper.m   
  2. //  SpriteProject   
  3. //   
  4. //  Created by Himi    
  5.    
  6. #import "CCAnimationHelper.h"   
  7.    
  8. @implementation CCAnimation (Helper)   
  9. //直接索引图片名称   
  10. +(CCAnimation*) animationWithFile:(NSString*)name frameCount:(int)frameCount delay:(float)delay   
  11. {   
  12.     NSMutableArray* frames = [NSMutableArray arrayWithCapacity:frameCount];   
  13.     NSString* file;   
  14.     for (int i = 0; i < frameCount; i++)   
  15.     {    
  16.         file =nil;   
  17.         file = [NSString stringWithFormat:@"%@%i.png", name, i];   
  18.         CCTexture2D* texture = [[CCTextureCache sharedTextureCache] addImage:file];   
  19.         CGSize texSize = texture.contentSize;   
  20.         CGRect texRect = CGRectMake(0, 0, texSize.width, texSize.height);   
  21.         CCSpriteFrame* frame = [CCSpriteFrame frameWithTexture:texture rect:texRect];   
  22.            
  23.         [frames addObject:frame];   
  24.     }    
  25.     return  [CCAnimation animationWithFrames:frames delay:delay];   
  26. }   
  27. //利用帧缓存中的帧名称   
  28. +(CCAnimation*) animationWithFrame:(NSString*)frame frameCount:(int)frameCount delay:(float)delay   
  29. {   
  30.     NSMutableArray* frames = [NSMutableArray arrayWithCapacity:frameCount];   
  31.     NSString* file;   
  32.        
  33.     for (int i = 1; i <= frameCount; i++)   
  34.     {   
  35.         file =nil;   
  36.         file = [NSString stringWithFormat:@"%@%i.png", frame, i];   
  37.         CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];   
  38.         CCSpriteFrame* frame = [frameCache spriteFrameByName:file];   
  39.         [frames addObject:frame];   
  40.     }   
  41.     return  [CCAnimation animationWithFrames:frames delay:delay];   
  42. }   
  43. @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.    
  4. //利用文件名创建动作    
  5. //--首先导入#import "CCAnimationHelper.h"   
  6. MySprite*mySprite=[MySprite mySpriteInitWithImage:@"himi0.png"];   
  7. mySprite.position=ccp(140,mySprite.contentSize.height*0.5);   
  8. [self addChild:mySprite];   
  9.    
  10. CCAnimation*anim=[CCAnimation animationWithFile:@"himi" frameCount:12 delay:0.1];    
  11. CCAnimate* animate = [CCAnimate actionWithAnimation:anim];   
  12. CCSequence *seq = [CCSequence actions:animate,nil];    
  13. CCRepeatForever* repeat = [CCRepeatForever actionWithAction:seq];   
  14. [mySprite runAction:repeat];    
  15.    
  16.    
  17.     
  18. //利用帧缓存中的文件名创建动作    
  19. //--首先导入#import "CCAnimationHelper.h"   
  20. [[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"animationsFrames.plist"];   
  21. MySpriteByFrame *mySpriteByF =[MySpriteByFrame mySpriteInitWithFrameName:@"himi1.png"];   
  22. mySpriteByF.position=ccp(350,size.height*0.5);   
  23. [self addChild:mySpriteByF];   
  24.    
  25. anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];    
  26. animate = [CCAnimate actionWithAnimation:anim];   
  27. seq = [CCSequence actions:animate,nil];    
  28. repeat = [CCRepeatForever actionWithAction:seq];   
  29. [mySpriteByF runAction:repeat];    

 

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

 

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

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

运行截图如下:

 

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

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

   那么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.            
  10.         file = [NSString stringWithFormat:@"%@%i.png", frame, i];   
  11.         CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];   
  12.         CCSpriteFrame* frame = [frameCache spriteFrameByName:file];   
  13.         [frames addObject:frame];   
  14.     }   
  15.     return  [CCAnimation animationWithFrames:frames delay:delay];   
  16. }   

使用方法如下:

 


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

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

 

运行截图如下:

 

 

 

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

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

 

 










本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/719899,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
59 1
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
62 5
|
2月前
|
Swift iOS开发 UED
实现一个自定义的iOS动画效果
本文介绍如何使用Swift和UIKit在iOS应用中实现一个自定义按钮动画,当按钮被点击时,其颜色从蓝色渐变为绿色,形状从圆形变为椭圆形,释放后恢复原状。通过UIView动画方法实现这一效果,代码示例展示了动画的平滑过渡和状态切换,有助于提升应用的视觉体验和用户交互。
59 1
|
3月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
72 11
|
3月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
162 0
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
12天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
100 66
|
23天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
27天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
29天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。