我是靠谱客的博主 顺心水池,最近开发中收集的这篇文章主要介绍Cocos2d-x 引擎接口 CCApplication->run()随笔,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

平台:Windows、VS2012

main源文件回顾:

在WINDOWS平台中该文件为整个程序的入口,不同平台间程序入口不同,但是总结成一句话不同的平台间通过特有的程序入口,启动程序完成程序的初始化,再通过run方法实现Cocos2d-x引擎的功能。run方法才是真正的Cocos2d-x引擎的入口。

不同平台中在程序入口中实现Cocos2d-x的准备工作即初始化,如下:

1、在实例代码 HelloCpp中 通过继承 CCApplication 创建 AppDelegate 类,CCApplication又继承于 CCApplicationProtocol,又因为CCApplicationProtocol为抽象类,包含如下纯虚函数:

virtual bool applicationDidFinishLaunching() 对应用程序进行初始化,成功则返回true,否则false

virtual void applicationDidEnterBackground() 应用程序运行中断到后台时调用

virtual void applicationWillEnterForeground()应用程序从后台恢复运行时

该三个纯虚函数字子类 AppDelegate 类中必须实现,分别实现相应的功能。 

2、在CCApplication 头文件中 protected 变量中声明了一个静态变量:

static CCApplication * sm_pSharedApplication;

根据C++中子类、基类内存关系,在程序入口中进行初始化时,执行代码:

AppDelegate app;

创建 AppDelegate实例对象时首先调用父类 CCApplication 的构造函数创建对象,构造函数如下:

CCApplication::CCApplication(): m_hInstance(NULL), m_hAccelTable(NULL)
{
    m_hInstance    = GetModuleHandle(NULL);
    m_nAnimationInterval.QuadPart = 0;
    CC_ASSERT(! sm_pSharedApplication);
    sm_pSharedApplication = this;
}

分别将m_nAnimationInterval(帧频率)、sm_pSharedApplication(应用单实例)初始化。

通过代码:

CCEGLView* eglView = CCEGLView::sharedOpenGLView();
    eglView->setViewName("HelloCpp");
    eglView->setFrameSize(2048, 1536);

   获得显示窗口单实例,设置窗口标题,显示大小

   接下来正式启动Cocos2d-x入口:

   return CCApplication::sharedApplication()->run();

   详细代码解释:

    PVRFrameEnableControlWindow(false);设置注册表PVRFrame隐藏

    MSG msg;
    LARGE_INTEGER nFreq;
    LARGE_INTEGER nLast;
    LARGE_INTEGER nNow;
主消息循环

    QueryPerformanceFrequency(&nFreq);Windows高精度定时器用法,获取频率

    QueryPerformanceCounter(&nLast);获取当前计数值,频率*时间

    // Initialize instance and cocos2d.
    if (!applicationDidFinishLaunching())
    {
        return 0;
    }

   通过多态性,由父类对象调用子类方法,即在AppDelegate中现实的方法判断是否初始化成功,在子类AppDelegate源文件可看到代码为:

    CCDirector* pDirector = CCDirector::sharedDirector();获取CCDirector类单实例对象

    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();获取CCEGLView类的显示窗口单实例

    pDirector->setOpenGLView(pEGLView);设置导演类控制的窗口实例

   CCSize frameSize = pEGLView->getFrameSize();获取显示窗口的大小

等一系列对显示窗体的操作(具体看AppDelegate类使用分析)

若初始化完成则继续执行,否则返回

CCEGLView* pMainWnd = CCEGLView::sharedOpenGLView();
pMainWnd->centerWindow();
ShowWindow(pMainWnd->getHWnd(), SW_SHOW);
继续一系列窗体显示设置

   接下来的while(1)死循环,保证应用程序能无限的接收控制信息、显示刷新等动作。

 if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))判断是否接收到Windows消息,若有则执行定时刷新帧

 // 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;

若接收到Windows消息则进行消息处理:

 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);
        }

最后

以上就是顺心水池为你收集整理的Cocos2d-x 引擎接口 CCApplication->run()随笔的全部内容,希望文章能够帮你解决Cocos2d-x 引擎接口 CCApplication->run()随笔所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部