1. 程式人生 > >cocos2dx進階學習之CCApplication

cocos2dx進階學習之CCApplication

繼承關係

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