|
|
51CTO旗下网站
|
|
移动端

如何添加一个cocos2d-x精灵

本文将讲述如何添加一个cocos2d-x精灵,你可以自己按照文章一步步来完成游戏,或者直接下载完整的代码,简单地编译运行。

作者:Walzer Wang来源:cocos2d-x|2012-04-17 10:06

1.1 在iPhone上添加资源

1.2 在Android上添加资源

1.3 在win32上添加资源

1.4 在沃Phone上添加资源

2. 添加一个精灵

要点1

要点2

教程中的源码可以在这下载:https://github.com/flyingpacer/Cocos2dxSimpleGame

你可以自己按照文章一步步来完成游戏,或者直接下载完整的代码,简单地编译运行。

1.加入图片资源

这里有三张由Ray Wenderlich的妻子所做的图片,它们将会用在Cocos2dSimpleGame里。

未标题-3.jpg

学完第一章——在多种平台上创建新的cocos2d-x项目后,你现在应该有一个cocos2d-x/Cocos2dxSimpleGame文件夹。请下载这些图片,并把它们复制到cocos2d-x/Cocos2dxSimpleGame/Resources文件夹里。

之后回到各种平台上的IDE上来。

1.1在iPhone上添加资源

非常简单,打开Xcode,然后点击Add->Existing Files from the context menu of Cocos2dxSimpleGame/Resources group,添加上面的三张图片。请注意,你应当在“Add To Targets”一栏里勾选Cocos2dxSimpleGame

IOSAddResource.png

1.2在Android上添加资源

如果你是运行build_native.sh 来编译的话,你应该把图片复制到Resources文件夹,否则就把图片文件复制到“assets”文件夹。

1.3在win32上添加资源

Win32的可执行文件会在它的相关路径中寻找资源。因此我们必须手动的把图片文件从cocos2d-x/Cocos2dxSimpleGame/Resources 文件夹复制到cocos2d-x/Debug.win32 文件夹。

img-2-1.3-xcopy.png

但像我这样的懒人,总能找到偷懒的办法。

把这行写入Post-Build Event-> Command Line

xcopy /Y /E .\Resources\*.* $(OutDir)

每次编译完成时,VistualStudio会复制资源到可执行的路径。

1.4在沃Phone上添加资源

在沃Phone 游戏里使用zip格式的资源包是非常推荐的。如果你仍然对此不太清楚,请阅读How to use ZIP resource package on cocos2d-uphone

2.添加一个精灵

你现在会发现把cocos2d 游戏从objc移植到c++是多么的简单。打开HelloWorldScene.cpp,替换init方法如下所示:

1bool HelloWorld::init()

2{

3 bool bRet = false;

4 do

5 {

6 //////////////////////////////////////////////////////////////////////////

7 // super init first

8 //////////////////////////////////////////////////////////////////////////

9

10 CC_BREAK_IF(! CCLayer::init());

11

12 //////////////////////////////////////////////////////////////////////////

13 // add your codes below...

14 //////////////////////////////////////////////////////////////////////////

15

16 // 1. Add a menu item with "X" image, which is clicked to quit the program.

17

18 // Create a "close" menu item with close icon, it's an auto release object.

19 CCMenuItemImage *pCloseItem = CCMenuItemImage::itemFromNormalImage(

20 "CloseNormal.png",

21 "CloseSelected.png",

22 this,

23 menu_selector(HelloWorld::menuCloseCallback));

24 CC_BREAK_IF(! pCloseItem);

25

26 // Place the menu item bottom-right conner.

27 pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

28

29 // Create a menu with the "close" menu item, it's an auto release object.

30 CCMenu* pMenu = CCMenu::menuWithItems(pCloseItem, NULL);

31 pMenu->setPosition(CCPointZero);

32 CC_BREAK_IF(! pMenu);

33

34 // Add the menu to HelloWorld layer as a child layer.

35 this->addChild(pMenu, 1);

36

37 /////////////////////////////

38 // 2. add your codes below...

39

40 CCSize winSize = CCDirector::sharedDirector()->getWinSize();

41 CCSprite *player = CCSprite::spriteWithFile("Player.png",

42 CCRectMake(0, 0, 27, 40) );

43 player->setPosition( ccp(player->getContentSize().width/2, winSize.height/2) );

44 this->addChild(player);

45

46 bRet = true;

47 } while (0);

48

49 return bRet;

50}

上面的代码中,我实际上仅添加了“2.Add your codes below”那一节的内容。你可以从下面的对比中,看到如何一行一行地把cocos2d-iphone代码简单地转化为cocos2d-x跨平台的代码。

1// cpp with cocos2d-x

2bool HelloWorld::init()

3{

4 if ( CCLayer::init() )

5 {

6 CCSize winSize = CCDirector::sharedDirector()->getWinSize();

7 CCSprite *player = CCSprite::spriteWithFile("Player.png",

8 CCRectMake(0, 0, 27, 40) );

9 player->setPosition( ccp(player->getContentSize().width/2,

10 winSize.height/2) );

11 this->addChild(player);

12 }

13 return true;

14}

1// objc with cocos2d-iphone

2-(id) init

3{

4 if( (self=[super init] ))

5 {

6 CGSize winSize = [[CCDirector sharedDirector] winSize];

7 CCSprite *player = [CCSprite spriteWithFile:@"Player.png"

8 rect:CGRectMake(0, 0, 27, 40) ];

9 player.position = ccp(player.contentSize.width/2,

10 winSize.height/2);

11 [self addChild:player];

12 }

13 return self;

14}

要点1

1. 不要使用C++里的__super来替代objc里的super。关键字__super仅能在VC++中被识别,但是无法被GCC给编译。因此你最好调用其父类名称,CCLayer::init()

2. 这里没有属性的概念。因此在objc里的属性,我们用get/set方法来代替。例如,如果你想要获取CCSprite的contentSize属性,你必须调用sprite->getContentSize()方法。contentSize的第一个字母应该为大写的“C”,之后为它加上“get”前缀。

3. 使用setter来设置属性的值,“player.position=…”,应变为player->setPosition(…)

4. 但是访问结构体的成员不遵循这一规则。例如,在winSize结构体中,没有“width”&“height”的getter/setter

5. 你不需要像objc那样,解释每一个参数的用途。例如,[CCSprite spriteWithFile…, rect…];直接转换为CCSprite::spriteWithFile(…, ….);

6. 我们已经完成了一些常用的CGGeometry函数,诸如CGRectMake, CGPointMake, CGSizeMake, CGPointZero, CGSizeZero, CGRectZero。你可以在cocos2dx/include/CCGemoetry.h中找到它们。它们的用途和iOS一样。仅有一点点不同在于它们的前缀,为了避免命名上的冲突,在cocos2d-x里,前缀为CG、NS、UI的类都统一改成了CC前缀。

7. 所有cocos2d-x里的游戏元素,例如sprite、layer、scene、label、action都在heap里被分配了内存。因此我们必须用指针“->”来调用它们的方法。

8. 在cpp里,用关键字“this”来代替objc里的“self”

9. 现在init方法的返回值是“bool”类型了。在cpp里没有关键字“id”,因此那些返回值为“id”的方法要么替换成对象的指针,要么换成bool。

10. 对于Android,由于标题栏占用了一些空间,因此你需要在cpp里这样设置玩家的位置(player.contenSize.width/2 + 40, winSize.height/2)。

好了,我们可以编译并运行代码了。现在忍者一袭黑衣,躲在黑暗中闪着红眼。要玩游戏的话,我们必须把背景改成白色的。这非常简单,修改HelloWorld,使它继承CCLayerColor,而不是CCLayer。

首先,修改HelloWorldScene.h的声明部分

1// cpp with cocos2d-x

2class HelloWorld : public cocos2d::CCLayerColor

1// objc with cocos2d-iphone

2@interface HelloWorld : CCLayerColor

之后修改HelloWorld::init()内的初始部分

1if ( !CCLayer::init() )

2{

3 return false;

4}

改成

1if ( !CCLayerColor::initWithColor( ccc4(255,255,255,255) ) )

2{

3 return false;

4}

这里有些和RayWenderlich的代码不同,因为我偏好防守型的代码风格。正常的代码是,if super init 成功了,then 执行什么什么,我比较偏好if init失败了,先做出错的处理,之后再编写正确的流程。好了,回到正题。让我们来继续比较c++与objc的转换

1// cpp with cocos2d-x

2if ( CCLayerColor::initWithColor( ccc4(255,255,255,255) ) )

1// objc with cocos2d-iphone

2if ( self = [super initWithColor:ccc4(255,255,255,255)] )

要点2

1. 在c++里继承默认为private继承,因此需要在CCLayerColor类声明前加上“public”。

2. Cocos2d-iphone的主要作者RicardoQuesada建议我们在cocos2d-x中使用命名空间。检查你所调用的cocos2d-x类是在“cocos2d”命名空间还是在“CocosDenshion”命名空间是非常重要的。

编译并运行,之后你就会看到小英雄孤单地站在白色的背景里。

iPhone:

IOSSprite.png

Android:

androidSprite.png

沃Phone:

WoPhoneSprite.png

Win32:

Win32Sprite.png

【责任编辑:立方 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

活学活用 Ubuntu Server

活学活用 Ubuntu Server

实战直通车
共35章 | UbuntuServer

228人订阅学习

Java EE速成指南

Java EE速成指南

掌握Java核心
共30章 | 51CTO王波

87人订阅学习

Mysql DBA修炼之路

Mysql DBA修炼之路

MySQL入门到高阶
共24章 | 51CTO叶老师

483人订阅学习

读 书 +更多

SOA概念、技术与设计

在本书中,Thomas ERL呈现了第一部端对端的教程,提供了从基层开始的面向服务的建模与设计的逐步指导。通过逐步的、清晰生动的、良好的SOA...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客