注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

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

2013-09-23 22:30:10|  分类: ios学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
     其实用过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版本更完美。
  评论这张
 
阅读(648)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017