解决Cocos2d-x编写Windows游戏时创建项目的困难

本文来自MOMO籽的CSDN博客,转载自:http://blog.csdn.net/kasenohayate/article/details/18429121

本文章属于个人原创,因为所涉及的技术并不高,很有可能出现雷同,
如需转载,请注明出处,如有错漏,还望指正,谢谢谅解!!!

小弟MOMO刚刚开始接触cocos2dx,菜鸟一个。首先的问题就是环境搭建了,引擎下载下来解压后,一大堆文件,弄得MOMO不知所措。所以MOMO第一时间是上官方看帮助,看看这个最近炒得火热的引擎在Windows下是如何使用的。弄了半天,范例程序终于可以顺利编译和运行,但无奈的是,关于如何创建一个新的cocos项目还是没办法搞定,MOMO下载的是3.0-alpha0版本,但是这个版本已经取消了之前创建项目模板的那个bat文件,再到网上搜搜,说用python脚本,但是最后没办法搞定。于是MOMO静下来思考,终于想到了一个可行的办法,这个办法不需要任何辅助软件,而且应该是与编译器无关的方法(PS:之所以说应该而不是一定是因为MOMO除了在VS2012之外没做过其他编译器的测试,看到此文章的各路朋友可以的话帮忙做做测试,顺便把结果分享一下,


由于MOMO是一个穷B学生兼编程爱好者而非程序员,所以暂时只对如何利用cocos2dx在 Windows下编写游戏感兴趣,至于跨平台暂时没做研究,所以这个方法也只是针对Windows平台的,谢谢谅解!

1.使用篇
废话后开始入正题了,在讲解怎么样自己动手解决之前,先发个成品,我知道这是伸手党最爱的,特别是像我这样的菜鸟(无恶意

),成品的版本是3.0-alpha0,不喜欢这个版本的同志先暂时跳过这里,直接看下面制作篇如何自己手动制作。
成品传送门:

头文件和DLL文件:

http://download.csdn.net/detail/kasenohayate/6863359

Lib文件(感谢7z高比率的压缩,把150M的东西压成10M,逃过了CSDN文件大小50M的限制):

http://download.csdn.net/detail/kasenohayate/6863363

假如您是一位老牌程序员,估计你应该知道下一步怎么做了,但是作为一名负责任的菜鸟,MOMO还是要提供一下使用方法。首先找到你所用的编译器的系统库目录和头文件目录。什么?不知道在哪里?你随便打开一个工程里面包含有include系统库的语句,类似#include <stdio.h>这样的,然后定位一下 stdio.h这个文件,就能找到了编译系统的头文件目录了(一般是XXXX\include),库目录一般也是跟头文件目录在同一目录下的(一般是XXXX\Lib),VS2012的系统目录有几个,我选择了%VS2012安装路径%\VC\include和%VS2012安装路径%\VC\lib。
然后,把cocos2dx-3.0-include&dll.zip里面的cocos2dx文件夹解压并拷贝到头文件目录(XXXX\include),把cocos2dx-3.0-Lib.7z里面的cocos2dx文件文件夹解压并拷贝到库目录(XXXX\Lib),然后引擎的安装就基本完成了,就是如此的简单。

接下来就是测试使用了,现在创建一个Win32的工程项目,写一个简单的Demo,测试一下,在需要用到cocos2dx的cpp文件加上一句
#include <cocos2dx/cocos2d-win32.h>,然后cocos2dx里面的所有Class和宏以及枚举等等都可以使用了,假如你是懒人或者是没接触过cocos2dx的话,没关系,帮人帮到底,送佛送到西,MOMO给你提供一下测试代码,这个代码是拿cocos2dx里面的HelloWord修改而来的,照旧,传送门:
http://download.csdn.net/detail/kasenohayate/6863397

把里面的所有.cpp和.h文件都添加到你的工程里头就可以直接编译了,无需任何修改。

假如你测试时遇到编译通过但是程序运行时崩溃的话,说明你太心急了,第一,cocos2dx是需要一些库的支持,这些库的DLL文件就在上面的cocos2dx-3.0-include&dll.zip包里面。第二,假如你是运行我上传的那个测试代码,那它是需要一些资源文件支持的,这些文件testcode.zip里面也包含了,解决办法就是把这些文件拷贝到你程序的运行目录里面,切记,用编译器调试程序时的运行目录不一定是跟生成的exe为同一个目录,是哪个就要看你编译器的编译选项了。
假如你运行MOMO上传的测试代码,并且看到下面的框框跳出来,说明你成功了。

在这里吐槽一下cocos2d-x的作者还真会赶上潮流,3.0版本用的是C++ 11的语法标准(各个2.x版本是什么标准没研究过),所以编译器需要支持对C++ 11的编译(无需完全支持),本来MOMO想利用这个方法把引擎搬到VS2008使用的,因为一直以来都用它,有着深厚的感情不说,个人笔记本上面的C盘满得已经塞不下一个VS2012了,而C++ 11标准是2011年发布的,VS2010部分支持,VS2012大部分支持,VS2008不支持,结果是编译报错了,假如正在看此文章的你也在使用旧版编译器的话,那只能升级到支持C++ 11的版本或者更换编译器了,这个你也不能怪MOMO了。

2.制作篇

好了,正所谓自己动手,风衣足食,本文章也不是单纯的资源分享帖,下面来就叙述一下MOMO上传的两个包包是怎么炼成的。
这里依然是以MOMO使用的3.0-alpha0版本为例,第一件事情不用我说,先到官网把引擎下载下来,连接不贴了,百度一下就行了,在中国官方里头也有得下载。
引擎下载完成后,进行解压,切记,解压的路径不得含有中文,要不等下会出错(表示我这里都不知道折腾了很久才发现这个问题,官方也不给个提示

),这里解压出来看到进入cocos2d-x-3.0alpha0-pre文件夹底下你会看到一个叫“build-win32.bat”的文件,你用记事本打开看看就能大概猜出这个批处理文件是用来编译代码来组建引擎的,并且你会发现它只支持VS2012和VC++2012,没有安装这两个编译器的其中一个,这个文件是不能运行的,当然,假如你用的是2.x版本的话对应的是别的build-win32-XXX.bat,支持什么编译器就看具体版本了,所以手动制作实际上还需要一台装有VS或者VC的电脑。
双击运行build-win32.bat,耐心等待编译,编译成功后会自动运行TestCpp.exe,如下:

关掉这个程序,先不要急着去玩弄它,后面还有正事要做呢,上面的步骤实际上是让VS2012编译一遍cocos2dx的所有代码并生成相应lib文件。
回到cocos2d-x-3.0alpha0-pre文件夹底下,你会发现多了两个文件夹,一个是Debug.win32,另一个是Release.win32,这两个文件夹都是运行build-win32.bat时所创建的,首先随便找个位置创建一个文件夹命名为cocos2dx,然后再往里面添加两个文件夹Debug和Release。打开Release.win32,在凌乱的文件当中找出所有的lib文件,方法很简单,把文件排列方式设定为按类型排列就很快找出来了。

3.0版本的这些文件一共16个,总大小共66M左右,不要觉得惊讶,10多分钟的编译过程大部分是用于创建这些文件,这些lib包含了所有cocos2d-x的核心代码。
接下来把这16个文件拷到刚刚创建的cocos2dx\Release里面,然后按照同样的方法把Debug.win32里面的16个同样名字lib拷到cocos2dx\Debug里面,注意了,在Debug.win32里面一共是23个lib文件,除了16个名字跟Release.win32以外,其他都是范例代码生成的lib,跟引擎无关,所以并不需要拷贝,这也是为什么MOMO让你先弄Release.win32的原因(3.0-alpha0版本是16个,其他版本就以Release.win32数量为准)。
最后,在你创建的cocos2dx还要加入openg32.lib这个库文件,因为cocos2dx是以OpenGL为核心的。当然,编译器本来就自带这个库的话就不用了,没有的话也可以到网上下载,不想找的话直接在使用篇上面的cocos2dx-3.0-Lib.7z里面提取。
至此,你的lib库已经制作完成了,你可以把你创建的cocos2dx文件夹拖到编译器的系统库目录底下使用和打包储存,它的作用跟cocos2dx-3.0-Lib.7z包里面的一样。先别松懈,繁琐的工作现在才来。

接下来,我们需要做的就是提取.h文件了,回到cocos2d-x-3.0alpha0-pre文件夹底下,你会看到一个cocos2dx的文件夹,里面包含所有cocos2dx的源代码,整一个文件夹200多M但里面只有8M左右我们是需要的。多说无用,先找个位置拷贝一份过去。
进入你拷贝出来的cocos2dx文件夹,把名字为proj.XXXX的文件夹全部删除,这些文件夹不含任何源码,装的应该都是项目模板,大概占了150多M,然后进入cocos2dx\platform下,把除了win32以外的所有文件夹删除,这些文件夹与windows平台无关,共90M左右。然后,把cocos2dx\include下的所有文件拖出来直接放到cocos2dx文件夹,然后把include删除,后面会解释为什么要这样做。最后一步是可选操作,假如你觉得自己很勤劳的话,手动把所有文件夹里面的所有.cpp和.c文件删除(反正我是删除了

),因为引擎的实现代码已经包含在lib里面,真正需要的只是.h的定义文件,之后cocos2dx文件夹就会变成8M左右。
在cocos2dx文件夹创建一个cocos2d-win32.h文件,这个文件的作用是帮助我们使用cocos2dx时进行一些必要的编译预处理,文件的代码如下,建议仔细阅读一下

#pragma once

/*下面这些宏的具体作用我也不是全部理解它的作用,我是用VS2012打开任意一个
 范例的项目属性,在C/C++ -> 预处理器 -> 预处理器定义里面看到的所有被定
 义的符号。在这里用#define全部定义后,就免去在项目属性里面定义麻烦了*/
#ifndef WIN32
#define WIN32
#endif

#ifndef _WINDOWS
#define _WINDOWS
#endif

#ifndef STRICT
#define STRICT
#endif

#ifndef XP_WIN
#define XP_WIN
#endif

#ifndef JS_HAVE___INTN
#define JS_HAVE___INTN
#endif

#ifndef JS_INTPTR_TYPE
#define JS_INTPTR_TYPE int
#endif

#ifndef COCOS2D_JAVASCRIPT
#define COCOS2D_JAVASCRIPT 1
#endif

#ifndef CC_ENABLE_CHIPMUNK_INTEGRATION
#define CC_ENABLE_CHIPMUNK_INTEGRATION 1
#endif

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif

#ifndef _SCL_SECURE_NO_WARNINGS
#define _SCL_SECURE_NO_WARNINGS
#endif

/*C4996在之前的VS版本本来是一个warning来的,
 当代码里头调用了一下不安全的有关内存操作的
 老函数例如strcpy,sprintf这些会发出这个警告,
 蛋疼的VS2012把它看成error,这一句的作用是
 把它关闭了,本来上面_CRT_SECURE_NO_WARNINGS
 这个宏的作用也是用于消除这个警告的,但不知道
 为什么用#define定义它没效果*/
#pragma warning(disable: 4996) 

#include "cocos2d.h" //cocos2d.h包含了所有引擎所需的头文件

#pragma comment(lib, "opengl32.lib") //链接OpenGl库

/*看到下面代码,你大概也应该了解为什么Debug和Release
 需要分开来装了VS或者VC环境下,Debug模式下会定义
 DEBUG,Release则会定义NDEBUG,下面的代码作用是
 当用DEBUG模式来编译程序时,链接Debug下的库,否则
 链接Release,Debug和Release模式下所需的lib不互通,
 原因迟些研究
*/
#ifdef _DEBUG
#pragma comment(lib, "cocos2dx/Debug/glew32.lib")
#pragma comment(lib, "cocos2dx/Debug/libBox2D.lib")
#pragma comment(lib, "cocos2dx/Debug/libchipmunk.lib")
#pragma comment(lib, "cocos2dx/Debug/libcocos2d.lib")
#pragma comment(lib, "cocos2dx/Debug/libCocosDenshion.lib")
#pragma comment(lib, "cocos2dx/Debug/libcurl_imp.lib")
#pragma comment(lib, "cocos2dx/Debug/libExtensions.lib")
#pragma comment(lib, "cocos2dx/Debug/libiconv.lib")
#pragma comment(lib, "cocos2dx/Debug/libjpeg.lib")
#pragma comment(lib, "cocos2dx/Debug/liblua.lib")
#pragma comment(lib, "cocos2dx/Debug/libpng.lib")
#pragma comment(lib, "cocos2dx/Debug/libtiff.lib")
#pragma comment(lib, "cocos2dx/Debug/libwebp.lib")
#pragma comment(lib, "cocos2dx/Debug/libzlib.lib")
#pragma comment(lib, "cocos2dx/Debug/lua51.lib")
#pragma comment(lib, "cocos2dx/Debug/websockets.lib")
#else
#pragma comment(lib, "cocos2dx/Release/glew32.lib")
#pragma comment(lib, "cocos2dx/Release/libBox2D.lib")
#pragma comment(lib, "cocos2dx/Release/libchipmunk.lib")
#pragma comment(lib, "cocos2dx/Release/libcocos2d.lib")
#pragma comment(lib, "cocos2dx/Release/libCocosDenshion.lib")
#pragma comment(lib, "cocos2dx/Release/libcurl_imp.lib")
#pragma comment(lib, "cocos2dx/Release/libExtensions.lib")
#pragma comment(lib, "cocos2dx/Release/libiconv.lib")
#pragma comment(lib, "cocos2dx/Release/libjpeg.lib")
#pragma comment(lib, "cocos2dx/Release/liblua.lib")
#pragma comment(lib, "cocos2dx/Release/libpng.lib")
#pragma comment(lib, "cocos2dx/Release/libtiff.lib")
#pragma comment(lib, "cocos2dx/Release/libwebp.lib")
#pragma comment(lib, "cocos2dx/Release/libzlib.lib")
#pragma comment(lib, "cocos2dx/Release/lua51.lib")
#pragma comment(lib, "cocos2dx/Release/websockets.lib")
#endif
```


虽然cocos2dx这个文件夹已经处理完了,但是实际上革命尚未成,同志们还需努力。
把这个文件夹拷贝到编译器的系统头文件目录(XXX\include),然后打开编译器,创建一个Win32项目,往里面添加一个cpp文件,名字什么的随便改,在这个文件里面加上一句#include ,然后进行编译,这时候编译器会报错,说找不到XXXX.h文件。原因很简单,路径不对,因为cocos2dx的头文件默认路径在项目属性那里有定义,而你的Win32项目是没有定义的。所以你需要的做的是,跳转到错误的语句,然后把#include语句的路径改成正确相对路径,然后继续编译,它又报错,这时候是另外一个文件的路径不对了。怎么办?没别的办法,它报错一个你就修改一个,修改后记得保存,直到编译器不再报错,那时候基本上引擎里面的.h的路径是正确的了。什么?怎么样知道#include语句包含文件正确的相对位置?也不是很复杂,首先确定一下报错的文件的所在位置,比如报错的文件为cocos2dx\platform\CCImage.h,错误的语句为#include "cocoa/CCObject.h",你可以在cocos2dx这个文件夹下用windows自带的搜索功能来找到CCObject.h真实位置,得知CCObject.h的位置为cocos2dx\cocoa\CCObject.h然后就知道这一句应该改为#include "../cocoa/CCObject.h"斜杠是linux路径的表示方式,反斜杠是windows路径的表示方式,VS编译器两种写法都支持,不过写的时候用反斜杠要两杠\\,忘记了吗?C++的语法,转义字符。把路径修改直至编译器不再报错MOMO我一共用了半个多小时的时间,当然这不是什么技术活,是名副其实累活,之所以上面让你把include里面的文件拖到外面的来也是为了减轻这一部分的工作,至于为什么能够减轻我就不说了,看一下文件里的内容就明白了。但要知道一分耕耘一分收获,现在付出了,以后就一劳永逸了。
至此,include库也完成了,同样地,你可以打包储存起来,它的作用跟cocos2dx-3.0-include&dll.zip里面的cocos2dx文件夹是一样的,至于cocos2dx-3.0-include&dll.zip里面的DLL,在Release.win32里面有,还是那句,不要拷Debug.win32里面的,那里有范例代码生成的Dll文件,那些是不需要的东东。


3.总结
假如你是一个非常有耐心的同志,把整篇文章都看完了,你可能会发现并没有涵盖很多技术性知识,甚至可以说是没有。MOMO在向各位解释一下,之所以要把这篇文章写得那么详细乃及已经到了啰嗦的程度,是因为MOMO一方面希望能吸引更多的游戏开发爱好者来使用cocos2dx,另一方面因为cocos2dx现在还处于成长阶段,版本更新的比较快,希望这篇文章能够带给所有读者一个方法和思路,而不是照搬操作,这样在日后的版本能够自己解决创建项目的问题。
最后就是希望这篇文章能够尽可能地转给所有有需要的人,也欢迎各位大侠和老鸟吐槽找茬,指出错漏的地方。

不知不觉写了一个通宵,洗脸刷牙,吃个早餐先睡会了,各位再见!

cocos2dx 发布的时候就应该发布一个这样的 编译过的版本,并不是所有的人都需要源代码。这样下载起来也快,用起来也舒坦。

编译过的不能跨平台啊。。。

其实我也有过这样的想法,只是目前情况调试起来就悲剧了。。。:12::12::12:

— Begin quote from ____

引用第2楼佐耳云儿于2014-04-19 19:34发表的 回 1楼(yxylwt) 的帖子 :
编译过的不能跨平台啊。。。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=198269&pid=931605

— End quote

那就发布不同平台下编译的版本就好啦

非常感谢楼主那么辛苦的制作教程。。我想问下我是最新的3.2版本的没有build-win32.bat。我用vs2012编译后也只有Debug.win32文件夹也没有Release.win32文件夹是怎么回事?

研究研究感谢.

请问下楼主啊,你现在能够在dubug模式下运行,能生成Release版本吗