cocos2dx3.1.1 code ide LUA项目调用C++

来源:互联网 发布:windows 10 redstone 3 编辑:程序博客网 时间:2024/06/09 12:32

原创文章,转载请注明出处,出自七分熟同名技术博客 http://5.quanpao.com/?p=948


3.*版的COCOS出来时间不算很长,大多数公司还在基于2.2.3版本进行开发,因此相对来说关于3.*的资料比较有限,比较考验自学能力和对旧版的推导能力。



网上有少数关于3.*后LUA调用C++的资料,但还没有用官方IDE后LUA调用C++的说明,并且官方IDE居然连README都没有,笔者无比蛋疼,过程有很多坑,特别是最后几步,请大家无比集中精力,否则必挂。


cocos code ide是触控官方出品的编辑器,基于ECLIPSE进行二次开发,习惯JAVA编辑的人会很喜欢。cocoside需要3.0正式版以上版本的COCOS2DX,它的一大特点是支持“热更”,比如你DEBUG了一个界面,如果更改了代码,新的数据或界面效果会实时在生成的界面得到更新,大大提高了开发效率,因为我们再也不用在写几行就编译一次了,何况3.*每次编译时间都超长。


怎么使用和安装COCOS CODE IDE请自行百度,需要的环境比较多,笔者太累了,不再科普。笔者默认你已经可以用IDE创建LUA项目,各环境准备妥当了。。。。拜托,如果没有创建过LUA项目,怎么会研究LUA调用C++?


1 笔者用IDE创建的LUA项目位置是 D:\cocos_code_ide_data\ShenQiLuaCore,创建项目时勾选了ADD NATIVE CODES,这样才会COPY一份COCOS核心文件到项目下,如果有需要改动直接改动新建项目下的文件即可,保持修改的独立性。


2 用VS打开ShenQiLuaCore项目,文件位置:
D:\cocos_code_ide_data\ShenQiLuaCore\frameworks\runtime-src\proj.win32\ShenQiLuaCore.sln


3 VS中在ShenQiLuaCore项目的Classes下面新建文件
<b>ShenQiClass.h</b>
#ifndef __SHENQI_CLASS_H__#define __SHENQI_CLASS_H__#include "cocos2d.h"class ShenQiClass : public cocos2d::Layer{public:virtual bool init();std::string getHttpString();CREATE_FUNC(ShenQiClass);};#endif




<b>ShenQiClass.cpp</b>
#include "ShenQiClass.h"USING_NS_CC;bool ShenQiClass::init(){if ( !Layer::init() ){return false;}CCLOG("I am cpp message");auto txt = TextFieldTTF::create("Test Label C++ To Lua ","Arial",20);txt->setPosition(200,200);this->addChild(txt);return true;}std::string ShenQiClass::getHttpString(){std::string temp = "remembering you are the best one";return temp;}





此时我们已经完成了C++类的写作。


3
进入D:\cocos_code_ide_data\ShenQiLuaCore\frameworks\cocos2d-x\tools\tolua目录。
复制cocos2dx_spine.ini和genbindings.py两个文件, 重新改名为ShenQiClass.ini和ShenQiClass.py


4 打开ShenQiClass.ini
4-1 将第一行 [cocos2dx_spine] 改为 [ShenQiClass]
4-2 将第四行 prefix = cocos2dx_spine 改为 prefix = ShenQiClass
4-3 将第八行 target_namespace = sp 改为 target_namespace = 为空表示不设置命名空间
4-4 将第26行 headers = %(cocosdir)s/cocos/editor-support/spine/spine-cocos2dx.h
改为 headers = D:/cocos_code_ide_data/ShenQiLuaCore/frameworks/runtime-src/Classes/ShenQiClass.h
既新类的头文件路径,注意斜杠为正斜杠
4-5 第30行 classes = Skeleton SkeletonAnimation 修改为 classes = ShenQiClass 如果文件带多个类直接空格隔开即可
4-6 第39行 skip = Skeleton::[findBone findSlot getAttachment setAttachment update draw createWith.*],
SkeletonAnimation::[addAnimationState setAnimationStateData update createWith.* (s|g)etBlendFunc addAnimation getCurrent setAnimation]
改为 skip = 为空即可。
4-7 拷贝的spine文件默认classes_have_no_parents 和 abstract_classes 后面的值都为空,如果你拷贝的是其它文件,这两个值留空,


5 打开ShenQiClass.py
5-1 将cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \
'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), \
'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), \
'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \
'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \
'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \
}
改为 cmd_args = {'ShenQiClass.ini' : ('ShenQiClass', 'lua_ShenQiClass_auto')\
}
ShenQiClass.ini是配置文件的名称, ShenQiClass是ShenQiClass.ini文件中第一行[ShenQiClass]的字符串, lua_ShenQiClass_auto是生成的.hpp和.cpp文件名


6 安装dos2unix
6-1 下载程序 http://waterlan.home.xs4all.nl/dos2unix/dos2unix-6.0.5-win32.zip
6-2 解压到C:\dos2unix605 。注意路径不能带-,官方直接解压的文件包带-后无法在环境变量设置参数,笔者在这里绕了一圈才觉悟。
6-3 设置环境变量: 右键计算机 - 高级系统设置 - 环境变量 - 系统变量中找到path,选中后编辑,在变量值末尾增加
“;C:\dos2unix605\bin” 注意分号
<a href="http://5.quanpao.com/wp-content/uploads/2014/07/13.jpg"><img src="http://5.quanpao.com/wp-content/uploads/2014/07/13.jpg" alt="13" width="410" height="453" class="alignnone size-full wp-image-953" /></a>


7 左下角,打开运行- 输入CMD 回车。在控制台输入 D:\ 回车 ,输入 cd D:\cocos_code_ide_data\ShenQiLuaCore\frameworks\cocos2d-x\tools\tolua 回车。
输入python ShenQiClass.py
回车后PYTHON脚本会自动生成LUA文件。看到SUCCESS才算成功。如果第6步操作错误,则会提示dos2unix无法识别。


8 我们在D:\cocos_code_ide_data\ShenQiLuaCore\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto
看到了lua_ShenQiClass_auto.hpp 和 lua_ShenQiClass_auto.cpp 两个文件。
此外 D:\cocos_code_ide_data\ShenQiLuaCore\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api
文件夹下多了 ShenQiClass.lua 和 lua_ShenQiClass_auto_api.lua


9 在VS ShenQiluaCore - class- 右键 - 添加 - 现有项 - 将前面生成的 lua_ShenQiClass_auto.hpp 和 lua_ShenQiClass_auto.cpp 引入。


10 vs下打开 AppDelegate.cpp
10-1 头部引入 #include "lua_ShenQiClass_auto.hpp"
10-2 在auto engine = LuaEngine::getInstance();下新增一行
register_all_ShenQiClass(engine-&gt;getLuaStack()-&gt;getLuaState());// add my class


此时已经完成了C++上关于新类的LUA创建和注册。


11 打开D:\cocos_code_ide_data\ShenQiLuaCore\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api
全选文件 - 右键 - 添加到压缩文件 - 压缩文件格式ZIP - 确定,剪切生成的api.zip。
这个步骤主要是为了IDE编辑器可以识别我们新写的类和方法。


12 打开cocos core ide 路径下的API文件夹 F:\cocos2dx\cocos-code-ide-win64-1.0.0-rc0\configuration\org.eclipse.osgi\bundles\49\1\.cp\resource
12-1 笔者是3.1.1的COCOS版本,在改文件夹下打开cocos2dx-3.1,粘贴前面剪切的api.zip,覆盖提示选择覆盖。这一步目的是最新的API文件包能包含我们新生产的LUA文件,并在IDE支持代码提示。


13 右键IDE上的项目 ShenQiLuaCore - PROPERTIES - build path - lua - libraies ,选中cocos2dx3.1,点击remove移除旧版文件包。
13-1 点击add libraies ,选择 lua Execution Environment - next ,选中3.1.1版,finish。
此时我们已经引入了新的LUA文件库,因为前面我们已经覆盖过新的api.zip,LUA上已经能读取到
13-2 我们用IDE打开main.lua
输入代码
local sceneGame = cc.Scene:create()


--用ShenQiClass类的create创建对象
local testNewClass = ShenQiClass:create()
--将创建的对象层添加到场景
sceneGame:addChild(testNewClass)
--尝试用CCLOG调用新类的函数,该函数在ShenQiClass.cpp已经返回一行字符串
cclog(testNewClass:getHttpString())


其中sceneGame是创建的场景,如果你的项目创建的是其它名称的scene,将sceneGame换名即可。确保写我们的新类代码时SCENE已经创建即可。


14 很重要,IDE必须重新编译C++后才能识别CPP里的改动。在IDE右键项目名ShenQiLuaCore - cocostools - build custom runtimes - build win32 runtime - generate


15 IDE-点击DEBUG - 点击类似播放的绿色三角按钮。
LUA控制台输出了C++新类中的内容,场景里插入了新类的文本标签。
<a href="http://5.quanpao.com/wp-content/uploads/2014/07/15.jpg"><img class="alignnone size-full wp-image-952" src="http://5.quanpao.com/wp-content/uploads/2014/07/15.jpg" alt="15" width="490" height="362" /></a>


笔者研究了一天,前后算上细分步骤其实有几十步,蛋疼。特备忘和供同行学习。

0 0
原创粉丝点击