然后Q可以得到重要的两个目录
1 2 | protoc-gen-lua/plugin/ protoc-gen-lua/protobuf/ |
plugin目录是提供将buffer 文g解析成lua 版本的类库, 需要python 支持? 如果已经~译了google 官方的protoc 那个E序Q?只需要在pȝPATH环境变量总追加plugin目录好:
1 | export PATH={protoc-gen-lua DIR }/plugin:$PATH |
先确定自qquick-cocos2d-x lua扩展目录Q?
1 | /quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/ |
q是我的目录l构:
1 | ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c |
路径为:
1 | ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/lua_extensions.c |
目前是一个不?0行的文Ӟ 我打全部脓q来Q?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include "lua_extensions.h" #if __cplusplus extern "C" { #endif // cjson #include "cjson/lua_cjson.h" // zlib #include "zlib/lua_zlib.h" // lpack #include "lpack/lpack.h" // socket #include "socket/luasocket.h" #include "socket/mime.h" #include "socket/socket_scripts.h" // filesystem #include "filesystem/lfs.h" // lsqlite3 #include "lsqlite3/lsqlite3.h" #include "protobuf/pb.c" //引用protobuf 库文?nbsp; static luaL_Reg luax_exts[] = { { "cjson" , luaopen_cjson_safe}, { "zlib" , luaopen_zlib}, { "pack" , luaopen_pack}, { "socket.core" , luaopen_socket_core}, { "mime.core" , luaopen_mime_core}, { "lfs" , luaopen_lfs}, { "lsqlite3" , luaopen_lsqlite3}, {NULL, NULL} }; void luaopen_lua_extensions(lua_State *L) { // load extensions luaL_Reg* lib = luax_exts; lua_getglobal(L, "package" ); lua_getfield(L, -1, "preload" ); for (; lib->func; lib++) { lua_pushcfunction(L, lib->func); lua_setfield(L, -2, lib->name); } lua_pop(L, 2); // load extensions script luaopen_socket_scripts(L); luaopen_pb(L); //q是加入的protobuf 扩展注册?nbsp; } #if __cplusplus } // extern "C" #endif |
目录l构应该是这LQ?
1 | [PROJECT]/scripts/protobuf/*.lua |
修改main.lua 在require("appxxxxxx") 上面 Q?加入下面的代码:
1 | package.path = package.path .. ";./protobuf/?.lua;./scripts/protobuf/?.lua;" |
q入player-x qt源码目录 Q?
1 | cd quick-cocos2d-x/player/proj.qt |
使用qmake 文g执行quick-x.pro 文g
1 | qmake ./quick-x.pro |
如果错误信息相同Q?修改文g:
1 | ./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c |
查找?
1 | #include <endian.h> |
临时变更为:
1 | #include <machine/endian.h> |
思\
像所有语a一Pl定回调主要是执行的d执行到特定情形的时候,调用对用回调Ҏ?本文也一PLua注册回调到C++的核心思\是,当C代码执行到特定特定情形的时候,调用Lua的方法?/p>
我这里用的是用lua_stack直接调用lua的方法,没有使用Cocos2d-x装的那个dispatcherQ因为熟悉那个格式太墨迹了?/p>
主要步骤如下
~存Lua函数在Lua环境中的引用
在C代码的地方用C的方式设|好回调
在C代码回调函数执行的时候,调用lua函数
实现
C代码l定回调Q调用Lua函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | void ArmatureNode::registerMovementEventHandler( int handler) { unregisterMovementEventHandler(); //U除之前注册的监?/code> _movementHandler = handler; //~存lua函数的引?nbsp;q个后边?/code> auto dispatcher = getCCEventDispatcher(); auto f = [ this ](cocos2d::EventCustom *event) //注册c代码形式的回?nbsp;q里用function?/code> { auto eventData = (dragonBones::EventData*)(event->getUserData()); auto type = ( int ) eventData->getType(); auto movementId = eventData->animationState->name; auto lastState = eventData->armature->getAnimation()->getLastAnimationState(); auto stack = cocos2d::LuaEngine::getInstance()->getLuaStack(); stack->pushObject( this , "db.ArmatureNode" ); stack->pushInt(type); stack->pushString(movementId.c_str(), movementId.size()); //通过LuaStack调用lua里的函数 最后一个参数设|参C?/code> stack->executeFunctionByHandler(_movementHandler, 3); }; dispatcher->addCustomEventListener(dragonBones::EventData::COMPLETE, f); } void ArmatureNode::unregisterMovementEventHandler( void ) { if (0 != _movementHandler) { cocos2d::LuaEngine::getInstance()->removeScriptHandler(_movementHandler); //U除lua函数的绑?/code> _movementHandler = 0; } } |
提供Lua函数l定到C的方?
上边的这个函数直接用cocos里的genbinding.py 是无法正生成Lua里可调用的接口的Q需要手动编写绑定方?
说这个得用到Cocos2d-x中提供的一个方法:toluafix_ref_function会把一个Lua栈中的方法{成一个intQ以便C++中调用。我会在最后面说这?/p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int tolua_db_DBCCArmature_registerMovementEventHandler(lua_State* tolua_S) { if (NULL == tolua_S) return 0; int argc = 0; dragonBones::ArmatureNode* self = nullptr; self = static_cast <dragonBones::ArmatureNode*>(tolua_tousertype(tolua_S,1,0)); //W一个参?nbsp;是lua里的self argc = lua_gettop(tolua_S) - 1; if (1 == argc) { //W二个参敎ͼ是Lua里的function q里要通过toluafix_ref_functionq个函数映射成一个Int?/code> int handler = (toluafix_ref_function(tolua_S,2,0)); self->registerMovementEventHandler(handler); return 0; } return 0; } |
绑定方法绑定到Lua环境?/p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int extends_ArmatureNode(lua_State* tolua_S) { lua_pushstring(tolua_S, "db.ArmatureNode" ); //之前db.ArmatureNode是通过脚本l定在lua里。这里只做扩?/code> lua_rawget(tolua_S, LUA_REGISTRYINDEX); if (lua_istable(tolua_S,-1)) { lua_pushstring(tolua_S, "registerMovementEventHandler" ); lua_pushcfunction(tolua_S,tolua_db_DBCCArmature_registerMovementEventHandler); lua_rawset(tolua_S,-3); } lua_pop(tolua_S, 1); return 0; } |
Lua里设|回调到C++
1 2 3 4 5 6 7 8 | local arm = db.ArmatureNode:create( "Dragon" ) local animation = arm:getAnimation() animation:gotoAndPlay( "walk" ) arm:registerMovementEventHandler( function(...) print(...) end ) |
-试
打印回调输出Q测试通过 userdata 8 walk
其他
toluafix_ref_function 以及 toluafix_get_function_by_refid
q?两个Ҏ是相互对应的 toluafix_ref_functionq个Ҏ在注册表上将一个lua的function与一个function_id生成映射 toluafix_get_function_by_refid Ҏ可以通过前一个方法生成的function_id来讲l定的lua function攑ֈ栈顶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // TOLUA_API int toluafix_ref_function(lua_State* L, int lo, int def) { if (!lua_isfunction(L, lo)) return 0; s_function_ref_id++; //function_id ? lua_pushstring(L, TOLUA_REFID_FUNCTION_MAPPING); //在注册表上,存放luafunction 映射table 的key压栈 lua_rawget(L, LUA_REGISTRYINDEX); //获取Ҏ映射表,攑֜栈顶 lua_pushinteger(L, s_function_ref_id); //function_id压栈 lua_pushvalue(L, lo); //lo有效处烦引处是luaҎQluaҎ拯Q压?/code> lua_rawset(L, -3); //生成映射 lua_pop(L, 1); return s_function_ref_id; } TOLUA_API void toluafix_get_function_by_refid(lua_State* L, int refid) { lua_pushstring(L, TOLUA_REFID_FUNCTION_MAPPING); //存放luafunction 映射table 的key压栈 lua_rawget(L, LUA_REGISTRYINDEX); //获取Ҏ映射表,攑֜栈顶 lua_pushinteger(L, refid); //function_id压栈 lua_rawget(L, -2); //获取到的luafunction 攑ֈ栈顶 lua_remove(L, -2); // } |
executeFunctionByHandler
executeFunctionByHandler q个Ҏ只是通过toluafix_get_function_by_refid 获取到function然后通过lua_pcall Ҏ调用Q代码就不写了?/p>
以下大部分来自网l,只做学习记录用?/p>
一 框架层面
?Lua层面
?工具层面
?android打包
一 框架?br /> 整体来说Qcocos2dX提供的一个简便的框架Q包含了渲染Q动画,事g分发Q网l还有UIQ物理引擎等几大模块。对于做一个游戏从功能上来说已l?br /> _了。我从这几个斚w分别探讨下cocos2dX的优~点以及我们在项目中是如何用到的
Q?Q渲染:渲染q块Q他的渲染数据跟Spriteq行了绑定,然后对于openGl也是直接q行了调用,而不是采用策略或者插件进行调用。对于后期如果采用DX的话
我觉得这块比较冗余些。但是这些ƈ不会影响游戏的渲染速度。它提供了batch来进行批ơ渲染。所以在游戏里,我们对资源进行了分组Q然后分别用textPacker
拼成一张图片,格式?没有alpha的采?RGB565Q有alpha的采用RGBA4444Q要求高的话采用RGBA8888Q然后统一采用Ҏ渲染。游戏的速度会提升很多?/p>
对于游戏数据的管理,cocos采用CCTextureCacheq个单例c进行管理。释攑֏以采用全部释放,q有释放没有用过的。ƈ且也提供了异步加载动画资源的Ҏ
QPSQ这个对于想做ARPG的同学来_可是好东西了Q。所以对于渲染这块,我们量用批ơ,然后记得释放内存OK了?/p>
Q?Q动画:cocos他提供了一套action机制。整体来_是sprite run action。然后驱动action里面的动L据,q行播放动画。所有的动画都可以走action
接口。对于用者来_也不用去兛_其他东西Q只需要初始化好你惌的动作,然后把动作数据塞laction。然后让sprite run 可以了。大概action是q个
程。本来我们想自己写自q动画Q但是到后期Q因己写一套工作量大。所以对于moveQscale什么的仍旧采用cocos自己的。只有animation采用了我们的?/p>
但是现在惌v来,完全没有必要。cocos提供的已l够了。我们所需要做的就是把动作~辑器导出的动画数据用cocos的动作翻译(对于动作~辑器我后面会讲Q写
q么一个层好
Q?Q事件分发:cocos对于事g分发q块比较弱了。他是事件管理是通过存储每一个object以及他接收事件的优先U。然后进行分发。但是他q没有对场景q行树的理
。所以我们的改变是建立起场景树Q然后事件分发先从场景顶端往下分发。期间每个节点可以设|是否响应以及是否l往下传递的属性(作ؓOCnQ这块完全模仿苹果那套)
完全丢弃了cocos的那一套事件分发机制。对于场景树的维护,只需要每ơstep的时候更C。所以对于查询性能需要好好写一?br /> Q?Q网l:cocos提供了对curl的封装。提供了http的一些简单比如getQpost的封装。但对于断点l传{ƈ没有装。对于socketQcocos则完全没有提供。我们采用了
BSDSocket
Q?QUIQUIq边Qcocos提供了几U简单的控gQ比如CCButton{。他们都l承于CCSpriteQ但是太。而且初始化方法是在是太过于奇葩。所以我们自己写了一套UI?/p>
Q其实无非也是 buttonQlabelQtableViewQscrollViewQimageq有textInputQ他们也都承CCSprite。然后加入一些每个控件独有的逻辑可以了。最ȝ
的应该就是textInput了。照着cocos提供的input写一遍,然后Ҏ。(cocos提供了CCEditeBoxQ但是这货的的解军_法是在IOS上调用IOS的的控g。但是他是直接加CegLView上,对于面UdQ页面关闭处理v来比较麻烦?br /> 所以这个暂时还不能用)
?lua
Z让游戏更有灵zL,cocos提供了lua。由C++做引擎,然后luad逻辑。这样就可以l开Ҏ的审核。我们就讨论下C++与lua到的问题?/p>
Q?Q通讯Qcocos采用了tolua++来进行C++与lua的通讯。看Cocos2dXLuaLoad文g里,那些是lua与C++通讯的一个层。具体通讯原理比如是通过
栈,什么的我就不讲了(其实我也不太懂)。这些东西tolua++都已l替咱封装好了。我们需要做的就是写好C++文g
然后生成load文g。在CCLuaEngine里调用你生成的那个loadҎ。lua可以访问C++了。需要说明的是,我们q边量是lua调用C++的方法,C++不会去调?br /> Lua的方法。调用也是通过callBack去调用?/p>
Q?Q问题:
问题1.当C++里面的函数需要传递lua指针Ӟ在C++里,lua的函数指针是一个int的变量。生成时用Lua_Func来代ѝ然后生成后执行cocos2dX源码
里面build.xml。xml的左叛_是定制tolua++的生成。在里面把lua的函数指针{成了int了。具体的看xml内容可以了?br /> 问题2.在CCLuaEngine里调用那些loadҎӞ是有序的。一定要父类在前Q子cd后。不然子cd无法讉K父类的方法?/p>
Q?Q写法:
lua都要加入moduleQ变成模块化Q提高代码的可读性,然后require的时候一定要像cocos例子那样Q写全\径。不然打包android的时?br /> 悲剧了?/p>
lua里面不要用全局变量持有sprite{C++数据。每个模块也要像cocos那样提供2个方法,一个是q入该模块的初始化方法,一个是退?br /> 该模块的销毁方法?/p>
对于luaq边写法Q我们参考了 moaiQ还有coronaQ在lua那边在封装下C++Q其他lua不是直接调用C++,量不要让lua的写法太q于
z跃。不然以后调试真心头大?/p>
Q?Q调试:lua的调试是最大的问题。仅凭一个lua_error所报错的信息是完全不够的。而且Xcode对于lua的语法高亮支持的也不好。我们对?br /> q行?斚w的尝?/p>
1.windows下,用decoda。然后也可以打断炏V?/p>
2.mac下,暂时用Eclips加lua插gq行写luaQ然后通过logq行调试。不q最q想试VimQ应该会比之前靠谱?/p>
?工具层面
工具上,cocos提供?cocosBuilderQ我觉得他属于一个集成的工具。想要追求全Q必然不_。所以cocosBuilder不管?br /> 场景~辑Q界面编辑,q是动作~辑都不是很好用。所以我们采用的{略是用Flash的那一套。界面编辑用FlexBuilder的界面编辑,然后
导出xmlQ写一个xml译c,Ҏxml创徏面板Q动作编辑用FlashPro。然后用jsfldflash信息Q导出xmlQ用cocos自己的action机制
ȝ译,演绎。场景编辑的话,我们的游戏ƈ没有用场景编辑的需求,所以没有进行研IӞ不过titleMap是个不错的选择
?andrid打包
android打包Q其实难点在于调试。因为无法打断点。本来lua难调试Q结果还要加上android。打包android那边是多看看NDKQJNI?br /> 一些资料,然后了解mk文g怎么书写。看看cocos提供的那些sh脚本。打包大部分问题都是路径的问题。根据错误一步步来,别急,肯定能打上?/p>
打包完成以后Q剩下就是调试。调试的话主要就是C++与java之间的通讯了。那p多看看jni的一些东ѝ然后看cocos/platform/ q有android
里面的类。那些是c++跟java通讯的类。我们调试主要就在那打log。jni的原理我׃讲了。。多看看懂一点就可以了。毕竟咱只是Z看懂Q会照猫画虎
写一炏V没必要q。对了,android好奇葩,上网q需要权限配|!Q!在mainfest.xml配置权限。靠Q搞了好久这个问题?/p>
好了Q我对于cocos的见解就q么些。可能包含了cocos所有的东西吧。都不细Q只是给大家当一个消遣时间的东西。欢q大家一赯论?br /> 最后,感谢cocos2dX的那些大牛们。是你们的无U让我们才有Zq么Ҏ接近游戏开发。谢谢你?/div>
1、在用Cocos Code IDE建立新的cocos2d-x目Ӟ最好选中Add Native Codes
q个选项Q只有选中了它Q项目目录里才会?strong>frameworks
目录Q里面才会有AppDelegate.cpp{重要的C++c(E序真正的入口)。如果不N这个,则Cocos Code IDE使用的是默认~译好的PrebuiltRuntimeLua.app
E序Q日后如果要更改C++部分的程序逻辑Q还是需?code>frameworks目录中的源代码才行,所以徏议Cocos Code IDE应该?code>Add Native Codesq个选项默认为选中状态才寏V?/p>
2、如果之前徏立项目时没有N?code>Add Native CodesQ也可以随时通过右键菜单->Cocos Tools
->Add Native Codes Support
l补回来?/p>
3、有?code>frameworks/runtime-src/Classes目录Q就可以M?code>AppDelegate.cpp{C++文g了。简单修改一下,打印个log看看Q?/p>
4、C++文g修改好了Q需要编译才能修改生效Q最单的办法是在Cocos Code IDE中通过右键菜单->Cocos Tools
->Build Custom Runtimes
Q选中Build Mac Runtime
卛_?/p>
5、编译完成后Q感兴趣的话p?code>runtime/mac目录下看到多了一?code>CocosLuaGame.appE序包,q就是刚刚编译生成的MacE序Q以后每?code>frameworks目录下的C++文g有修攚w需要再~译一ơ?/p>
1 2 3 4 5 | #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) #include "iconv\iconv.h" #else #include "../../../../libiconv/include/iconv.h" #endif |
1 | -1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength) |
1 | -1 == iconv(iconvH, ( char **)pin, &strLength, &outbuf, &outLength) |
$(call import-module,android/support)
如:
LOCAL_PATH := $(call my-dir)但是凭心而论Q?.0RC版本开?环境搭徏、项目创建、编译的方式更加人性化了?/span>
现在我们q入正题Q一步一步搭建cocos2dx的开发环?/span>
cocos2d-x很多tools都是需要用Python的,因此我们需要先安装Python环境
python下蝲:点这?/a>
q里需要下载Python 2.X版本。曾l以下蝲3.x版本 后来装上发现cocos2d-x提供的pythonq行报错Q所以卸载以后重新装的python2.X版本
python安装的时候用默认安装方式即可,但是安装完毕后我们需要配|环境变?/span>
在我的电脑(右键)->属?>高pȝ讄->高 选项?>环境变量->pȝ变量 中找到Path 变量Qƈ在其g增加 指向Python的环境变量。格式ؓ [Python安装路径]; 例如我安装在C?我的环境变量新增ؓ C:\Python27;
配置完毕后记得注销再重新登陆系l环境变量才会生?/span>
下一步,我们要下载最新版本的cocos2d-xQ到目前为止 cocos2d-x已经更新?3.0rc2版本
cocos2d-x官网: 点这?/a>
在下载完毕后我们解压~到盘上,q打开cocos2d-x 文gҎ到setup.pyq个文gQ运行,会出现控制台如下
׃现在不配|Android环境Q因此只需要一直回车即可,q时候这Dpython脚本会帮助我们设|cocos2d-xq行所需要的环境变量。l注销……重新登陆……
在配|完q一切后 我们打开CMD q行cocos命oQ?来检查整个开发环境是否搭建成功,2来可以熟悉下命o行,如果讄没问题的情况?会出现如下界?img src="http://images.cnitblog.com/i/340851/201404/221009223572717.jpg" alt="" />
q里我们可以看到cocos.pyq段脚本可以执行4个命令,每个命o的作用已l说明的很清楚了?/span>
下面Q我们来使用new 命o创徏我们的项?/span>
q里举个栗子Q比如我要创Z个叫simple的项目,我们可以q么? cocos new -p com.game.simple -l cpp -d e:\ simple 单吧 q行q条命o会在E盘根目录下生成一个叫simple的文件夹里面攄我们的项目?/span>
q个时候我们就可以用VS2012打开proj.win32中的SLN目文gq行我们愉快的编码和调试工作了?/span>
如果我们要运行我们刚刚由模板生成的项目,我们需要用到cocos run 命o 格式?cocos run -p [q_] 栗如:cocos run -p win32 表示win32q_
我们在执行这条命令时候需要注意一?执行命o的目?必须是游戏项目的根目?如果不在根目?需要?-s指定游戏根目录的位置
现在我们在cmd中执?cocos run -p win32 -s e:\simple q行l果如下
如果在编译过E中没有错误的话 ~译完成会打开q个HelloWorld的DEMO
x在WIN32中的环境搭徏以及调试发布全部OK?下面我们来看Android部分?/span>
AndroidQ?/strong>
Android的编译环境在3.0RC里也有了很大的改观,部v和编译方式比之前方便了很多。现在我们来做下准备工作?/span>
Android~译环境需要用到Andorid_SDK Android_NDK Ant 与JDK
Android_SDK下蝲: 点这?/a>
Android_NDK下蝲: 点这?/a>
Android_JDK下蝲: 点这?/a>
Ant下蝲: 点这?/a>
其中除了JDK需要安装,其它的是l色?直接解压卛_
我们SDK NDK 和ANT解压~到同一个文件夹?q修改sdk的文件夹名ؓADTQNDK的NDKQANT的ؓANT q是Z方便以后使用?我解压后文g都放在了e:\Android文g夹下
解压完后我们先来配置JDK
在JDK安装完毕之后Q需要手动进行环境变量的配置
1Q在pȝ变量里新?span style="color: #339966;">JAVA_HOME变量Q变量gؓQC:\Program Files\Java\jdk1.6.0_14Q根据自q安装路径填写Q?/span>
2Q新?span style="color: #339966;">classpath变量Q变量gؓQ?;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar Q注意前面的. 不要忘记了)
3Q在path变量Q已存在不用新徏Q添加变量|%JAVA_HOME%\bin;%JAVA_HOME%\jre\binQ注意变量g间用“;”隔开Q?/span>
4、重新注销pȝq新登陆后 “开?#8221;-->“q行”-->输入“javac”-->"Enter"Q如果能正常打印用法说明配置成功Q?/span>
补充环境变量的解?
JAVA_HOME:jdk的安装\?/span>
classpath:java加蝲c\径,只有cdclasspath中java命o才能识别Q在路径前加了个"."表示当前路径?/span>
pathQ系l在M路径下都可以识别java,javac命o?/span>
现在我们来配|ANT的环境变量。将[ANT目录]\bin文gҎ加到path?nbsp; 如图
x准备工作做完了Q下面我们运行setup.py兌SDK NDK 和ANT
在这里我们输入了ndk和sdk的\?其中ndk指向根目录即?nbsp; 而sdk需要指向adt中的sdk目录
在由setup.pyd了这两个环境变量之后 会要求我们输入Ant的\?q里我们需要指向ant中的bin文g?如下Q?/span>
q时?基本环境已经搭徏完成了,记得注销重新登陆使环境变量生?/span>
重新q行setup.py认下所有的配置是否正确 如果全部正确 如图所C?/span>
然后我们可以在目目录下?cocos compile -p android方式~译APK文g?/span>
注意Q在打包apk之前需要修改proj.android/jni文g夹下的Android.mk文g d自己新增的CPP文g
最后我们来看看~译好的APK文g吧,位置在[目文g夹]\bin\debug\android\文g夹下
自定义\径创?/span>Cocos2d-x目
本文介绍windows下面如何优雅的创?/span>Cocos2d-x目。ؓ何称之ؓ优雅Q是因ؓ现在|上传的一些创建方法有一些问题。大致内容如下:
l 使用VS向导创徏Cocos2d-x目Q废弃,不徏议用)
l 使用create_project.py
n 问题1Q工E名{替换不完全
n 问题2Q创建项目不能指定\?/span>
?/span>Cocos2d-x 2.1.3及之?/span>Q?/span>官方使用“install-template-msvc.bat”文gQ安?/span>VS创徏Cocos2d-x目向导Q然后可以按照向导创?/span>Cocos2d-x目?/span>注意Q?/span>默认情况下,新徏目的存攄位置应该讄?/span>Cocos2d-x引擎的安装目录下面,否则可能因ؓ找不到库文g而不能通过~译。不q可以在讄目属性,头文件和库文件的搜烦路径来解冟뀂可以参考我之前的一博文?/span>C++静态库与动态库》,里面介绍如何讄vs目属性用静态库和动态库?/span>
?/span>Cocos2d-x 2.1.4Q官方徏议?#8220;create_project.py”来创?/span>Cocos2d-x目Qƈ在版本废弃?/span>“install-template-msvc.bat”?/span>
“We recommend you use multi-platform creating tools named create_project.py, which lies in tools/project-creator, to create a new project. This tool can create a project has the same folder structure as HelloCpp. Other tools such as create-android-project.sh will be removed in future.
Note: VS template was deprecated in this release, please use 'tools/project-creator' instead.”
——来自官网Q?/span>http://goo.gl/yVAjMr
我入?/span>Cocos2d-x的时候,刚发?/span>Cocos2d-x 2.1.4Q就被这个坑了?/span>Cocos2d-x 2.1.4废弃?/span>“install-template-msvc.bat”Q但是下载压~包里面又有Q可恶的是不能用的,各种报错。同时网上流传的是使用q种ҎQ让我绕了不\?/span>
create_project.pyQ?/span>cocos2d-x/tools/project-creator/目录下)使用Ҏ比较单:
Usage: create_project.py -project PROJECT_NAME -package PACKAGE_NAME -language PROGRAMING_LANGUAGE |
Options: ?/span>-project PROJECT_NAME?/span>Project name, for example: MyGame ?/span>-package PACKAGE_NAME?/span>Package name, for example: com.MyCompany.MyAwesomeGame ?/span>-language PROGRAMING_LANGUAGE?/span>Major programing lanauge you want to used, should be [cpp | lua | javascript] |
Sample 1: ./create_project.py -project MyGame -package com.MyCompany.AwesomeGame Sample 2: ./create_project.py -project MyGame -package com.MyCompany.AwesomeGame –language javascript |
注意Q?/span>
l 官方python使用2.7.3
l 安装python之后需要设|环境变量,或者用该脚本时指?/span>python路径Q如C:\python27\python.exe create_project.py …
使用该方法创建项目之后,目位于cocos2d-x/projects目录下面?/span>windowsq_q入proj.win32Q打开工程文g卛_?/span>
使用create_project.py创徏目的原理,即简单地?/span>cocos2d-x\template目录下的三种语言模板multi-platform-cpp?/span>multi-platform-lua?/span>multi-platform-js复制到对应的新徏工程目录下,然后?/span>PROJECT_NAME?/span>PACKAGE_NAME替换模板中的HelloCpp/ HelloLua/ HelloJavascript?/span>
下面是我?/span>towergame做ؓ工程名创建的lua目Q目录如下:
虽然可以正常~译Q但发现工程名未替换?/span>towergameQ这比较坑爹。一位日本开发?/span>lettas已经有h提交了修复请?/span>https://github.com/cocos2d/cocos2d-x/pull/3943Q不q正式发布的版本中还没有修改。急着用可以去github checkout下来用?/span>
使用create_project.py不能自定义\径,必须攑֜cocos2d-x/projects目录下面Q?strong>q个讑֮我认为非怸合理Q这样将自己的项目放?/span>cocos2d-x引擎目录中,不方便管理,卛_与项目耦合C起了Q如?/span>cocos2d-x升也不方便?/span>
比较合理的方案是Q?/span>
l cocos2d-x独立安装Q这样对cocos2d-x升也相对简单?/span>
l 新徏cocos2d-x目独立?/span>cocos2d-x安装路径。通过讄搜烦或引用\径,让项目能够找?/span>cocos2d-x安装路径?/span>
q运的是Q完全可以做到这栗熟?/span>VS的同学应该知道,VS工程讄是支?/span>环境变量的。通过下面的一些改造,可以让新建的cocos2d-x目独立?/span>cocos2d-x引擎目录Q?/span>
1) 通过create_project.py创徏的项目剪切到你希望放|的目录Q?/span>
2) 创徏环境变量COCOS2DX_HOMEQ指?/span>cocos2d-x安装目录Q?/span>
3) ?/span>*.sln文g使用文本方式打开Q?strong>里面的所有相对\?/strong>“..\..\..”都替换ؓ环境变量%COCOS2DX_HOME%Q如“..\..\..\cocos2dx\proj.win32\cocos2d.vcxproj”替换?/span>“%COCOS2DX_HOME%\cocos2dx\proj.win32\cocos2d.vcxproj”Q?/span>
4) ?/span>*.vcxproj文g使用文本方式打开Q将里面debug?/span>release 2U模式下<AdditionalIncludeDirectories>节点定义的引用\径中包含”$(ProjectDir)..\..\..\”都替换ؓ环境变量“$(COCOS2DX_HOME)\”Q注意这里用环境变量的方式?/span>*.sln中不一P?/span>$(COCOS2DX_HOME)而非%COCOS2DX_HOME%?/span>
xQ大工告成!看下面的q行h?/span>vs工程Q?/span>
图中依赖的工E跟新建的目攑֜cocos2d-x/projects目录下面一样可以链接到?/span>
上面的替换工作可以用文本的查找替换功能,可以L搞定。但是ؓ了能够与create_project.py集成Q我提供下面一D代码能够自动替?/span>.sln?/span>.vcxproj文g中对于内容:#!/usr/bin/python