概述
平台: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()随笔所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复