上周貌似没有写新的博文,那么今天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
- +(id) mySpriteInitWithFrameName:(NSString*)fileName
- {
- return [[[self alloc] initWithMySpriteFrameName:fileName] autorelease];//这里仿照cocos2d原理,自动清理精灵
- }
- -(id) initWithMySpriteFrameName:(NSString*)fileName
- {
- if ((self = [super initWithSpriteFrameName:fileName]))
- {
- //初始化的东东都写在这里喔~
- }
- return self;
- }
- -(void) dealloc
- {
- //内存清理
- [super dealloc];
- }
- @end
大家注意两种自定义精灵.m类中的 if((self = XXX)这里是重要的区别,一个是直接索引资源名称,一个是通过名称找到帧缓存中的帧;
OK,两种创建的方式的自定义精灵都完成了,下面我们来尝试创建吧:
- //---------创建一个我们自定义的MySprite精灵吧(利用文件名直接创建)
- //1.import 自定义类.h (#import "MySprite.h")
- MySprite*mySprite=[MySprite mySpriteInitWithImage:@"Icon.png"];
- mySprite.position=ccp(70,size.height*0.5);
- [self addChild:mySprite];
- //---------创建一个我们自定义的MySpriteByFrame精灵吧(利用帧缓存中的文件名创建)
- //@@@@注意因为是从帧缓存里找到对应名字的帧,那么肯定需要将用到的帧放在缓存里。
- [[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"mySpriteFrames-hd.plist"];
- MySpriteByFrame *mySpriteByF =[MySpriteByFrame mySpriteInitWithFrameName:@"himi.png"];
- mySpriteByF.position=ccp(300,size.height*0.5);
- [self addChild:mySpriteByF];
注意:利用帧来创建的时候必须要将使用的帧首先加载到帧缓存中,这里Himi利用TP打包工具将一张名字为himi.png的图打包到mySpriteFrames-hd.plist中了,也就是下面这句代码将himi.png图加载到帧缓存中了,否则报错找不到喔;
- [[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"mySpriteFrames-hd.plist"];
加载的图片资源图如下:
注意这里的-hd 文件和非-hd的文件的区别,不太懂的童鞋请移步到这篇博文:
【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
运行截图如下: