虽然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函数依然是程序的入口点:

  1. //main.cpp
  2. int APIENTRY _tWinMain(HINSTANCE hInstance,
  3. HINSTANCE hPrevInstance,
  4. LPTSTR    lpCmdLine,
  5. int       nCmdShow)
  6. {
  7. UNREFERENCED_PARAMETER(hPrevInstance);//该宏用于通知编译器不用检测变量是否使用,如果你喜欢用LV4级的警告。
  8. UNREFERENCED_PARAMETER(lpCmdLine);
  9. // create the application instance
  10. AppDelegate app;//创建AppDelegate实例
  11. CCEGLView* eglView = CCEGLView::sharedOpenGLView();//获取CCEGLView的单一实例,因为还未创建,所以这里会进行创建
  12. eglView->setViewName("HelloCpp");//设置eglView属性
  13. eglView->setFrameSize(2048, 1536);
  14. eglView->setFrameZoomFactor(0.4f);
  15. return CCApplication::sharedApplication()->run();//调用run运行程序
  16. }

其中:

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

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

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

2.CCEGLView类

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

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

再看看,create做了什么

  1. //...
  2. m_hWnd = CreateWindowEx(               // 创建窗体
  3. WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,    // Extended Style For The Window
  4. kWindowClassName,                                    // Class Name
  5. wszBuf,                                                // Window Title
  6. WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX,        // Defined Window Style
  7. 0, 0,                                                // Window Position
  8. 1000,                                               // Window Width
  9. 1000,                                               // Window Height
  10. NULL,                                                // No Parent Window
  11. NULL,                                                // No Menu
  12. hInstance,                                            // Instance
  13. NULL );

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

(1)填充窗口类结构WNDCLASS

(2)注册窗口

(3)创建窗口

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

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

3.CCApplication类

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

  1. int CCApplication::run()
  2. {
  3. PVRFrameEnableControlWindow(false);
  4. // Main message loop:
  5. MSG msg;
  6. LARGE_INTEGER nFreq;
  7. LARGE_INTEGER nLast;
  8. LARGE_INTEGER nNow;
  9. QueryPerformanceFrequency(&nFreq);//获取当前系统频率和计数
  10. QueryPerformanceCounter(&nLast);
  11. // Initialize instance and cocos2d.
  12. if (!applicationDidFinishLaunching())//虚函数,调用子类的重载,这里也会设置一些显示窗口的属性
  13. {
  14. return 0;
  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. // Quit message loop.
  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函数,而这里也就是我们要设置窗口属性和运行游戏的地方了。

  1. bool AppDelegate::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. return true;
  12. }

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

cocos2d-x游戏是怎么跑起来的的更多相关文章

  1. Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)

    Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ...

  2. iOS cocos2d 2游戏开发实战(第3版)书评

    2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...

  3. cocos2d 小游戏

    今天写了一个小游戏,发现看过的代码自己来写还是会经常出错,还是要多自己动手写写哈. 先上几张游戏界面图 void HelloWorld::addTarget() { //首先初始化精灵 CCSprit ...

  4. Cocos2d—X游戏开发之CCScrollView(滑动视图)(十二)

    CCScrollView在Cocos2d-X引擎中主要使用在图片尺寸远大于屏幕尺寸的时候使用. 总体来说,使用起来比较简单. 一个是CCScrollView控件本身,一个是CCScrollViewDe ...

  5. Cocos2d—X游戏开发之CCTableView详解(十一)

    本来很早就想写关于CCTableView的文章,但是在基本功能实现之后呢,项目需求增加导致对这个控件的研究必须更加深入一点. 好的,现在开始介绍一下这个控件,在Cocos2d—X引擎中,这是一个仿制i ...

  6. Cocos2d—X游戏开发之VS2010 控制台输出中文,模拟器中文乱码问题解决

    首先,先解决第一个问题,我们使用VS2010开发的时候,调试的时候,中文打印出来都是乱码,这个问题很纠结. 如下图: CCLOG("cclog: 测试使用标签的自动换行和个别字体大写&quo ...

  7. cocos2d windows游戏平台搭建

    1. 安装VS2013 2. 下载cocos2d源代码(cocos2d-x-3.7.1) 3. 下载和安装python(2.7.10) 4. 安装完成后,将python安装路径设置到系统路径中(pat ...

  8. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  9. coco2d-x 3.0游戏实例学习笔记 《跑酷》 第二步---游戏界面&amp;全新的3.0物理世界

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写.并做相关笔记 ...

随机推荐

  1. linux 后台运行程序

    有些时候,我们需要在终端启动一个程序,并使之运行--但是如果关闭终端,那么这个程序也就随着关闭了.那么有没有什么方法在关闭终端后,让已经从这个终端启动的程序继续运行呢? 前置知识: xterm,con ...

  2. [Android][Audio] audio_policy.conf文件分析

    不同的Android产品在音频的设计上通常是存在差异的,而这些差异可以同过Audio的配置文件audio_policy.conf来获得.在Android系统中音频配置文件存放路径有两处,存放地址可以从 ...

  3. SNMP 和 NetBios协议理解

      一.简单网络管理协议(SNMP,Simple Network Management Protocol)构成了互联网工程工作小组(IETF,Internet Engineering Task For ...

  4. 对easyui datagrid组件的一个小改进

    #对easyui datagrid组件的一个小改进 ##问题 在实际项目中使用datagrid时,受版面限制,有时候表格不能太大,这时候表格里面的内容就不能完全显示,用户需要经常拖动调整列宽才能看完整 ...

  5. Windows Azure 设置虚拟机静态外网IP地址

    官方说法叫做“虚拟公共IP地址保留”,为容易理解,我们称之为静态外网IP地址. 如果在国内使用国际版Windows Azure服务时强烈推荐为虚拟机设置IP地址保留. 由于Windows Azure ...

  6. Arduino1.7.10在Ubuntu下创建快捷方式

    从官网下载的arduino1.7.10版本没有快捷方式只有可执行文件arduino,通过下面的方法可以创建快捷方式 打开链接:http://www.easyicon.net/1171938-ardui ...

  7. 《Java数据结构与算法》笔记-CH4-6栈结构实现中缀转后缀

    /** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...

  8. 关于Unity

    14年左右的时候开始学习了Unity,一直没有时间总结一些东西,框架机制啥的都不用说了,网上到处都有,虽然Unity是脚本机制,但是熟悉编程的人只要理解透了拿面向对象的思维编码也完全没有问题,这里重新 ...

  9. FZU 8月有奖月赛A Daxia & Wzc's problem (Lucas)

    Problem A Daxia & Wzc's problem Accept: 42    Submit: 228Time Limit: 1000 mSec    Memory Limit : ...

  10. POJ1275Cashier Employment(查分约束系统)

    链接1275Cashier Employment 题目大意就是说有一些人来应聘一个超级市场的工作,每个人的应聘的起始时间在0~23时之间,而超市在时间i需要R[i]个工作人员,而每个人的工作时间都是8 ...