如何添加一個cocos2d-x精靈
1.1 在iPhone上添加資源
1.2 在Android上添加資源
1.3 在win32上添加資源
1.4 在沃Phone上添加資源
2. 添加一個精靈
要點(diǎn)1
要點(diǎn)2
教程中的源碼可以在這下載:https://github.com/flyingpacer/Cocos2dxSimpleGame
你可以自己按照文章一步步來完成游戲,或者直接下載完整的代碼,簡單地編譯運(yùn)行。
1.加入圖片資源
這里有三張由Ray Wenderlich的妻子所做的圖片,它們將會用在Cocos2dSimpleGame里。
學(xué)完第一章——在多種平臺上創(chuàng)建新的cocos2d-x項(xiàng)目后,你現(xiàn)在應(yīng)該有一個cocos2d-x/Cocos2dxSimpleGame文件夾。請下載這些圖片,并把它們復(fù)制到cocos2d-x/Cocos2dxSimpleGame/Resources文件夾里。
之后回到各種平臺上的IDE上來。
1.1在iPhone上添加資源
非常簡單,打開Xcode,然后點(diǎn)擊Add->Existing Files from the context menu of Cocos2dxSimpleGame/Resources group,添加上面的三張圖片。請注意,你應(yīng)當(dāng)在“Add To Targets”一欄里勾選Cocos2dxSimpleGame
1.2在Android上添加資源
如果你是運(yùn)行build_native.sh 來編譯的話,你應(yīng)該把圖片復(fù)制到Resources文件夾,否則就把圖片文件復(fù)制到“assets”文件夾。
1.3在win32上添加資源
Win32的可執(zhí)行文件會在它的相關(guān)路徑中尋找資源。因此我們必須手動的把圖片文件從cocos2d-x/Cocos2dxSimpleGame/Resources 文件夾復(fù)制到cocos2d-x/Debug.win32 文件夾。
但像我這樣的懶人,總能找到偷懶的辦法。
把這行寫入Post-Build Event-> Command Line
xcopy /Y /E .\Resources\*.* $(OutDir)
每次編譯完成時,VistualStudio會復(fù)制資源到可執(zhí)行的路徑。
1.4在沃Phone上添加資源
在沃Phone 游戲里使用zip格式的資源包是非常推薦的。如果你仍然對此不太清楚,請閱讀How to use ZIP resource package on cocos2d-uphone
2.添加一個精靈
你現(xiàn)在會發(fā)現(xiàn)把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}
上面的代碼中,我實(shí)際上僅添加了“2.Add your codes below”那一節(jié)的內(nèi)容。你可以從下面的對比中,看到如何一行一行地把cocos2d-iphone代碼簡單地轉(zhuǎn)化為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}
要點(diǎn)1
1. 不要使用C++里的__super來替代objc里的super。關(guān)鍵字__super僅能在VC++中被識別,但是無法被GCC給編譯。因此你最好調(diào)用其父類名稱,CCLayer::init()
2. 這里沒有屬性的概念。因此在objc里的屬性,我們用get/set方法來代替。例如,如果你想要獲取CCSprite的contentSize屬性,你必須調(diào)用sprite->getContentSize()方法。contentSize的第一個字母應(yīng)該為大寫的“C”,之后為它加上“get”前綴。
3. 使用setter來設(shè)置屬性的值,“player.position=…”,應(yīng)變?yōu)閜layer->setPosition(…)
4. 但是訪問結(jié)構(gòu)體的成員不遵循這一規(guī)則。例如,在winSize結(jié)構(gòu)體中,沒有“width”&“height”的getter/setter
5. 你不需要像objc那樣,解釋每一個參數(shù)的用途。例如,[CCSprite spriteWithFile…, rect…];直接轉(zhuǎn)換為CCSprite::spriteWithFile(…, ….);
6. 我們已經(jīng)完成了一些常用的CGGeometry函數(shù),諸如CGRectMake, CGPointMake, CGSizeMake, CGPointZero, CGSizeZero, CGRectZero。你可以在cocos2dx/include/CCGemoetry.h中找到它們。它們的用途和iOS一樣。僅有一點(diǎn)點(diǎn)不同在于它們的前綴,為了避免命名上的沖突,在cocos2d-x里,前綴為CG、NS、UI的類都統(tǒng)一改成了CC前綴。
7. 所有cocos2d-x里的游戲元素,例如sprite、layer、scene、label、action都在heap里被分配了內(nèi)存。因此我們必須用指針“->”來調(diào)用它們的方法。
8. 在cpp里,用關(guān)鍵字“this”來代替objc里的“self”
9. 現(xiàn)在init方法的返回值是“bool”類型了。在cpp里沒有關(guān)鍵字“id”,因此那些返回值為“id”的方法要么替換成對象的指針,要么換成bool。
10. 對于Android,由于標(biāo)題欄占用了一些空間,因此你需要在cpp里這樣設(shè)置玩家的位置(player.contenSize.width/2 + 40, winSize.height/2)。
好了,我們可以編譯并運(yùn)行代碼了?,F(xiàn)在忍者一襲黑衣,躲在黑暗中閃著紅眼。要玩游戲的話,我們必須把背景改成白色的。這非常簡單,修改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()內(nèi)的初始部分
把
1if ( !CCLayer::init() )
2{
3 return false;
4}
改成
1if ( !CCLayerColor::initWithColor( ccc4(255,255,255,255) ) )
2{
3 return false;
4}
這里有些和RayWenderlich的代碼不同,因?yàn)槲移梅朗匦偷拇a風(fēng)格。正常的代碼是,if super init 成功了,then 執(zhí)行什么什么,我比較偏好if init失敗了,先做出錯的處理,之后再編寫正確的流程。好了,回到正題。讓我們來繼續(xù)比較c++與objc的轉(zhuǎn)換
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)] )
要點(diǎn)2
1. 在c++里繼承默認(rèn)為private繼承,因此需要在CCLayerColor類聲明前加上“public”。
2. Cocos2d-iphone的主要作者RicardoQuesada建議我們在cocos2d-x中使用命名空間。檢查你所調(diào)用的cocos2d-x類是在“cocos2d”命名空間還是在“CocosDenshion”命名空間是非常重要的。
編譯并運(yùn)行,之后你就會看到小英雄孤單地站在白色的背景里。
iPhone:
Android:
沃Phone:
Win32: