Cocos2d-x学习笔记(一)HelloCpp的来龙去脉
2013-08-08 09:51
267 查看
【1】首先分析HelloCpp项目的文件结构,分为Classes、win32、外部文件依赖三个文件夹,其中外部依赖文件夹暂且不用理会。
Classes主要包含像导演、场景、布景、摄像机、精灵、App相关类的申明和定义;
Win32主要是应用程序框架的WinMain函数入口(包括窗口尺寸、标题等参数的一些设置);
【2】程序的来龙去脉
WinMain函数分析:
其实此处的WinMain函数自动的参数与Windows里面的WinMain函数非常类似,其中
setViewName("HelloCpp")和setFrameSize(2048, 1536)用于设置应用程序标题及尺寸,setFrameZoomFactor(0.4f)用于设置帧率。那么main函数是怎样与导演类、场景类联系的呢?
这里有一个CCApplication,很容易理解是应用程序类,类似于windows里面的CWinApp类(记得不是很清楚,应该是这个吧),跟踪sharedApplication()函数,此函数返回一个CCApplication*类型,再执行run()函数,这里贴上函数代码:
int CCApplication::run()
{
………………………………
// Initialize instance and cocos2d.
if (!applicationDidFinishLaunching())
{
return 0;
}
…………………………
while (1)
{
if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// Get current time tick.
QueryPerformanceCounter(&nNow);
// If it's the time to draw next frame, draw it, else sleep a while.
if (nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart)
{
nLast.QuadPart = nNow.QuadPart;
CCDirector::sharedDirector()->mainLoop();
}
else
{
Sleep(0);
}
continue;
}
if (WM_QUIT == msg.message)
{
// Quit message loop.
break;
}
// Deal with windows message.
if (! m_hAccelTable || ! TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
透过applicationDidFinishLaunching()的定义,我们可以看到这是一个虚函数,源程序中有这样一段代码:
class AppDelegate : private cocos2d::CCApplication
且此函数在子类中被重写,我们可以调到函数的定义处:(附上部分代码)
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
CCDirector* pDirector = CCDirector::sharedDirector();
此处的sharedDirector()函数时一个静态成员函数,返回一个CCDirector*类型的值,这不禁让我们联想起单例模板,每次返回的都是同一个实例。
在函数的返回处有这样两句代码:
CCScene *pScene = HelloWorld::scene();
// run
pDirector->runWithScene(pScene);
其中scene()函数很关键,调到此函数定义:(见注释)
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类不能找到create()函数的申明,里面巧妙的使用了宏定义:CREATE_FUNC(HelloWorld);
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
由此我们可以看出其实create()函数是用宏来替代申明的,并且其内部调用了init()函数用于对图层(布景层)进行一些初始化工作。
【3】关于init()函数
对于里面的代码,学过其他库(例如MFC)很容易看懂里面的代码,主要是向图层里面添加菜单按钮、标签、精灵等等,以及一些尺寸、位置的设置,这里不再啰嗦了。
【4】心得:
刚开始研究这个引擎,看到HelloCpp这个示例程序,十分想弄清楚里面的来龙去脉,所以在网上找了很多相关资料,整合之后作为一个笔记以后留着,有错误之处请大家批评指正(写得有点乱)。
Classes主要包含像导演、场景、布景、摄像机、精灵、App相关类的申明和定义;
Win32主要是应用程序框架的WinMain函数入口(包括窗口尺寸、标题等参数的一些设置);
【2】程序的来龙去脉
WinMain函数分析:
其实此处的WinMain函数自动的参数与Windows里面的WinMain函数非常类似,其中
setViewName("HelloCpp")和setFrameSize(2048, 1536)用于设置应用程序标题及尺寸,setFrameZoomFactor(0.4f)用于设置帧率。那么main函数是怎样与导演类、场景类联系的呢?
这里有一个CCApplication,很容易理解是应用程序类,类似于windows里面的CWinApp类(记得不是很清楚,应该是这个吧),跟踪sharedApplication()函数,此函数返回一个CCApplication*类型,再执行run()函数,这里贴上函数代码:
int CCApplication::run()
{
………………………………
// Initialize instance and cocos2d.
if (!applicationDidFinishLaunching())
{
return 0;
}
…………………………
while (1)
{
if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// Get current time tick.
QueryPerformanceCounter(&nNow);
// If it's the time to draw next frame, draw it, else sleep a while.
if (nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart)
{
nLast.QuadPart = nNow.QuadPart;
CCDirector::sharedDirector()->mainLoop();
}
else
{
Sleep(0);
}
continue;
}
if (WM_QUIT == msg.message)
{
// Quit message loop.
break;
}
// Deal with windows message.
if (! m_hAccelTable || ! TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
透过applicationDidFinishLaunching()的定义,我们可以看到这是一个虚函数,源程序中有这样一段代码:
class AppDelegate : private cocos2d::CCApplication
且此函数在子类中被重写,我们可以调到函数的定义处:(附上部分代码)
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
CCDirector* pDirector = CCDirector::sharedDirector();
此处的sharedDirector()函数时一个静态成员函数,返回一个CCDirector*类型的值,这不禁让我们联想起单例模板,每次返回的都是同一个实例。
在函数的返回处有这样两句代码:
CCScene *pScene = HelloWorld::scene();
// run
pDirector->runWithScene(pScene);
其中scene()函数很关键,调到此函数定义:(见注释)
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类不能找到create()函数的申明,里面巧妙的使用了宏定义:CREATE_FUNC(HelloWorld);
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
由此我们可以看出其实create()函数是用宏来替代申明的,并且其内部调用了init()函数用于对图层(布景层)进行一些初始化工作。
【3】关于init()函数
对于里面的代码,学过其他库(例如MFC)很容易看懂里面的代码,主要是向图层里面添加菜单按钮、标签、精灵等等,以及一些尺寸、位置的设置,这里不再啰嗦了。
【4】心得:
刚开始研究这个引擎,看到HelloCpp这个示例程序,十分想弄清楚里面的来龙去脉,所以在网上找了很多相关资料,整合之后作为一个笔记以后留着,有错误之处请大家批评指正(写得有点乱)。
相关文章推荐
- cocos2d-x学习笔记(一)HelloCpp
- 【学习笔记】Cocos2d-x Lua脚本引擎之HelloLua分析笔记
- JSON学习笔记(格式/第三方库jsonCpp与libJson的配置和使用) cocos2d-x
- Cocos2d-x学习笔记(19)(TestCpp源代码分析-3)
- Cocos2d-x学习笔记(20)(TestCpp源代码分析-4)
- Cocos2d-x学习笔记(18)(TestCpp源代码分析-2)
- Cocos2d-x学习笔记(17)(TestCpp源码分析-1)
- Cocos2d-x学习笔记(18)(TestCpp源码分析-2)
- Android.mk文件中包含cpp文件的三种写法-(cocos2d-x 学习笔记)
- Cocos2d-x学习笔记(19)(TestCpp源码分析-3)
- Cocos2d-x学习笔记(20)(TestCpp源码分析-4)
- cocos2d-x学习笔记(一):渲染框架1
- Cocos2D-X2.2.3学习笔记3(内存管理)
- cocos2d-x碰撞检测学习笔记
- java学习笔记之hellojava之增强版
- cocos2d学习笔记(六)CCParallaxNode和Tile Map
- Cocos2d-x学习笔记(三十)之 游戏存档
- Cocos2d-X 学习笔记 17 Cocos2dx 下对sqlite3 的简单封装
- Cocos2d-x学习笔记(七)CCAction原理分析
- cocos2D-x 3.x学习笔记【5】 缓动效果