`
yangping_Account
  • 浏览: 191689 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

Cocos2D自定义精灵类并为你的精灵设置攻击帧

 
阅读更多

 

 上周貌似没有写新的博文,那么今天Himi写个精品的博文奉献给童鞋们;

(不少童鞋说Himi的教程最近都没有源码放出=。 =,这里我解释下,一般我没有放出源码的博文那肯定已经将代码贴出来了,这点是肯定的,否则Himi一定给出源码的)

       本篇的知识点如下:

       1. 两种方式实现自定义精灵;

       2.两种方式让精灵利用多帧播放动画

       3. 为你的精灵设置带有攻击帧的动画,当执行攻击动作的中间会执行扣血等逻辑,然后接着播放动作喔~

       首先第一种如何自定义精灵:

       两种自定义一个精灵当然无疑我们仍然继承CCSprite,首先看第一种自定义方式,Himi新建一个类,名字是MySprite,代码如下,大家一看就很清晰了;

          MySprite.h



//  

//  MySprite.h  

//  HimiAnimationsTestPro  

//  

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

//  Copyright (c) 2011年 __MyCompanyName__. All rights reserved.  

//  

  

#import "CCSprite.h"  

  

@interface MySprite : CCSprite{  

      

}  

+(id) mySpriteInitWithImage:(NSString*)fileName;  

-(id) initWithMySpriteImage:(NSString*)fileName;  

@end  



         MySprite.m



//  

//  MySprite.m  

//  HimiAnimationsTestPro  

//  

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

//  Copyright (c) 2011年 __MyCompanyName__. All rights reserved.  

//  

  

#import "MySprite.h"  

  

@implementation MySprite  

+(id) mySpriteInitWithImage:(NSString*)fileName  

{  

    return [[[self alloc] initWithMySpriteImage:fileName] autorelease];//这里仿照cocos2d原理,自动清理精灵  

}  

  

-(id) initWithMySpriteImage:(NSString*)fileName  

{  

    if ((self = [super initWithFile:fileName]))  

    {  

        //初始化的东东都写在这里喔~  

    }  

    return self;  

}    

  

-(void) dealloc  

{  

   //内存清理  

    [super dealloc];  

}  

@end  


大家以后自定义精灵的时候可以将我这个当模版即可!如果你不想自定义的精灵传参,那就直接自己修改下构造函数即可,初始化的时候写死名字即可(比如一般游戏主角不需要传入图片名字作为参数,直接在我们主角类的构造中将图片资源名写死即可) 


    然后我们用第二种方式,所谓第二种方式其实就是修改我们的初始化函数,让其精灵初始化的方式改成帧缓存创建:(适合利用TP打包工具出的图进行来创建精灵)

代码如下:(这里Himi为了让童鞋们看得清楚,Himi新建一个类,名字是MySpriteByFrame)


         MySpriteByFrame.h


//  

//  MySprite.h  

//  HimiAnimationsTestPro  

//  

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

//  Copyright (c) 2011年 __MyCompanyName__. All rights reserved.  

//  

  

#import "CCSprite.h"  

  

@interface MySpriteByFrame : CCSprite{  

      

}  

+(id) mySpriteInitWithFrameName:(NSString*)frameName;  

-(id) initWithMySpriteFrameName:(NSString*)frameName;  

@end  



           MySpriteByFrame.m



//  

//  MySprite.m  

//  HimiAnimationsTestPro  

//  

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

//  Copyright (c) 2011年 __MyCompanyName__. All rights reserved.  

//  

  

#import "MySpriteByFrame.h"  

  

@implementation MySpriteByFrame  

 

 

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

                   CCAnimationHelper.h


//  

//  CCAnimationHelper.h  

//  SpriteProject  

//  

//  Created by Himi on 11-8-6.  

//  Copyright 2011 __MyCompanyName__. All rights reserved.  

//  

   

#import "cocos2d.h"  

  

@interface CCAnimation (Helper)  

//直接索引图片名称  

+(CCAnimation*) animationWithFile:(NSString*)name frameCount:(int)frameCount delay:(float)delay;  

//利用帧缓存中的帧名称  

+(CCAnimation*) animationWithFrame:(NSString*)frame frameCount:(int)frameCount delay:(float)delay;  

@end  



                    CCAnimationHelper.m



//  CCAnimationHelper.m  

//  SpriteProject  

//  

//  Created by Himi   

  

#import "CCAnimationHelper.h"  

  

@implementation CCAnimation (Helper)  

//直接索引图片名称  

+(CCAnimation*) animationWithFile:(NSString*)name frameCount:(int)frameCount delay:(float)delay  

{  

    NSMutableArray* frames = [NSMutableArray arrayWithCapacity:frameCount];  

    NSString* file;  

    for (int i = 0; i < frameCount; i++)  

    {   

        file =nil;  

        file = [NSString stringWithFormat:@"%@%i.png", name, i];  

        CCTexture2D* texture = [[CCTextureCache sharedTextureCache] addImage:file];  

        CGSize texSize = texture.contentSize;  

        CGRect texRect = CGRectMake(0, 0, texSize.width, texSize.height);  

        CCSpriteFrame* frame = [CCSpriteFrame frameWithTexture:texture rect:texRect];  

          

        [frames addObject:frame];  

    }   

    return  [CCAnimation animationWithFrames:frames delay:delay];  

}  

//利用帧缓存中的帧名称  

+(CCAnimation*) animationWithFrame:(NSString*)frame frameCount:(int)frameCount delay:(float)delay  

{  

    NSMutableArray* frames = [NSMutableArray arrayWithCapacity:frameCount];  

    NSString* file;  

      

    for (int i = 1; i <= frameCount; i++)  

    {  

        file =nil;  

        file = [NSString stringWithFormat:@"%@%i.png", frame, i];  

        CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];  

        CCSpriteFrame* frame = [frameCache spriteFrameByName:file];  

        [frames addObject:frame];  

    }  

    return  [CCAnimation animationWithFrames:frames delay:delay];  

}  

@end  




+(CCAnimation*) animationWithFile:(NSString*)name frameCount:(int)frameCount delay:(float)delay{};  

//参数讲解:name:资源文件名  ;frameCount 总帧数   ;   delay :每一帧的刷新时间  

+(CCAnimation*) animationWithFrame:(NSString*)frame frameCount:(int)frameCount delay:(float)delay{};  

//参数讲解:frame:帧文件名  ;frameCount 总帧数   ;   delay :每一帧的刷新时间  


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

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


下面是使用方法:



//--@@@@@@@--第二个知识点--@@@@@@@  

  

  

//利用文件名创建动作   

//--首先导入#import "CCAnimationHelper.h"  

MySprite*mySprite=[MySprite mySpriteInitWithImage:@"himi0.png"];  

mySprite.position=ccp(140,mySprite.contentSize.height*0.5);  

[self addChild:mySprite];  

  

CCAnimation*anim=[CCAnimation animationWithFile:@"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];   

  

  

   

//利用帧缓存中的文件名创建动作   

//--首先导入#import "CCAnimationHelper.h"  

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

MySpriteByFrame *mySpriteByF =[MySpriteByFrame mySpriteInitWithFrameName:@"himi1.png"];  

mySpriteByF.position=ccp(350,size.height*0.5);  

[self addChild:mySpriteByF];  

  

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

animate = [CCAnimate actionWithAnimation:anim];  

seq = [CCSequence actions:animate,nil];   

repeat = [CCRepeatForever actionWithAction:seq];  

[mySpriteByF runAction:repeat];   


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

 

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

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

运行截图如下:

          

【扯皮一下,如果你在我的Android或者iOS群中,你感觉这张哆啦A梦图熟悉不~嘿嘿,Himi的7个群都是这个GIF做为群头像,娃哈哈,我自己做的 娃哈哈;】

 

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

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

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


<strong>//带有攻击帧的动画  

</strong>+(CCAnimation*) animationWithFrameFromStartFrameIndex:(NSString*)frame startFrameCountIndex:(int)startFrameIndex frameCount:(int)frameCount delay:(float)delay  

{  

    NSMutableArray* frames = [NSMutableArray arrayWithCapacity:frameCount];  

    NSString* file;  

    file =nil;  

    for (int i = startFrameIndex; i < frameCount+startFrameIndex; i++)  

    {  

          

        file = [NSString stringWithFormat:@"%@%i.png", frame, i];  

        CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];  

        CCSpriteFrame* frame = [frameCache spriteFrameByName:file];  

        [frames addObject:frame];  

    }  

    return  [CCAnimation animationWithFrames:frames delay:delay];  

}  



+(CCAnimation*) animationWithFrameFromStartFrameIndex:(NSString*)frame startFrameCountIndex:(int)startFrameIndex frameCount:(int)frameCount delay:(float)delay  {}  

//参数介绍:frame :帧名字;     startFrameIndex:指定播放起始帧 ;   frameCount:帧总数   ; delay:每帧的刷新时间  


使用方法如下:


      //--@@@@@@@--第三个知识点--@@@@@@@  

          

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

        MySpriteByFrame *mySpriteAni =[MySpriteByFrame mySpriteInitWithFrameName:@"himi1.png"];  

        mySpriteAni.position=ccp(260,size.height*0.5);  

        [self addChild:mySpriteAni];  

        //首先执行前6帧动画  

        CCAnimation*anim=[CCAnimation animationWithFrameFromStartFrameIndex:@"himi" startFrameCountIndex:1 frameCount:6 delay:0.1];  

        CCAnimate* animate = [CCAnimate actionWithAnimation:anim];   

        //攻击帧执行的函数  

        CCCallFunc *downEnemyHp =[CCCallFunc actionWithTarget:self selector:@selector(downEnemyHp)];  

        //后6帧动画  

        anim=[CCAnimation animationWithFrameFromStartFrameIndex:@"himi" startFrameCountIndex:7 frameCount:6 delay:0.1 ];  

        CCAnimate* animateForAttackIndex = [CCAnimate actionWithAnimation:anim];  

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

        [mySpriteAni runAction:seq];   

---------回调函数  

-(void)downEnemyHp{  

    CCLabelTTF *label = (CCLabelTTF*)[self getChildByTag:99];  

    [label setString:@"攻击帧"];  

}  


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

 

运行截图如下:

 

 

      

 

 

 

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

分享到:
评论

相关推荐

    Cocos2d-x 自定义可接受处理触摸信息精灵类

    总结来说,这个例子展示了如何在Cocos2d-x中自定义精灵类来处理触摸事件。通过继承`CCSprite`并实现触摸事件回调函数,我们可以让精灵根据触摸状态执行不同的动作。同时,通过创建场景并设置触摸监听,我们确保了...

    【Himi】自定义精灵类并为你的精灵设置攻击帧动画

    【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧以及扩展Cocos2d源码的CCAnimation简化动画创建! http://blog.csdn.net/xiaominghimi/article/details/6993764

    Cocos2d-x实战 JS卷

    12. **调试技巧**:掌握Cocos2d-x的调试工具和技巧,快速定位并解决问题。 通过《Cocos2d-x实战 JS卷》的学习,开发者不仅能掌握Cocos2d-x框架的JavaScript实现,还能了解到游戏开发的通用知识和最佳实践。书中的...

    cocos2d-android 精灵添加动作

    1. 环境搭建:首先,你需要安装Java Development Kit (JDK) 和Android Studio,然后通过Cocos2d-x的官方SDK来设置项目环境。Cocos2d-x提供了自动创建Android项目的脚本,运行该脚本即可生成一个基于Cocos2d-android...

    cocos2dx实现自定义2D地形

    在Cocos2d-x中,你可以使用GLSL(OpenGL Shading Language)编写自定义着色器,实现复杂的视觉效果。 1. 物理渲染:通过Shader模拟光照、阴影和反射,使2D地形更逼真。 2. 自定义颜色:Shader可以改变物体的颜色,...

    封装的一个 cocos2d-x 接收点击事件的精灵

    在这个场景中,我们关注的是一个特定的自定义精灵(Sprite)类,名为“TempTouchSprite”,它是针对Cocos2d-x 平台封装的,用来处理点击事件。 ### TempTouchSprite 概述 `TempTouchSprite` 是一个对原生Cocos2d-x ...

    cocos2D-lua 核心编程内置代码

    Cocos2d-lua是一款基于Cocos2d-x引擎的轻量级游戏开发框架,它将强大的C++底层引擎与灵活易用的Lua脚本语言相结合,为游戏开发者提供了一个高效、便捷的游戏开发平台。在“Cocos2d-x之Lua核心编程(第二版)_配套代码...

    cocos2d-x 动画工具 Flash2Cocos2d-x 1.3

    此外,Flash2Cocos2d-x 1.3还优化了资源导出的效率和格式,支持导出为cocos2d-x兼容的精灵表(Sprite Sheets)和骨骼动画(Spine或DragonBones)。这样,游戏在运行时可以更有效地加载和渲染动画,提高游戏性能,...

    Android cocos2d-x开发(四)之如何添加一个精灵和移动一个精灵

    在cocos2d-x中,`cc::Sprite`类是用来创建和管理精灵的。 1. 添加精灵: 要在场景中添加精灵,你需要创建一个`cc::Sprite`实例,然后将其添加到场景或其子节点上。这可以通过以下步骤完成: - 加载精灵的图像...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    12. **扩展性**:cocos2d-x提供了插件系统和扩展API,方便开发者添加自定义功能和第三方库。 在学习和使用cocos2d-x 3.8时,开发者需要注意与最新版本的差异,例如API的变化、新功能的缺失等。同时,由于3.8是旧...

    cocos2d二维码 cpp

    `QRSprite.cpp`和`QRSprite.h`可能是开发者为二维码创建的自定义精灵类,它可能包含了使用贝塞尔曲线来绘制二维码边框的功能。 具体来说,`QR_Encode.cpp`和`QR_Encode.h`很可能是核心的二维码编码实现,其中`.cpp`...

    Cocos2D-X开发学习笔记-渲染框架之精灵类的使用示例

    Cocos2D-X是一款强大的跨平台2D游戏...通过以上知识点的学习,你可以更好地理解和掌握Cocos2D-X中的精灵类及其应用。同时,参考提供的博客链接和示例代码,能让你进一步加深对这些概念的理解,并在实际项目中灵活运用。

    cocos2d粒子编辑器 particle_builder -windows

    particle_builder是cocos2d-x为开发者设计的一款图形化粒子特效编辑器,适用于Windows操作系统。它允许用户通过直观的界面来创建、调整和预览粒子效果,无需编程知识,大大降低了特效制作的门槛。用户可以自定义粒子...

    cocos2d + qt

    "CCGEditor-master"通过自定义的通信协议实现了这一点,当用户在Qt界面中进行操作时,会触发相应的Cocos2d函数,更新游戏状态。 4. 脚本支持 Cocos2d通常支持Lua或JavaScript等脚本语言,"CCGEditor-master"可能...

    Cocos2d-html5 references/cocos2d-html5文档

    通过阅读文档,你可以学习如何初始化Cocos2d引擎,创建场景和层,添加精灵,使用动作和定时器,处理用户输入,以及实现复杂的动画和物理效果。此外,文档还可能涵盖了调试工具、性能优化建议以及与其他库的集成方法...

    cocos2d-x游戏实例-简易动作游戏

    4. 分数系统:利用cocos2d-x的Label类显示分数,并通过计分函数实时更新。 5. 背景和场景管理:使用Scene、Layer、Sprite等组件构建游戏场景,实现背景滚动和场景切换。 6. 音效和音乐:集成AudioEngine模块,播放...

    cocos2d坦克大战

    本项目“cocos2d坦克大战”就是一个很好的实例,展示了如何利用Cocos2d进行游戏编程,为初学者提供了一个生动的学习平台。 一、cocos2d框架解析 1. **跨平台**:Cocos2d支持多平台,包括iOS、Android、Windows等,...

    cocos2d-x绘制多种颜色字符串

    总结来说,要在Cocos2d-x中绘制多种颜色的字符串,你需要掌握自定义绘制、DrawNode的使用、精灵和批次节点的管理,以及Cocos2d-x的相关API。同时,根据项目需求和性能考虑,选择合适的实现方式是非常重要的。

    将Cocos2D窗口嵌入到MFC ActiveX插件中

    你可能需要自定义一个继承自cocos2d::Layer的类,以便在这个场景上添加游戏元素或交互逻辑。 4. **绘图循环**:由于MFC和Cocos2D的绘图机制不同,你需要在MFC的OnPaint事件处理函数中调用Cocos2D的`Director::...

    cocos2d的jar包

    一旦集成完成,你可以开始创建Cocos2d的场景、图层、精灵等对象。例如,创建一个简单的场景: ```java public class HelloWorldScene extends Scene { @Override public void onEnter() { super.onEnter(); ...

Global site tag (gtag.js) - Google Analytics