使用cocos2d-iphone和cocos2d-x创建帧动画

     其实用过cocos2d-iphone的人,再去学cocos2d-x会学的非常快,我其实就是这么学的。我在用Objective-C之前对C++是一点也不懂的。在学 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

#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 BGSpriteActionCreatManger

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++)

{

file = nil;

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

CCSpriteFrameCache* frameCache =  [CCSpriteFrameCache sharedSpriteFrameCache];

CCSpriteFrame* theFrame = [frameCache spriteFrameByName:file];

        [frma 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 repeat;

}

-(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 timeAction;

}

@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);

//创建一个只播放一次的动画

cocos2d::CCAction* initActionWithSpriteNameAndCountAndDelayTimeRunOnce(cocos2d::CCString* name,int frameCount,float delayTime);

//下边这个是cocos2d-x独有的creat宏

CREATE_FUNC(SpriteActionFactoryMangerClass);

private:

cocos2d::CCAnimation* initActionWithSpriteNameAndFrameCountAndDelayTime(cocos2d::CCString* name,int frameCount,float delayTime);//C++中的私有方法

};

#endif 

好了,我们来接着写实现文件.cpp
 
    

#include "SpriteActionFactoryMangerClass.h"


//C++特有语法名称空间

using namespace cocos2d;


//单例访问入口实现,这里不像Objective-C的实现有多线程保护

static SpriteActionFactoryMangerClass *s_SharedAction = NULL;

SpriteActionFactoryMangerClass* SpriteActionFactoryMangerClass::sharedAction(void)

{

if (!s_SharedAction)

{

s_SharedAction = new SpriteActionFactoryMangerClass();

s_SharedAction->init();

}

return s_SharedAction;

}

//创建动画中的私有方法实现

CCAnimation* SpriteActionFactoryMangerClass::initActionWithSpriteNameAndFrameCountAndDelayTime(CCString* name,int frameCount,float delayTime)

{

CCArray* frma = CCArray::createWithCapacity(frameCount);

CCString* file;

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

{

file = NULL;

file = CCString::createWithFormat("%s%d.png",name->getCString(),i);

CCSpriteFrameCache* frameCache = CCSpriteFrameCache::sharedSpriteFrameCache();

CCSpriteFrame* theFrame = frameCache->spriteFrameByName(file->getCString());

frma->addObject(theFrame);

}

return CCAnimation::createWithSpriteFrames(frma,delayTime);

}

//创建一个可以一直循环播放的动画

CCAction* SpriteActionFactoryMangerClass::initActionWithSpriteNameAndCountAndDelayTime(cocos2d::CCString* name,int frameCount,float delayTime)

{


CCAnimation* animationMove = this->initActionWithSpriteNameAndFrameCountAndDelayTime(name,frameCount,delayTime);

CCAnimate* Sup = CCAnimate::create(animationMove);

CCRepeatForever* repeat = CCRepeatForever::create(Sup);

return repeat;

}

//创建一个只播放一次的动画

CCAction* SpriteActionFactoryMangerClass::initActionWithSpriteNameAndCountAndDelayTimeRunOnce(cocos2d::CCString* name,int frameCount,float delayTime)

{

CCAnimation* animationMove = this->initActionWithSpriteNameAndFrameCountAndDelayTime(name,frameCount,delayTime);

CCAnimate* Sup = CCAnimate::create(animationMove);

CCActionInterval* timeAction = (CCActionInterval*)Sup;

return timeAction;

}


好了,希望大家从这个动画创建的例子中可以了解到苹果的 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/

你可能感兴趣的:(ios学习)