原文参看: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; }
提示2
C++中默认的继承权限为private,因此CCLayerColor的修饰符public 是非常必要的
然后你可以进行运行了。