cocos2dx是一个开源的C++游戏开发框架,实现了很多开发游戏常用的底层api,我们可以通过调用框架实现的api来根据自己的想法构建游戏。
cocos2dx是跨平台的,使用cmake构建同一套源代码在不同平台下不同编译环境的项目结构,在相应的平台打包就可以得到相应的可执行程序。
本文使用windows平台进行开发,需要cmake生成visual studio2019的项目结构,并使用vs2019打包出win32平台的可执行程序。
(其实也尝试了在Android Studio中生成Android平台安装包,但是由于中文编码问题失败了)
搭建开发环境
必要工具
cmake3.7
这个可以直接在vs2019中的工具里获取
然后在单个组件里搜索cmake,安装那个用于windows的cmake然后保存修改就好了
python2.7
https://www.python.org/downloads/release/python-2718/
在这个网址里面安装下面列表中的这个版本
cocos2dx
https://www.cocos.com/cocos2dx
下载这个里面的4.0版本然后解压,放在你想放的目录里
环境变量
接下来检查系统环境变量里的这四个东西
一定要有这四个文件夹
cmake的bin文件夹
我电脑上的目录在
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin
cocos2dx4的命令行工具bin文件夹
我的是在
C:\Cocos\Cocos2d-x\cocos2d-x-4.0\tools\cocos2d-console\bin
python的命令行工具
我的是在
C:\Python27
vs2019的MSVC命令行工具
我的在
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64
如果这4个文件夹不在Path里的话,一定记得补上自己电脑上相应的目录
检查和添加完了以后,重启电脑
安装
然后进入解压后的cocos目录下运行setup.py,就算全部安装完了
建立项目
建立cocos项目
进入命令行工具,输入这个命令
1 | cocos new HelloWorld -l cpp -d E:\cocos\Projects |
其中HelloWorld是项目的名称
E:\cocos\Projects是项目的绝对路径
这两个可以是自定义的,便于演示后面就用这两个代替
使用cmake从通用项目中创建windows下的visual studio2019式项目结构
进入通用项目的目录
创建windows下的项目组织目录
1 | cd E:\cocos\Projects\HelloWorld |
然后你就能看到这个文件夹里生成了项目名称的vs2019的sln文件
从visual studio中生成,编译,运行cocos项目
打开HelloWorld.sln,在vs2019中启动工程
然后在HelloWorld上右键设为启动项目
然后就可以像平常一样生成,运行和调试了
项目结构
文件结构
进行cocos new和cmake生成的cocos2dx的项目文件目录大概长这个亚子
其中Classes文件夹是我们需要关心的源代码,也就是说所有的游戏代码都应该在这个文件夹中编写。
cocos2d文件夹中是复制过来的引擎框架,每一个项目都是一样的。这里面有cocos2dx的源代码。
proj.XXX系列文件夹是不同平台下cmake构建的文件夹,不用关心。
Resources文件夹也是我们需要关心的,这里面应该存放我们游戏中用到的字体、音乐、图片、视频、配置文件、字符映射表等等资源文件。
win32-build文件夹是cmake生成的临时文件夹,里面是vs2019的项目组织结构,每次cmake都会更新,不需要关注。
CmakeLists.txt是cmake组织源代码生成不同平台项目架构的依据,每在Classes中添加的文件,都要在CmakeLists中注册,并重新使用cmake生成。
代码结构
先来看看Classes中的结构
AppDelelgate就是程序的入口,控制程序窗口的各个参数,具体的用法可以看看其中的注释,解释的非常的详细。这份代码是框架提供给你的入口,从此以后的代码,就要你自己完成了。
运行模式
现在,让我们来理解一下使用cocos2dx编译的代码是怎么样运行的。
主循环
众所周知,游戏窗口是一直存在在桌面上的,但这个游戏程序确是要一直不停运行的,不可能在任何时刻让程序停下来等玩家进行交互,也就是说只要程序窗口还开着,我们的程序就在不停的执行一些代码,准确来说是执行一个循环,这个循环叫做主循环。主循环在cocos2dx引擎内部,我们无权改动任何cocos2dx内部的代码。每次循环中,虽然看起来游戏的窗口并没有变化,但其实整个游戏窗口的画面都会被抹去然后重新绘制,这样的每次循环我们叫做一帧,cocos2dx默认的帧率能达到每秒60次,所以我们才会感觉到窗口没有变化。当需要绘制的东西过多,循环效率明显低于每秒60次时,我们的肉眼就会直观的感觉到画面重绘的过程,也就是我们所说的游戏卡顿。
既然游戏运行的时候一直在执行循环,而这个循环我们又无权改动,那要在哪里写代码才能改动游戏的窗口呢?同样我们设计的对象又要怎么样存活到游戏结束呢?游戏和玩家的交互要怎样执行呢?
遇到细节上不懂的问题,建议查阅官方api,api中有详细的注释
类的初始化
在阅读了官方文档以后,我们就会发现,几乎所有游戏窗口的设计定位都是在场景和层的初始化中进行的,我们所做的一切不过是构建了一个场景树,然后主循环的每一帧,游戏都会按照顺序层次渲染场景树对应的图形。而导演这个类其实就是游戏主循环实现的类,场景切换就是设置主循环接下来要渲染的场景树。
在写过一些cocos2dx的类以后就会发现,绝大部分我们写的代码是在对各种将要显示在屏幕上的东西进行初始化。
内存管理
既然场景树可能在主循环中用到,也就是说场景树必须要在主循环上存活,因此场景树中的所有内容应都是动态申请内存。cocos2dx为了方便内存管理,自己实现了一套引用计数,用于记录何时释放场景树上不用的节点。具体的细节参见这里
锦囊——回调函数
接下来解决交互的问题,游戏肯定是需要有一些操作需要交互的,也就是说必须要等到用户有一些反应,我们才能得到相应的信息并进行相关的处理,那么如果我们没法改动主循环,怎样才能在用户做出反应以后做出响应呢?这就要依靠回调函数了。回调函数就像是在初始化的时候留下的锦囊,使用cocos相关的控件的时候,可以给这些控件传递回调函数,回调函数是一个函数对象,在空间接收到相应的操作后,就会执行这个回调函数,并传入相关的信息。官方文档中有对这些控件的详细解释。在回调函数中,可以设计一些响应交互的内容。其实整个游戏逻辑运行,绝大部分内容都是在回调函数中执行的。除了控件,在很多动画,动作序列中,也可以通过回调函数实现比较奇妙的功能。
消息机制
游戏中除了通过控件,也可以通过消息监听与事件分发机制完成程序与玩家的交互。详情见官方文档。