【玩转cocos2d-x之三】cocos2d-x游戏是怎么跑起来的

【玩转cocos2d-x之三】cocos2d-x游戏是怎么跑起来的,第1张

概述原创作品,转载请标明:http://www.voidcn.com/article/p-uyectmud-ep.html 虽然cocos2d-x v3.0 alpha版已经出来了,也改进了不少,有兴趣的可以去尝尝鲜。因为后面可能还会配合cocoStudio写一下博客,而现在v1.0.0.0版本需要配合cocos2d-x v2.2.0使用。所以这里选择了V2.2.0版的cocos2d-x。 一个新的东

原创作品,转载请标明:http://www.jb51.cc/article/p-uyectmud-ep.html


虽然cocos2d-x v3.0 Alpha版已经出来了,也改进了不少,有兴趣的可以去尝尝鲜。因为后面可能还会配合cocoStudio写一下博客,而现在v1.0.0.0版本需要配合cocos2d-x v2.2.0使用。所以这里选择了V2.2.0版的cocos2d-x。


一个新的东西,从头开始吧!从HelloWorld出发看一下一个cocos2d-x游戏是怎么跑起来的。先看看它的结构。


1.main函数

还是原来配方还是熟悉的味道。。。霸气的main函数依然是程序的入口点:

[cpp] view plain copy //main.cpp intAPIENTRY_tWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPTSTRlpCmdline,87); Font-weight:bold; background-color:inherit">intnCmdshow) { UNREFERENCED_ParaMETER(hPrevInstance);//该宏用于通知编译器不用检测变量是否使用,如果你喜欢用LV4级的警告。 UNREFERENCED_ParaMETER(lpCmdline); //createtheapplicationinstance AppDelegateapp;//创建AppDelegate实例 CCEGLVIEw*eglVIEw=CCEGLVIEw::sharedOpenGLVIEw();//获取CCEGLVIEw的单一实例,因为还未创建,所以这里会进行创建 eglVIEw->setVIEwname("HelloCpp");//设置eglVIEw属性 eglVIEw->setFrameSize(2048,1536); eglVIEw->setFrameZoomFactor(0.4f); returnCCApplication::sharedApplication()->run();//调用run运行程序 } 其中:

(1)AppDelegate继承于CCApplication,是整个游戏的程序类,如果有用过MFC的就很清楚,类似于CxxxApp。

(2)CCEGLVIEw封装了使用openGL作为显示底层API的一个基本的windows窗体的创建和控制。

可以简单的认为,一个控制了程序的逻辑,而另一个负责游戏的显示。


2.CCEGLVIEw类

我们先看看上一步的CCEGLVIEw::sharedOpenGLVIEw()做了什么。

copy CCEGLVIEw*CCEGLVIEw::sharedOpenGLVIEw() if(s_pEglVIEw==NulL)//s_pEglVIEw是一个CCEGLVIEw指针,静态成员变量 { s_pEglVIEw=newCCEGLVIEw(); if(!s_pEglVIEw->Create())//main中调用时,会执行这一步 deletes_pEglVIEw; s_pEglVIEw=NulL; } } returns_pEglVIEw; }
再看看,create做了什么

copy //... m_hWnd=CreateWindowEx(//创建窗体 WS_EX_APPWINDOW|WS_EX_WINDOWEDGE,//ExtendedStyleForTheWindow kWindowClassname,0); background-color:inherit">//Classname wszBuf,0); background-color:inherit">//WindowTitle WS_CAPTION|WS_POPUPWINDOW|WS_MINIMIZEBox,0); background-color:inherit">//definedwindowstyle 0,0); background-color:inherit">//Windowposition 1000,0); background-color:inherit">//WindowWIDth 1000,0); background-color:inherit">//WindowHeight NulL,0); background-color:inherit">//noparentwindow NulL,0); background-color:inherit">//NoMenu hInstance,0); background-color:inherit">//Instance NulL);
看到上面这一步了吧,使用Win32写过窗体的童鞋,就知道创建一个窗体需要哪些动作:

