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

本文通过实例对比讲解了如何使用 Objective-C 的 Cocos2d-iPhone 和 C++ 的 Cocos2d-x 创建帧动画。作者分享了从 Objective-C 过渡到 C++ 的经验,并详细介绍了单例类的实现过程。
     其实用过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 <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 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版本更完美。
(译)cocos2d里面如何用texture picker像素格式来优化spritesheet.pdf (译)在cocos2d里如何制作各种按钮.pdf (译)如何使用cocos2d制作基于tilemap的游戏教程 第一部分.pdf (译)如何在cocos2d里面使用动画spritesheet.pdf (译)如何用cocos2d制作iphone游戏:旋转炮塔.pdf (译)如何用cocos2d制作iphone游戏:更猛的怪物更多得管卡.pdf (译)如何使用cocos2d制作一个Slide Image Game:第一部分.pdf (译)如何使用cocos2d来制作一个塔防游戏:第一部分.pdf cocos2d 2.0 添加遮罩.pdf iOS Code Signing解惑.pdf iPhone上面的现实增强(Augmented Reality)入门教程.pdf OpenGL ES2.0 – Iphone开发指引.pdf OpenGLES2.0 Iphone开发指引:第二部分,纹理贴图.pdf 使用cocos2dbox2d制作滚动背景.pdf 加入敌人战斗:如果使用cocos2d制作基于tiled地图的游戏:第三部分.pdf 在cocos2d里面如何使用物理引擎box2d:弹球.pdf 在cocos2d里面如何拖拽精灵.pdf 如何使用box2d来做碰撞检测(且仅用来做碰撞检测).pdf 如何使用CCRenderTexture来创建动态纹理.pdf 如何使用cocos2d1.0来给sprite添加Mask(遮罩).pdf 如何使用cocos2d制作一个塔防游戏:引子.pdf 如何使用cocos2d制作一个太空射击游戏.pdf 如何使用cocos2d制作一个打地鼠的游戏:(第二部分。完).pdf 如何使用cocos2dbox2d来制作一个Breakout游戏:第一部分.pdf 如何使用cocos2dbox2d来制作一个Breakout游戏:第二部分(完).pdf 如何使用cocos2d来制作一个打地鼠的游戏:第一部分.pdf 如何使用GameCenter制作一个简单的多人游戏教程:第一部分.pdf 如何使用GameCenter制作一个简单的多人游戏教程:第二部分.pdf 如何使用NSCodingNSFileManager来保存你的应用程序数据.pdf 如何制作一个类似tiny wings的游戏:第一部分.pdf 如何制作一个类似tiny wings的游戏:第二部分(完).pdf 如何升级你的cocos2d版本.pdf 如何学好Iphone开发.pdf 如何查找资料.pdf 碰撞检测收集物品:如何使用cocos2d制作基于tiled地图的游戏:第二部分.pdf (译)cocos2d精灵教程:第一部分.pdf (译)cocos2d精灵教程:第三部分.pdf (译)cocos2d精灵教程:第二部分.pdf (译)cocos2d菜单教程:第一部分.pdf (译)cocos2d菜单教程:第三部分(完).pdf (译)cocos2d菜单教程:第二部分.pdf (译)使用cocos2dbox2d来制作一个platformer游戏.pdf (译)如何使用cocos2d制作一个塔防游戏:第三部分.pdf (译)如何使用cocos2d制作一个塔防游戏:第二部分.pdf (译)如何使用cocos2d制作一个塔防游戏:第四部分(完).pdf (译)如何使用cocos2d制作一个滑动图片游戏教程:第二部分(完).pdf (译)如何用cocos2d制作一款简单的iphone游戏(第一部分).pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值