1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
CCScene*
HelloWorld::scene() { CCLog( "HelloWorld::scene" ); CCScene
* scene = NULL; do { //
'scene' is an autorelease object scene
= CCScene::create(); CC_BREAK_IF(!
scene); CCLog( "HelloWorld::create
before" ); //
'layer' is an autorelease object HelloWorld
*layer = HelloWorld::create(); CCLog( "HelloWorld::create
after" ); CC_BREAK_IF(!
layer); //
add layer as a child to scene scene->addChild(layer); } while (0); //
return the scene CCLog( "scence
end" ); return scene; } |
CC_BREAK_IF(! scene); 的展开为:
1
|
#define
CC_BREAK_IF(cond) if(cond) break |
意思是如果没有生成,便跳出结束程序的执行。
在函数init()中我也加了一个打印输出,
1
2
3
4
5
6
7
8
9
|
bool HelloWorld::init() { CCLog( "HelloWorld::init" ); bool bRet
= false ; do { ....... } } |
最后的输出为:
HelloWorld::scene
HelloWorld::create before
?HelloWorld::init
HelloWorld::create after
scence end
可以在执行HelloWorld::create();时,调用了HelloWorld::init().而在init这个方法中又有大量的加载及初始化操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
bool HelloWorld::init() { CCLog( "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::create( "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::create(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 label shows "Hello World". //
Create a label and initialize with string "Hello World". CCLabelTTF*
pLabel = CCLabelTTF::create( "Hello
World" , "Arial" ,
24); CC_BREAK_IF(!
pLabel); //
Get window size and place the label upper. CCSize
size = CCDirector::sharedDirector()->getWinSize(); pLabel->setPosition(ccp(size.width
/ 2, size.height - 50)); //
Add the label to HelloWorld layer as a child layer. this ->addChild(pLabel,
1); //
3. Add add a splash screen, show the cocos2d splash image. CCSprite*
pSprite = CCSprite::create( "HelloWorld.png" ); CC_BREAK_IF(!
pSprite); //
Place the sprite on the center of the screen pSprite->setPosition(ccp(size.width/2,
size.height/2)); //
Add the sprite to HelloWorld layer as a child layer. this ->addChild(pSprite,
0); bRet
= true ; } while (0); return bRet; } |
下面的代码为生成一个关闭铵钮,最后一个参数为回调函数,就是我们点击这个按钮时需要执行的操作,我们这里需要重写HelloWorld::menuCloseCallback这个方法,因为 不同程序的关闭会执行不同的操作,有的会保存上下文,例如玩家的一些状态,而不是只是单纯的退出程序完事。
1
2
3
4
5
|
CCMenuItemImage
*pCloseItem = CCMenuItemImage::create( "CloseNormal.png" , "CloseSelected.png" , this , menu_selector(HelloWorld::menuCloseCallback)); |
下面的一行代码为设置关闭钮的位置,这里设置为右下角,我们首先获取宽度然后减去20,高度我们设置为20,记住这里的坐标轴是左下角开始的。
1
|
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width
- 20, 20)); |
接着我们把CCMenuItemImage加入到CCMenu,CCMenuItemImage只是一个图标,相当于一个数据,而CCMenu相当于一个大的框架。
1
2
|
CCMenu*
pMenu = CCMenu::create(pCloseItem, NULL); pMenu->setPosition(CCPointZero); |
其中的CCPointZero为点0,0,这里我有一个疑问,为什么这里CCMenu会放到右下角,按照道理来讲是左下角?
接一来我们添加HelloWorld这个字符,
1
2
3
4
5
6
7
8
|
//
Create a label and initialize with string "Hello World". CCLabelTTF*
pLabel = CCLabelTTF::create( "Hello
World" , "Arial" ,
24); CC_BREAK_IF(!
pLabel); //
Get window size and place the label upper. CCSize
size = CCDirector::sharedDirector()->getWinSize(); pLabel->setPosition(ccp(size.width
/ 2, size.height - 50)); //
Add the label to HelloWorld layer as a child layer. this ->addChild(pLabel,
1); |
接下来添加一个精灵:
1
2
3
4
5
6
7
|
//
3. Add add a splash screen, show the cocos2d splash image. CCSprite*
pSprite = CCSprite::create( "HelloWorld.png" ); CC_BREAK_IF(!
pSprite); //
Place the sprite on the center of the screen pSprite->setPosition(ccp(size.width/2,
size.height/2)); //
Add the sprite to HelloWorld layer as a child layer. this ->addChild(pSprite,
0); |
类似于上面添加CCMenu,精灵相当于一些会移动的东西,我们来能过代码控制它的移动。 p
当我们点击右下角的按钮时便会触发前面我们提到的回调函数,这个结束事件的代码为:
1
2
3
4
5
|
void HelloWorld::menuCloseCallback(CCObject*
pSender) { //
"close" menu item clicked CCDirector::sharedDirector()->end(); } |