使用cocos2d-iphone和cocos2d-x创建帧动画
Objective-C之前连什么是面向对象,什么是类都不知道。但是在短短的一年半时间里我竟然把自已学成了一个高手了。并且学会了 Objective-C和C++两种面象对向的语言。在 Objective-C的带领下,我开始学习23种面向对象的设计模式。开始使用UML建模工具画类图。
当我开始对面向对象有了明确的认识之后,知道什么是继承,什么叫多态,什么叫动态绑定之后。这一切都变的明了了。
而在我最开始使用 Objective-C中历史最久的基础框架 Foundation之后,这里边的NSArray, NSMutableArray , NSDictionary,NSMutableDictionary,NSString,NSNumber这些最最常见的类为我之后学习C++中的std::list,std::string,map等等标准库奠定了基础。所以,可以说,没有 Objective-C就没有我之后对C++的快速学习。
好了,废话少说。接下来我们进入今天的正题。就是使用 Objective-C的 cocos2d-iphone和C++的 cocos2d-x。我来建一个单例类,这个类的功能就是使用帧图片来创建一个帧动画。
好,我先写 Objective-C的代码了。大家一起学习。
头文件“BGSpriteActionCreatManger.h”
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface BGSpriteActionCreatManger : NSObject
}
+(BGSpriteActionCreatManger *)sharedAction;
//创建一个一直播放的动画
-(CCAction*)initActionWithSpriteName:(NSString*)name FrameCount:(int)frameCount DelayTime:(float)delayTime;
//创建一个只播放一次的动画
-(CCAction*)initActionRunOnceWithSpriteName:(NSString*)name FrameCount:(int)frameCount DelayTime:(float)delaytime;
@end
Objective-C的实现文件
“BGSpriteActionCreatManger.m”或者
“BGSpriteActionCreatManger.mm”当你的游戏中要用物理引擎的时候,就应该是.mm,其实xcode开发环境是我用过的最好的开发工具了。可能我用别的东西用的少吧,大家不要喷。你如果想用纯
C++,那就的实现文件必须用.cpp。只要用了这个文件后缀,
Objective-C的语法就不能用了。好了,不扯了,我们就正事。
#import "BGSpriteActionCreatManger.h"
@interface BGSpriteActionCreatManger() //这个是Objective-C私有方法定方式
-(CCAnimation*)initActionBaseWithSpriteName:(NSString*)name FrameCount:(int)frameCount DelayTime:(float)delayTime;
@end
@implementation
static BGSpriteActionCreatManger *_sharedAction = nil;
+ (BGSpriteActionCreatManger *)sharedAction
{
@synchronized(self){
if (!_sharedAction) {
_sharedAction = [[self alloc] init];
}
}
return _sharedAction;
}
- (id)init
{
self = [super init];
if (self) {
}
return self;
}
-(CCAnimation*)initActionBaseWithSpriteName:(NSString*)name FrameCount:(int)frameCount DelayTime:(float)delayTime
{
NSMutableArray* frma = [[NSMutableArray alloc]initWithCapacity:frameCount];
NSString* file;
for (int i = 0;i < frameCount ;i++)
{
nil;
NSString alloc]initWithFormat:@"%@%i.png",name,i];
CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
CCSpriteFrame* theFrame = [frameCache spriteFrameByName:file];
addObject:theFrame];
}
return [[CCAnimation alloc]initWithSpriteFrames:frma];
}
-(CCAction*)initActionWithSpriteName:(NSString *)name FrameCount:(int)frameCount DelayTime:(float)delayTime
{
CCAnimation* animationMove = [self initActionBaseWithSpriteName:name FrameCount:frameCount DelayTime:delayTime];
CCAnimate* Sup = [[CCAnimate alloc]initWithAnimation:animationMove];//CCAnimate::create(animationMove);
CCRepeatForever* repeat = [[CCRepeatForever alloc]initWithAction:Sup];//CCRepeatForever::create(Sup);
return
}
-(CCAction*)initActionRunOnceWithSpriteName:(NSString*)name FrameCount:(int)frameCount DelayTime:(float)delaytime
{
CCAnimation* animationMove = [self initActionBaseWithSpriteName:name FrameCount:frameCount DelayTime:delaytime];
CCAnimate* Sup = [[CCAnimate alloc]initWithAnimation:animationMove];
CCActionInterval* timeAction = (CCActionInterval*)Sup;
return
}
@end
上边的是用cocos2d-iphone引
擎写的精灵动画创建单例类。下边我再用cocos2d-x的C++写一次上边一模一样的类。
同样,我们先写“.h”接口头文件:
#ifndef __SPRITEACTIONCREATMANGER_H__
#define __SPRITEACTIONCREATMANGER_H__
#include "cocos2d.h"
class SpriteActionCreatManger: public cocos2d::CCObject
{
public:
virtual bool init();
//单例访问入口
static SpriteActionFactoryMangerClass* sharedAction(void);
//创建一个一直播放的动画
cocos2d::CCAction* initActionWithSpriteNameAndCountAndDelayTime(cocos2d::CCString* name,int frameCount,float delayTime);
//创建一个只播放一次的动画
int frameCount,float
//下边这个是cocos2d-x独有的creat宏
CREATE_FUNC(SpriteActionFactoryMangerClass);
private:
cocos2d::CCAnimation* initActionWithSpriteNameAndFrameCountAndDelayTime(cocos2d::CCString* name,int frameCount,float
};
#endif
好了,我们来接着写实现文件.cpp
#include "SpriteActionFactoryMangerClass.h"
//C++特有语法名称空间
using namespace cocos2d;
//单例访问入口实现,这里不像Objective-C的实现有多线程保护
static SpriteActionFactoryMangerClass *s_SharedAction = NULL;
SpriteActionFactoryMangerClass* SpriteActionFactoryMangerClass::sharedAction(void)
{
if
{
new
s_SharedAction->init();
}
return
}
//创建动画中的私有方法实现
CCAnimation* SpriteActionFactoryMangerClass::initActionWithSpriteNameAndFrameCountAndDelayTime(CCString* name,int frameCount,float
{
CCArray* frma = CCArray::createWithCapacity(frameCount);
CCString* file;
for (int i = 0;i < frameCount ;i++)
{
NULL;
"%s%d.png",name->getCString(),i);
CCSpriteFrameCache* frameCache = CCSpriteFrameCache::sharedSpriteFrameCache();
CCSpriteFrame* theFrame = frameCache->spriteFrameByName(file->getCString());
frma->addObject(theFrame);
}
return
}
//创建一个可以一直循环播放的动画
CCAction* SpriteActionFactoryMangerClass::initActionWithSpriteNameAndCountAndDelayTime(cocos2d::CCString* name,int frameCount,float
{
this->initActionWithSpriteNameAndFrameCountAndDelayTime(name,frameCount,delayTime);
CCAnimate* Sup = CCAnimate::create(animationMove);
CCRepeatForever* repeat = CCRepeatForever::create(Sup);
return
}
//创建一个只播放一次的动画
CCAction* SpriteActionFactoryMangerClass::initActionWithSpriteNameAndCountAndDelayTimeRunOnce(cocos2d::CCString* name,int frameCount,float
{
this->initActionWithSpriteNameAndFrameCountAndDelayTime(name,frameCount,delayTime);
CCAnimate* Sup = CCAnimate::create(animationMove);
CCActionInterval* timeAction = (CCActionInterval*)Sup;
return
}
好了,希望大家从这个动画创建的例子中可以了解到苹果的
Objective-C和C++的语法相通之处。以及cocos2d-iPhone与cocos2d-x的相同点。其实大家都知道,cocos2d-x是用C++仿cocos2d-iPhone写的。所以,要说cocos2d还是原生的
cocos2d-iPhone的
Objective-C版本更完美。
转载的时候注明一下出处: http://fengmm521.blog.163.com/blog/static/25091358201382394649415/
版权声明
本文仅代表作者观点,不代表博信信息网立场。