cocos2dx进阶学习之CCApplication

时间:2024-11-29 16:07:43

继承关系

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的单例管理