- 浏览: 187121 次
- 性别:
- 来自: 无锡
文章分类
最新评论
-
luoqianjiang:
很好,谢谢
一些iOS高效开源类库 -
sgjsdf5944:
没看明白。。。。。。。。。。
UIWebView打开doc、pdf文件 -
593864589:
mac 上不支持呢?
cocos2d 粒子设计器 -
寻墨小楼:
多谢了...正在弄这个。
mysql for mac 安装和基本操作 -
yueliancao:
楼主如何联系啊 我的MAC系统 #LoadModule php ...
mac OS x中配置apache + php + mysql
上周貌似没有写新的博文,那么今天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 // 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 :每一帧的刷新时间 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:@"攻击帧"]; } 运行截图如下:
OK,继续忙了~由于本文知识点较多和较细节,这里Himi放出源码,我的动作相关的封装都在CCAnimationHelper.h/.m中喔,注意不要改类名,因为这个类是Himi对cocos2d源码进行的扩展
发表评论
-
cocos2d游戏开发,常用工具集合
2012-01-07 13:42 767位图字体工具Bitmap Font ToolsBMFont ( ... -
cocos2d-x开源游戏引擎发布0.10.0版,支持iphone/android/bada/win32/linux平台
2012-01-02 22:28 1475cocos2d-1.0.1-x-0.10.0版本 http:/ ... -
详解CCProgressTimer 进度条
2012-01-06 00:05 1007原文地址:http://blog.csdn.net/xi ... -
Cocos2D-iPhone-Extensions嵌入视频播放
2012-01-06 00:05 726原文地址:http://blog.csdn.net ... -
CCSprite利用Bezier(贝塞尔)做抛物线动作
2012-01-06 00:05 834原文地址:http://blog.csdn.net/xi ... -
浅析使用C++/C/OC在iOS游戏中混编
2012-01-11 22:10 1163原文地址:http://blog.csdn.net/xi ... -
使用Box2d物理系统
2012-01-11 22:10 781原文地址:http://blog.csdn.net/ ... -
添加粒子特效并解决粒子系统特效与Layer之间的坐标问题
2012-01-11 22:11 799原文地址:http://blog.csdn.net/ ... -
对触屏事件追加讲解,解决无法触发ccTouchMoved事件
2012-01-11 22:11 985原文地址:http://blog.csdn.net/xi ... -
从零开始学习OpenGL ES之二 – 简单绘图概述
2012-01-02 22:29 1327还有许多理论知识需要讨论,但与其花许多时间在复杂的数学 ... -
一. 搭建cocos2d游戏引擎环境HelloWorld!
2012-01-29 16:05 701注意:本文经 Himi 论坛ID:xiaom ... -
CCSpeed实现CCAnimate动画进行时设置慢动作
2012-01-30 13:48 1015原文地址:http://bl ... -
Cocos2D-iPhone精灵的基础知识点总汇
2012-03-06 09:41 938最近写了不少Cocos2d的博文了,那么由于Him ... -
Cocos2D-iPhone游戏数据存储的四种常用方式
2012-03-06 09:41 1374首先向大家说句抱歉,可能一些童鞋看到我的微薄了,我说突然 ... -
Cocos2D-iPhone解决滚屏背景/拼接地图有黑边(缝隙)
2012-03-06 09:41 1730本章节主要为大家 ... -
灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint)
2012-03-06 09:42 1006今天Himi单用一篇博文来给童鞋们介绍精灵相关 ... -
Cocos2D-iPhone添加本地通知(UILocalNotification)
2012-03-06 09:42 1735首先申明下:希望大家转载的时候不要忘记给原文连接, ... -
详解CCProgressTimer 进度条
2012-03-09 17:43 949游戏开发中难免用到进度条,例如做一些游戏技能的C ... -
Cocos2D-iPhone-Extensions嵌入视频播放
2012-03-09 17:43 783自从Himi书籍《Android游戏编程之从零开始》一 ... -
CCSprite利用Bezier(贝塞尔)做抛物线动作
2012-03-09 17:43 1770如果我们想实现让CCSprite进行抛物线运动的话,那么 ...
相关推荐
【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧以及扩展Cocos2d源码的CCAnimation简化动画创建! http://blog.csdn.net/xiaominghimi/article/details/6993764
Cocos2d-x 自定义可接受处理触摸信息精灵类 一个简单的例子,基于cocos2dx-2.1.5版本
详细讲述iOS中,利用cocos2d开发精灵
在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...
(译)cocos2d精灵教程:第一部分.pdf (译)cocos2d精灵教程:第三部分.pdf (译)cocos2d精灵教程:第二部分.pdf (译)cocos2d菜单教程:第一部分.pdf (译)cocos2d菜单教程:第三部分(完).pdf (译)...
资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...
cocos2d入门 cocos2d入门 cocos2d入门 cocos2d入门 cocos2d入门 cocos2d入门
Cocos2D-X核心类 Cocos2D-X 引擎的设计思路是将游戏中的各个部分抽象成几个概念:导演、场景、布景层及人物精灵。 导演(CCDirector):游戏的组织者和领导者,是整个游戏的负责人、总指挥。导演类制定游戏的运行...
该资源主要用于cocos2d-x中Value与json字符串的相互转换,提供从json文件读取为cocos2d::Value,cocos2d::Value写入到文件,cocos2d::Value转换为json字符串,json字符串转换为cocos2d::Value。json字符串转换成cocos...
Cocos2d-x实战
http://blog.csdn.net/zoyzn/article/details/27251633一文的源码。cocos2d-x 3.0导出自定义类到lua,并导出自定义类的名称空间到lua。
cocos2d-x-2.1.5
第1章 开始前的准备工作 1 第2章 你的第一款iPhone游戏:垂直射击游戏 38 第3章 Cocos2D核心类 69 第4章 Cocos2D中的动作、特效与动画 152 第5章 Cocos2D中的文本渲染系统 229 共19章
cocos2d-android 精灵添加动作
基于cocos2d的target触摸,父子精灵节点的demo
cocos2dx-lua 自定义事件类
cocos2d-x棋牌类游戏《开心斗地主》源码 经典的棋牌类游戏,非常适合二次开发和学习使用 开发环境: Cocos2d-X v2.0
Cocos2d-x源于Cocos2d,是一款开源游戏引擎项目,是一款基于对原有iOS平台cocos2d重写为C++的开源代码,封装了OpenGL,Box2d,LibCurl,LibPng等开源的跨平台代码。由于基于C++和STL特点使其广泛应用于游戏开发、移动...
cocos2d-x 3.2 使用cocos studio导出的帧动画所用资源
Cocos2d-JS中使用Cocos Studio资源05:帧动画 动画资源,代码