
?????? 从上一篇《Cocos2d-x 2.0 在Windows平台下的使用》已经初步了解了Cocos2d-x的安装、编译,也已经可以运行HelloWorld示例了,运行HelloWorld至少所需的文件,包括:素材、动态库,我们把"...Release.win32"里的"HelloWorld.exe"单独拷贝到一个新文件夹,至少所需的文件如下图所示:

打开cocos2d-win32.vc2008.sln,展开"HelloWorld"工程,工程结构如下所示:

对应"...HelloWorld"文件夹的结构如下所示:
可知"Classes"放置游戏开发逻辑相关、平台无关的代码,"Resources"放置图片、声音、配置等资源,"win32"等放置平台相关的代码。
?
了解如何运行,在win32下就从main()函数开始,打开"main.cpp",代码如下所示:?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
? |
#include?
"main.h"
#include?
"../Classes/AppDelegate.h"
#include?
"CCEGLView.h"
USING_NS_CC;
int?APIENTRY?_tWinMain(HINSTANCE?hInstance, ???????????????????????HINSTANCE?hPrevInstance, ???????????????????????LPTSTR????lpCmdLine, ???????????????????????
int???????nCmdShow)
{
????UNREFERENCED_PARAMETER(hPrevInstance);
????UNREFERENCED_PARAMETER(lpCmdLine);
????
//?create?the?application?instance ????AppDelegate?app;
????CCEGLView&?eglView?=?CCEGLView::sharedOpenGLView();
????eglView.setViewName(
"Hello?World");
????eglView.setFrameSize(
480,?
320);
????
//?set?the?design?resolution?screen?size,?if?you?want?to?use?Design?Resoulution?scaled?to?current?screen,?please?uncomment?next?line. ????
//?eglView.setDesignResolutionSize(480,?320); ????
return?CCApplication::sharedApplication().run();
}
|
其中
AppDelegate是最主要的类,代理运行着整个应用程序,它的体系如下:

简化流程如下所示:

而CCEGLView是整个程序窗口类,游戏的显示、表现等等都在这上面进行,跟AppDelegate合起来的流程如下:

在CCApplication::run()中调用了applicationDidFinishLaunching()函数,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
? |
bool?AppDelegate::applicationDidFinishLaunching()?{?
????
//?initialize?director ????CCDirector?*pDirector?=?CCDirector::sharedDirector();
?
????pDirector->setOpenGLView(&CCEGLView::sharedOpenGLView());
?
????
//?enable?High?Resource?Mode(2x,?such?as?iphone4)?and?maintains?low?resource?on?other?devices. ????
//?pDirector->enableRetinaDisplay(true); ?
????
//?turn?on?display?FPS ????pDirector->setDisplayStats(
true);
?
????
//?set?FPS.?the?default?value?is?1.0/60?if?you?don‘t?call?this ????pDirector->setAnimationInterval(
1.
0?/?
60);
?
????
//?create?a?scene.?it‘s?an?autorelease?object ????CCScene?*pScene?=?HelloWorld::scene();
?
????
//?run ????pDirector->runWithScene(pScene);
?
????
return?
true;
}?
|
所做的事情包括:初始化导演类CCDirector 、创建HelloWorld场景、运行场景。HelloWorld场景从CCLayer派生,创建HelloWorld场景所调用如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
? |
CCScene*?HelloWorld::scene()?
{
????
//?‘scene‘?is?an?autorelease?object ????CCScene?*scene?=?CCScene::create();
?
????
//?‘layer‘?is?an?autorelease?object ????HelloWorld?*layer?=?HelloWorld::create();
?
????
//?add?layer?as?a?child?to?scene ????scene->addChild(layer);
?
????
//?return?the?scene ????
return?scene;
}?
|
实质是创建一个场景类,再创建HelloWorld层,把层放到场景上。创建HelloWorl层的时候,调用了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
50
51
52
|
? |
bool?HelloWorld::init()?
{
????
////////////////////////////// ????
//?1.?super?init?first ????
if?(?!CCLayer::init()?)
????{
????????
return?
false;
????}
?
????
///////////////////////////// ????
//?2.?add?a?menu?item?with?"X"?image,?which?is?clicked?to?quit?the?program ????
//?you?may?modify?it. ?
????
//?add?a?"close"?icon?to?exit?the?progress.?it‘s?an?autorelease?object ????CCMenuItemImage?*pCloseItem?=?CCMenuItemImage::create(
????????????????????????????????????????
"CloseNormal.png", ????????????????????????????????????????
"CloseSelected.png", ????????????????????????????????????????
this, ????????????????????????????????????????menu_selector(HelloWorld::menuCloseCallback)?);
????pCloseItem->setPosition(?ccp(CCDirector::sharedDirector()->getWinSize().width?-?
20,?
20)?);
?
????
//?create?menu,?it‘s?an?autorelease?object ????CCMenu*?pMenu?=?CCMenu::create(pCloseItem,?
NULL);
????pMenu->setPosition(?CCPointZero?);
????
this->addChild(pMenu,?
1);
?
????
///////////////////////////// ????
//?3.?add?your?codes?below... ?
????
//?add?a?label?shows?"Hello?World" ????
//?create?and?initialize?a?label ????CCLabelTTF*?pLabel?=?CCLabelTTF::create(
"Hello?World",?
"Arial",?
24);
????
//?ask?director?the?window?size ????CCSize?size?=?CCDirector::sharedDirector()->getWinSize();
?
????
//?position?the?label?on?the?center?of?the?screen ????pLabel->setPosition(?ccp(size.width?/?
2,?size.height?-?
50)?);
?
????
//?add?the?label?as?a?child?to?this?layer ????
this->addChild(pLabel,?
1);
?
????
//?add?"HelloWorld"?splash?screen" ????CCSprite*?pSprite?=?CCSprite::create(
"HelloWorld.png");
?
????
//?position?the?sprite?on?the?center?of?the?screen ????pSprite->setPosition(?ccp(size.width/
2,?size.height/
2)?);
?
????
//?add?the?sprite?as?a?child?to?this?layer ????
this->addChild(pSprite,?
0);
?
????
return?
true;
}?
|
在这个函数里,创建了各个子元素,创建完之后,用addChild加入到主层上,上面的注释清晰的描述了步骤。
?
参考阅读:
1.cocos2d-x初探学习笔记(1)--HelloWorld?http://www.voidcn.com/article/p-oxnsnkkz-qk.html
2.cocos2d-x之HelloWorld范例分析(一)?http://www.lugw.net/?p=80005
?
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed