虽然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函数依然是程序的入口点:
- //main.cpp
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);//该宏用于通知编译器不用检测变量是否使用,如果你喜欢用LV4级的警告。
- UNREFERENCED_PARAMETER(lpCmdLine);
- // create the application instance
- AppDelegate app;//创建AppDelegate实例
- CCEGLView* eglView = CCEGLView::sharedOpenGLView();//获取CCEGLView的单一实例,因为还未创建,所以这里会进行创建
- eglView->setViewName("HelloCpp");//设置eglView属性
- eglView->setFrameSize(2048, 1536);
- eglView->setFrameZoomFactor(0.4f);
- return CCApplication::sharedApplication()->run();//调用run运行程序
- }
其中:
(1)AppDelegate继承于CCApplication,是整个游戏的程序类,如果有用过MFC的就很清楚,类似于CxxxApp。
(2)CCEGLView封装了使用openGL作为显示底层API的一个基本的Windows窗体的创建和控制。
可以简单的认为,一个控制了程序的逻辑,而另一个负责游戏的显示。
2.CCEGLView类
我们先看看上一步的CCEGLView::sharedOpenGLView()做了什么。
- CCEGLView* CCEGLView::sharedOpenGLView()
- {
- if (s_pEglView == NULL)//s_pEglView是一个CCEGLView指针,静态成员变量
- {
- s_pEglView = new CCEGLView();
- if(!s_pEglView->Create())//main中调用时,会执行这一步
- {
- delete s_pEglView;
- s_pEglView = NULL;
- }
- }
- return s_pEglView;
- }
再看看,create做了什么
- //...
- m_hWnd = CreateWindowEx( // 创建窗体
- WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, // Extended Style For The Window
- kWindowClassName, // Class Name
- wszBuf, // Window Title
- WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX, // Defined Window Style
- 0, 0, // Window Position
- 1000, // Window Width
- 1000, // Window Height
- NULL, // No Parent Window
- NULL, // No Menu
- hInstance, // Instance
- NULL );
看到上面这一步了吧,使用Win32写过窗体的童鞋,就知道创建一个窗体需要哪些动作:
(1)填充窗口类结构WNDCLASS
(2)注册窗口
(3)创建窗口
(4)显示窗口(这一步没有在CCEGLView中实现,而是在后面的CCApplication中实现,因为这里窗口的属性还没有进行设置)
一样的,创建一个cocos2d-x的win32窗口也是要经过这些步骤。具体的就看源码吧,这里不逐句解释了。就是要注意有个WinProc函数,是用于处理主窗口消息。
3.CCApplication类
我们再看看CCApplication::sharedApplication()->run()执行的又是什么东西。
- int CCApplication::run()
- {
- PVRFrameEnableControlWindow(false);
- // Main message loop:
- MSG msg;
- LARGE_INTEGER nFreq;
- LARGE_INTEGER nLast;
- LARGE_INTEGER nNow;
- QueryPerformanceFrequency(&nFreq);//获取当前系统频率和计数
- QueryPerformanceCounter(&nLast);
- // Initialize instance and cocos2d.
- if (!applicationDidFinishLaunching())//虚函数,调用子类的重载,这里也会设置一些显示窗口的属性
- {
- return 0;
- }
- CCEGLView* pMainWnd = CCEGLView::sharedOpenGLView();获取CCEGLView的单一实例
- pMainWnd->centerWindow();
- ShowWindow(pMainWnd->getHWnd(), SW_SHOW);//这里显示窗口
- while (1)//消息循环
- {
- if (! PeekMessage(&msg, NULL, 0, 0, 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)//获取退出消息,跳出循环
- {
- // Quit message loop.
- 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函数,而这里也就是我们要设置窗口属性和运行游戏的地方了。
- bool AppDelegate::applicationDidFinishLaunching() {
- //第一次初始化导演,导演也是个单例类
- CCDirector* pDirector = CCDirector::sharedDirector();
- //获得CCEGLView单例,设置窗口属性和fps等等
- CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
- ...
- // 创建场景
- CCScene *pScene = HelloWorld::scene();
- // 进入场景
- pDirector->runWithScene(pScene);
- return true;
- }
好了,最后再总结成一张图,cocos2d-x游戏就是这么跑起来的~
cocos2d-x游戏是怎么跑起来的的更多相关文章
-
Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)
Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ...
-
iOS cocos2d 2游戏开发实战(第3版)书评
2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...
-
cocos2d 小游戏
今天写了一个小游戏,发现看过的代码自己来写还是会经常出错,还是要多自己动手写写哈. 先上几张游戏界面图 void HelloWorld::addTarget() { //首先初始化精灵 CCSprit ...
-
Cocos2d—X游戏开发之CCScrollView(滑动视图)(十二)
CCScrollView在Cocos2d-X引擎中主要使用在图片尺寸远大于屏幕尺寸的时候使用. 总体来说,使用起来比较简单. 一个是CCScrollView控件本身,一个是CCScrollViewDe ...
-
Cocos2d—X游戏开发之CCTableView详解(十一)
本来很早就想写关于CCTableView的文章,但是在基本功能实现之后呢,项目需求增加导致对这个控件的研究必须更加深入一点. 好的,现在开始介绍一下这个控件,在Cocos2d—X引擎中,这是一个仿制i ...
-
Cocos2d—X游戏开发之VS2010 控制台输出中文,模拟器中文乱码问题解决
首先,先解决第一个问题,我们使用VS2010开发的时候,调试的时候,中文打印出来都是乱码,这个问题很纠结. 如下图: CCLOG("cclog: 测试使用标签的自动换行和个别字体大写&quo ...
-
cocos2d windows游戏平台搭建
1. 安装VS2013 2. 下载cocos2d源代码(cocos2d-x-3.7.1) 3. 下载和安装python(2.7.10) 4. 安装完成后,将python安装路径设置到系统路径中(pat ...
-
游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
-
coco2d-x 3.0游戏实例学习笔记 《跑酷》 第二步---游戏界面&;amp;全新的3.0物理世界
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写.并做相关笔记 ...
随机推荐
-
JavaScript Json对象和Json对象字符串的关系 jsonObj<;->;JsonString
JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString 如下示例: 直接写的a1就是一个Json对象,a2 就是一个Json对象字符串; 通 ...
-
SQL2005 : 如何在SQL Server Profiler (事件查看器)中 跟踪查看死锁恢复
SQL Profiler 通过 SQL Profiler 工具程序,可监控应用程序如何访问数据库引擎.普通来说,当系统性能需要优化或是应用程序对数据库访问的结果不合预期,都可以使用该工具确认视图问题所 ...
-
LoRaWAN协议(二)--LoRaWAN MAC数据包格式
名词解析 上行:终端的数据发送经过一个或多个网关中转到达网络服务器. 下行:由网络服务器发送给终端设备,每条消息对应的终端设备是唯一确定的,而且只通过一个网关中转. LoRaWAN Classes L ...
-
MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
-
Protobuf动态解析那些事儿
需求背景 在接收到 protobuf 数据之后,如何自动创建具体的 Protobuf Message 对象,再做反序列化.“自动”的意思主要有两个方面:(1)当程序中新增一个 protobuf Mes ...
-
(转载)OC学习篇之---类的初始化方法和点语法的使用
昨天介绍了OC中类的定义和使用,今天我们来继续学习类的初始化方法和点语法的使用. 一.首先来看一下类的初始化方法 在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的, ...
-
python staticmethod classmethod
http://www.cnblogs.com/chenzehe/archive/2010/09/01/1814639.html classmethod:类方法staticmethod:静态方法 在py ...
-
Kafka实践1--Producer
一.Kafka设计原理参考: http://blog.csdn.net/suifeng3051/article/details/48053965?locationNum=2 http://www.cn ...
-
HNOI2018题解
在此处输入标题 标签(空格分隔): 未分类 重做了一遍,本来以为很快的,结果搞了一天... 寻宝游戏 可以发现只有\(\&0\)和\(|1\)会对答案有影响 那么对于每一位,我们只要知道最后一 ...
-
struct在C和C++中的使用总结
主要理解一下两点: 1.在C和C++中struct的常规使用. 2.在C++中struct和class基本一致,除了在访问控制权限方面,即: 通过struct关键字实现的类,属性,函数默认的访问权限为 ...