原文參看:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Chapter_2_-_How_to_Add_a_sprite
2 添加一個一個小精靈
由此可見現在從objec到C++轉化cocos2d遊戲的端口是多麼的容易.打開HelloWorldSene.cpp,用下面的代碼體院init函數。
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
bool bRet = false;
do
{
//////////////////////////////////////////////////////////////////////////
// super init first
//////////////////////////////////////////////////////////////////////////
CC_BREAK_IF(! CCLayer::init());
//////////////////////////////////////////////////////////////////////////
// add your codes below...
//////////////////////////////////////////////////////////////////////////
// 1. Add a menu item with "X" image, which is clicked to quit the program.
// Create a "close" menu item with close icon, it's an auto release object.
CCMenuItemImage *pCloseItem = CCMenuItemImage::itemFromNormalImage(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
// Place the menu item bottom-right conner.
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
// Create a menu with the "close" menu item, it's an auto release object.
CCMenu* pMenu = CCMenu::menuWithItems(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);
// Add the menu to HelloWorld layer as a child layer.
this->addChild(pMenu, 1);
// 2. Add a sprite .
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *player = CCSprite::spriteWithFile("Player.PNG",CCRectMake(0,0,27,40));
player->setPosition(ccp(player->getContentSize().width/2,player->getContentSize().height)/2);
this->addChild(player);
bRet = true;
} while (0);
return bRet;
}
除了關閉菜單,我們僅僅添加了一段代碼"2.Add a sprite".下面將一行一行展示給你如何將C++代碼轉化爲objc的代碼。
|
|
1 不要在C++中使用_super替代objc中的super.關鍵字_super僅僅在VC++中才能夠被識別,但它不能被GCC編譯的。因此你不得不調用父類的名字CCLayer::init()
2 這裏沒有屬性的概念,因爲屬性只在objc中,相對的我們使用get或set方法在C++中。例如,如果你想方位CCSprite的contentSize屬性,你必須調用sprite->getContentSize()方法。
3 使用setter訪問器,設置一個屬性的值,“player.position=……” 轉化爲“player->setPosition(……)”
4 訪問結構體的成員時不需要遵循3的原則,如winSize中沒有對width和height的getter和setter訪問器。
5 你不需要解釋每一個參數的用處,如 [CCSprite spriteWithFile …, rect …]; 轉化成 CCSprite::spriteWithFile(…, …);
6 我們已經實現了CGGeometry中一些經常使用的功能,如CGRectMake,CGPointMake,CGSizeMake,CGPointZero,CGSzieZero,CGRectZero.這些功能的聲明在cocos2dx/include/CCGeometry.h文件中,這些功能的特性和ios中的一樣,出來一點點區別:爲了避免明名的衝突,在IOS中以CG,NS,UI開頭的類轉爲 Cocos2d-x以CC開頭的類。
7 在cocos2d-x中所有遊戲的對象如 sprite layer scene label action 均分配在內存的堆上,因此我們必須用->調用他的方法。
8 衆所諸知,cpp中的this就是objc中的self
9 現在init函數的返回值類型是boolb類型,cpp中沒有關鍵字“id",因此一個方法返回一個id傳遞給一個對象或者bool
10 對於ndroid 標題欄會被其他一些空間佔用,因此我們必須在cpp中設置player的位置。
好了,我們可以運行我的代碼,現在ninja被黑色背景包圍,只露出兩個紅色的眼睛。對於遊戲玩家來說,我們必須改變背景的顏色爲白色。很簡單,修改helloword集成爲CCLayerColor而不是CClayer
首先在HelloWorldScen進行如下修改:
|
|
if ( !CCLayer::init() ) { return false; } // 修改爲:
if ( !CCLayerColor::initWithColor( ccc4(255,255,255,255) ) )
{
return false;
}
C++中默認的繼承權限爲private,因此CCLayerColor的修飾符public 是非常必要的
然後你可以進行運行了。