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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章