cocos2之How to add a sprite (2)

原文參看: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// 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方法在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進行如下修改:

1// cpp with cocos2d-x
2class HelloWorld : public cocos2d::CCLayerColor


1// objc with cocos2d-iphone
2@interface HelloWorld : CCLayerColor


然後我們修改HelloWorld::init()的開始部分爲:

if ( !CCLayer::init() )
{
    return false;
}
 
// 修改爲:
if ( !CCLayerColor::initWithColor( ccc4(255,255,255,255) ) )
{
    return false;
}



提示2

C++中默認的繼承權限爲private,因此CCLayerColor的修飾符public 是非常必要的


然後你可以進行運行了。

發佈了35 篇原創文章 · 獲贊 28 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章