(1)填充窗口类结构WNDCLASS

(2)注册窗口

(3)创建窗口

(4)显示窗口(这一步没有在CCEGLVIEw中实现,而是在后面的CCApplication中实现,因为这里窗口的属性还没有进行设置)

一样的,创建一个cocos2d-x的win32窗口也是要经过这些步骤。具体的就看源码吧,这里不逐句解释了。就是要注意有个WinProc函数,是用于处理主窗口消息。


3.CCApplication类

我们再看看CCApplication::sharedApplication()->run()执行的又是什么东西。

copy intCCApplication::run() PVRFrameEnableControlWindow(false); //Mainmessageloop: MSGmsg; LARGE_INTEGERnFreq; LARGE_INTEGERnLast; LARGE_INTEGERnNow; queryPerformanceFrequency(&nFreq);//获取当前系统频率和计数 queryPerformanceCounter(&nLast); //Initializeinstanceandcocos2d. if(!applicationDIDFinishLaunching())//虚函数,调用子类的重载,这里也会设置一些显示窗口的属性 return0; CCEGLVIEw*pMainWnd=CCEGLVIEw::sharedOpenGLVIEw();获取CCEGLVIEw的单一实例 pMainWnd->centerWindow(); ShowWindow(pMainWnd->getHWnd(),SW_SHOW);//这里显示窗口 while(1)//消息循环 if(!PeekMessage(&msg,NulL,PM_REMOVE)) //获取当前的计数 queryPerformanceCounter(&nNow); //判断时间流逝,是否该绘制下一帧 if(nNow.QuadPart-nLast.QuadPart>m_nAnimationInterval.QuadPart) nLast.QuadPart=nNow.QuadPart; CCDirector::sharedDirector()->mainLoop();//渲染场景(清除显示设备,重绘场景) else Sleep(0); continue; if(WM_QUIT==msg.message)//获取退出消息,跳出循环 //Quitmessageloop. break; //处理windows消息 if(!m_hAcceltable||!TranslateAccelerator(msg.hwnd,m_hAcceltable,&msg)) TranslateMessage(&msg); dispatchMessage(&msg); return(int)msg.wParam; }
好了,解释的应该算比较清楚了,虽然没有每一个函数都进去。。。这里再总结一下:

(1)首先先获取当前系统的频率和计数。这是一个很大的值,所以用了一个LARGE_INTEGER型变量来存储。

(2)调用子类的applicationDIDFinishLaunching(),执行进入程序后的一些初始化工作。

(3)获取CCEGLVIEw单例,显示窗口。

(4)进入循环While(1),重绘每一帧的场景。

好了,更多关于CCApplication的请看源码吧。


4.AppDelegate类

从上面的分析我们知道CCApplication::run()函数中会调用子类(AppDelegate)的applicationDIDFinishLaunching函数,而这里也就是我们要设置窗口属性和运行游戏的地方了。

copy boolAppDelegate::applicationDIDFinishLaunching(){ //第一次初始化导演,导演也是个单例类 CCDirector*pDirector=CCDirector::sharedDirector(); //获得CCEGLVIEw单例,设置窗口属性和fps等等 CCEGLVIEw*pEGLVIEw=CCEGLVIEw::sharedOpenGLVIEw(); ... //创建场景 CCScene*pScene=HelloWorld::scene(); //进入场景 pDirector->runWithScene(pScene); returntrue; }

好了,最后再总结成一张图,cocos2d-x游戏就是这么跑起来的~

总结

以上是内存溢出为你收集整理的【玩转cocos2d-x之三】cocos2d-x游戏是怎么跑起来的全部内容,希望文章能够帮你解决【玩转cocos2d-x之三】cocos2d-x游戏是怎么跑起来的所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1065398.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存