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

原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12554167


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


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

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

1.main函数

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

[cpp] view plain copy
  1. //main.cpp
  2. intAPIENTRY_tWinMain(HINSTANCEhInstance,
  3. HINSTANCEhPrevInstance,
  4. LPTSTRlpCmdLine,
  5. intnCmdShow)
  6. {
  7. UNREFERENCED_PARAMETER(hPrevInstance);//该宏用于通知编译器不用检测变量是否使用,如果你喜欢用LV4级的警告。
  8. UNREFERENCED_PARAMETER(lpCmdLine);
  9. //createtheapplicationinstance
  10. AppDelegateapp;//创建AppDelegate实例
  11. CCEGLView*eglView=CCEGLView::sharedOpenGLView();//获取CCEGLView的单一实例,因为还未创建,所以这里会进行创建
  12. eglView->setViewName("HelloCpp");//设置eglView属性
  13. eglView->setFrameSize(2048,1536);
  14. eglView->setFrameZoomFactor(0.4f);
  15. returnCCApplication::sharedApplication()->run();//调用run运行程序
  16. }
其中:

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

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

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


2.CCEGLView类

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

[cpp] view plain copy
  1. CCEGLView*CCEGLView::sharedOpenGLView()
  2. {
  3. if(s_pEglView==NULL)//s_pEglView是一个CCEGLView指针,静态成员变量
  4. {
  5. s_pEglView=newCCEGLView();
  6. if(!s_pEglView->Create())//main中调用时,会执行这一步
  7. {
  8. deletes_pEglView;
  9. s_pEglView=NULL;
  10. }
  11. }
  12. returns_pEglView;
  13. }

再看看,create做了什么

[cpp] view plain copy
  1. //...
  2. m_hWnd=CreateWindowEx(//创建窗体
  3. WS_EX_APPWINDOW|WS_EX_WINDOWEDGE,//ExtendedStyleForTheWindow
  4. kWindowClassName,//ClassName
  5. wszBuf,//WindowTitle
  6. WS_CAPTION|WS_POPUPWINDOW|WS_MINIMIZEBOX,//DefinedWindowStyle
  7. 0,0,//WindowPosition
  8. 1000,//WindowWidth
  9. 1000,//WindowHeight
  10. NULL,//NoParentWindow
  11. NULL,//NoMenu
  12. hInstance,//Instance
  13. NULL);

看到上面这一步了吧,使用Win32写过窗体的童鞋,就知道创建一个窗体需要哪些动作:

(1)填充窗口类结构WNDCLASS

(2)注册窗口

(3)创建窗口

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

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


3.CCApplication类

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

[cpp] view plain copy
  1. intCCApplication::run()
  2. {
  3. PVRFrameEnableControlWindow(false);
  4. //Mainmessageloop:
  5. MSGmsg;
  6. LARGE_INTEGERnFreq;
  7. LARGE_INTEGERnLast;
  8. LARGE_INTEGERnNow;
  9. QueryPerformanceFrequency(&nFreq);//获取当前系统频率和计数
  10. QueryPerformanceCounter(&nLast);
  11. //Initializeinstanceandcocos2d.
  12. if(!applicationDidFinishLaunching())//虚函数,调用子类的重载,这里也会设置一些显示窗口的属性
  13. {
  14. return0;
  15. }
  16. CCEGLView*pMainWnd=CCEGLView::sharedOpenGLView();获取CCEGLView的单一实例
  17. pMainWnd->centerWindow();
  18. ShowWindow(pMainWnd->getHWnd(),SW_SHOW);//这里显示窗口
  19. while(1)//消息循环
  20. {
  21. if(!PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  22. {
  23. //获取当前的计数
  24. QueryPerformanceCounter(&nNow);
  25. //判断时间流逝,是否该绘制下一帧
  26. if(nNow.QuadPart-nLast.QuadPart>m_nAnimationInterval.QuadPart)
  27. {
  28. nLast.QuadPart=nNow.QuadPart;
  29. CCDirector::sharedDirector()->mainLoop();//渲染场景(清除显示设备,重绘场景)
  30. }
  31. else
  32. {
  33. Sleep(0);
  34. }
  35. continue;
  36. }
  37. if(WM_QUIT==msg.message)//获取退出消息,跳出循环
  38. {
  39. //Quitmessageloop.
  40. break;
  41. }
  42. //处理Windows消息
  43. if(!m_hAccelTable||!TranslateAccelerator(msg.hwnd,m_hAccelTable,&msg))
  44. {
  45. TranslateMessage(&msg);
  46. DispatchMessage(&msg);
  47. }
  48. }
  49. return(int)msg.wParam;
  50. }

好了,解释的应该算比较清楚了,虽然没有每一个函数都进去。。。这里再总结一下:

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

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

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

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

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


4.AppDelegate类

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

[cpp] view plain copy
  1. boolAppDelegate::applicationDidFinishLaunching(){
  2. //第一次初始化导演,导演也是个单例类
  3. CCDirector*pDirector=CCDirector::sharedDirector();
  4. //获得CCEGLView单例,设置窗口属性和fps等等
  5. CCEGLView*pEGLView=CCEGLView::sharedOpenGLView();
  6. ...
  7. //创建场景
  8. CCScene*pScene=HelloWorld::scene();
  9. //进入场景
  10. pDirector->runWithScene(pScene);
  11. returntrue;
  12. }

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

【玩转cocos2d-x之三】cocos2d-x游戏是怎么跑起来的_第2张图片

你可能感兴趣的:(【玩转cocos2d-x之三】cocos2d-x游戏是怎么跑起来的)