Cocos2d-x 引擎接口 CCApplication->run()随笔

本文详细介绍了Cocos2d-x游戏引擎在Windows平台下的初始化过程,包括AppDelegate类的作用及其实现,以及如何通过CCApplication类启动并配置Cocos2d-x。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平台: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);
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值