继承关系
CCApplication-> CCApplicationProtocol
类主要成员变量
static CCApplication * sm_pSharedApplication;
静态成员变量,保存唯一的CCApplication实例的地址。在CCApplication的构造函数里保存唯一实例的地址。
类主要成员函数
CCApplication();
构造函数,在构造函数里将单例唯一的指针保存在静态变量sm_pSharedApplication中。
virtual int run();
循环处理应用程序消息,win32的环境下,run函数同时处理帧更新信息和windows消息,大概代码如下:
int CCApplication::run()
{
PVRFrameEnableControlWindow(false);
// Main message loop:
MSG msg;
LARGE_INTEGER nFreq;
LARGE_INTEGER nLast;
LARGE_INTEGER nNow;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nLast);
// Initialize instance and cocos2d.
if (!applicationDidFinishLaunching())
{
return 0;
}
CCEGLView* pMainWnd = CCEGLView::sharedOpenGLView();
pMainWnd->centerWindow();
ShowWindow(pMainWnd->getHWnd(), SW_SHOW);
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;
}
在run函数中,有一些代码需要注意下:
1)PVRFrameEnableControlWindow(false):将一些程序信息写入注册表
2)回调applicationDidFinishLaunching函数,实现应用程序初始化
// Initialize instance and cocos2d.
if (!applicationDidFinishLaunching())
{
return 0;
}
在进入消息循环之前,调用applicationDidFinishLaunching()函数,这个函数是纯虚函数,要求用户实现,一般模板代码中,是在AppDelegate类中实现的。
3)计算程序运行时间,确定回调
LARGE_INTEGER nFreq;
LARGE_INTEGER nLast;
LARGE_INTEGER nNow;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nLast);
这部分代码在准备计算两次函数调用之间的时间差。这个时间差,用来计算经过的时间,如果超过m_nAnimationInterval调用schedule回调函数。
4)进入windows消息循环
其他代码都是处理windows消息,与cocos2dx关系不大,忽略就好
static CCApplication* sharedApplication();
这个静态函数返回单例的application对象,任何时候想调用CCApplication的接口时,只要使用CCApplication::sharedAppcation()获得app指针后,再调用响应的成员函数。
virtual void setAnimationInterval(double interval);
设置动画刷新间隔时间,这个间隔时间影响run函数调用CCDirector::mainLoop的频率,详细参见run函数
interval以秒为单位,但是保存时使用的是毫秒,因此有转换
总结
CCApplication主要负责提供应用程序初始化接口(通过AppDelegate重载虚函数),实现消息循环,实现CCApplication的单例管理