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



  • 相关阅读:
    Java设计模式--单列设计模式
    TCP服务器端和客服端(一)
    面向对象 ---Java抽象类
    全新的代码
    黑马程序员入学基础测试(五)
    mysql 权限管理
    centos7 端口开放
    centos7 yum 安装 mysql
    centos7 安装jdk
    centos7 yum 安装jq
  • 原文地址:https://www.cnblogs.com/new0801/p/6177231.html
Copyright © 2020-2023  润新知