cocos2dx進階學習之CCApplication
繼承關係
CCApplication-> CCApplicationProtocol
類主要成員變數
static CCApplication * sm_pSharedApplication;
靜態成員變數,儲存唯一的CCApplication例項的地址。在CCApplication的建構函式裡儲存唯一例項的地址。
類主要成員函式
CCApplication();
建構函式,在建構函式裡將單例唯一的指標儲存在靜態變數sm_pSharedApplication中。
virtual int run();
迴圈處理應用程式訊息,win32的環境下,run函式同時處理幀更新資訊和windows訊息,大概程式碼如下:
在run函式中,有一些程式碼需要注意下: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; }
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的單例管理