Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【玩转cocos2d-x之三】cocos2d-x游戏是怎么跑起来的大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_944_0@ 原创作品,转载请标明:http://www.voidcn.com/article/p-uyectmud-ep.html

@H_944_0@

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

@H_944_0@

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


1.main函数

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

@H_944_0@

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

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

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

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

@H_944_0@

2.CCEGLView类

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

@H_944_0@

copy
    CCEGLView*CCEGLView::sharedopenGLView()
  1. if(s_pEglView==NULL)//s_pEglView是一个CCEGLView指针,静态成员变量
  2. {
  3. s_pEglView=newCCEGLView();
  4. if(!s_pEglView->Create())//main中调用时,会执行这一步
  5. deletes_pEglView;
  6. s_pEglView=NULL;
  7. }
  8. }
  9. returns_pEglView;
  10. }
@H_262_295@ 再看看,create做了什么 @H_944_0@

@H_944_0@

copy
    //...
  1. @H_689_63@m_hWnd=CreateWindowEx(//创建窗体
  2. WS_EX_APPWINDOW|WS_EX_WINDOWEDGE,//ExtendedStyleForTheWindow
  3. kWindowClassName,0); BACkground-color:inherit">//ClassName
  4. wszBuf,0); BACkground-color:inherit">//Windowtitle
  5. WS_CAPTION|WS_POPUPWINDOW|WS_MINIMIZEBOX,0); BACkground-color:inherit">//DefinedWindowStyle
  6. 0,0); BACkground-color:inherit">//WindowPosition
  7. 1000,0); BACkground-color:inherit">//WindowWidth
  8. 1000,0); BACkground-color:inherit">//WindowHeight
  9. NULL,0); BACkground-color:inherit">//NoParentWindow
  10. NULL,0); BACkground-color:inherit">//NoMenu
  11. hInstance,0); BACkground-color:inherit">//Instance
  12. null);
@H_262_295@ 看到上面这一步了吧,使用Win32写过窗体的童鞋,就知道创建一个窗体需要哪些动作: @H_944_0@

@H_944_0@ (1)填充窗口类结构WNDCLASS

@H_944_0@ (2)注册窗口

@H_944_0@ (3)创建窗口

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

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

@H_944_0@

3.CCApplication类

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

@H_944_0@

copy
    intCCApplication::run()
  1. PVRFrameEnableControlWindow(false);
  2. //Mainmessageloop:
  3. @H_689_63@mSGmsg;
  4. LARGE_IntegeRnFreq;
  5. LARGE_IntegeRnLast;
  6. LARGE_IntegeRnNow;
  7. QueryPerfoRMANceFrequency(&nFreq);//获取当前系统频率和计数
  8. QueryPerfoRMANceCounter(&nLast);
  9. //Initializeinstanceandcocos2d.
  10. if(!applicationDidFinishLaunching())//虚函数,调用子类的重载,这里也会设置一些显示窗口的属性
  11. return0;
  12. CCEGLView*pMainWnd=CCEGLView::sharedopenGLView();获取CCEGLView的单一实例
  13. pMainWnd->centerWindow();
  14. ShowWindow(pMainWnd->getHWnd(),SW_SHOW);//这里显示窗口
  15. while(1)//消息循环
  16. if(!Peekmessage(&msg,NULL,PM_REMOVE))
  17. //获取当前的计数
  18. QueryPerfoRMANceCounter(&nNow);
  19. //判断时间流逝,是否该绘制下一帧
  20. if(nNow.QuadPart-nLast.QuadPart>m_nAnimationInterval.QuadPart)
  21. nLast.QuadPart=nNow.QuadPart;
  22. CCDirector::sharedDirector()->mainLoop();//渲染场景(清除显示设备,重绘场景)
  23. else
  24. Sleep(0);
  25. conTinue;
  26. if(WM_QUIT==msg.messagE)//获取退出消息,跳出循环
  27. //Quitmessageloop.
  28. break;
  29. //处理Windows消息
  30. if(!m_hAccelTable||!TranslateAccelerator(msg.hwnd,m_hAccelTable,&msg))
  31. Translatemessage(&msg);
  32. Dispatchmessage(&msg);
  33. return(int)msg.wParam;
  34. }
@H_262_295@ 好了,解释的应该算比较清楚了,然没有每一个函数都进去。。。这里再总结一下: @H_944_0@

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

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

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

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

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

@H_944_0@

4.AppDelegate类

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

@H_944_0@

copy
    boolAppDelegate::applicationDidFinishLaunching(){
  1. //第一次初始化导演,导演也是个单例类
  2. CCDirector*pDirector=CCDirector::sharedDirector();
  3. //获得CCEGLView单例,设置窗口属性和fps等等
  4. CCEGLView*pEGLView=CCEGLView::sharedopenGLView();
  5. ...
  6. //创建场景
  7. CCScene*pScene=HelloWorld::scene();
  8. //进入场景
  9. pDirector->runWithScene(pScenE);
  10. returntrue;
  11. }
@H_262_295@ @H_944_0@ 好了,最后再总结成一张图,cocos2d-x游戏就是这么跑起来的~

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:cocoscocos2ddx怎么游戏起来
猜你在找的Cocos2d-x相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap