Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用

记得很久以前,刚开始接触Quick,那时候尝试过一次这样的操作,不过失败了。

因为那时候还年幼,对这里面的一套机制不是太熟悉。现在回头再做这样的事,遇到了问题,但是都很好的根据自己的理解给解决了。

现在记录下,我tolua成功的过程,在写blog的过程中,更熟练其中的原理。

PS:网上关于quick tolua的blog都有点过时了(dualface的quick官网文章),具体的过程,还是要自己多注意。

我是基于Quick  2.2.1-rc版本实现的。

————————————————————————————————————————————————————————————

首先quick项目中找到:如下图红线框的两个重要文件夹。

进入第一个cocos2d-x文件夹:

继续进入一层文件夹cocos2dx,创建我们自定义的类,如下图我红线框住的类:

MyAdder的实现是2个整数的加法实现如下:

H文件:

1 #ifndef MY_ADDER
2 #define MY_ADDER
3
4 class MyAdder
5 {
6 public:
7     static int addTwoNumber(int a, int b);
8 };
9 #endif

CPP文件:

1 #include "MyAdder.h"
2
3 int MyAdder::addTwoNumber(int a, int b)
4 {
5     return a+b;
6 }

创建好了以后,需要注意一点,非常重要的一点:

android.mk文件的修改:

mk文件的位置:

就是这个mk文件。

mk文件的作用是什么?简单一句:配置需要编译h,cpp文件,最终生成动态库or静态库,android通过System.loadLibrary("game");

加载(动态库or静态库)到android平台中,然后Lua脚本就可以调用什么CCSprite等等Cocos2dx的库函数了。

所以我也需要配置我自己定义的h,cpp文件。所以:如下:

这样,在android项目下,build_native.bat的时候,就可以把我们的类文件也编译到libgame.so包中去了。

至于mk文件的详细介绍,请看这里:点击跳转

到这里,思考下,我完成了那些步骤。

1_成功将我自己定义的类加载到了.so包中,也就是当成功加载了so包后,我定义的类也就在内存中了,但是lua怎么调用呢?

接下来需要做的事,调用我加载到内存中的so文件。

首先根据我的类创建一个tolua文件。

如何编写tolua文件?网上有具体的规则。不会的话,可以参考别人的转换规则。哪里看?here:

这里面都是cocos2dx中的c++文件转换后的tolua文件,可以参考这里的。

然后如下位置创建一个MyAdder.tolua文件:

MyAdder.tolua文件的内容:

class MyAdder : public CCObject
{
public:
    static int addTwoNumber(int a, int b);
};

MyAdder.tolua文件创建成功后,需要思考一下:

如何让我定义的tolua文件可以成功的编译到文件中呢。。。需要在上图中的Cocos2d.tolua文件中,添加如下代码:

好~ tolua文件也绑定成功了。开始使用tolua++的工具编译我定义的tolua文件了。

使用tolua++的主要目的是:

生成lua到c++文件调用的中间文件,也就是:

%QUICK_COCOS2DX_ROOT%\lib\cocos2d-x\scripting\lua\cocos2dx_support\LuaCocos2d.cpp

这个具体可以看:

build.bat的实现是这样的:

@echo off
set DIR=%~dp0
set TOLUA=%QUICK_COCOS2DX_ROOT%\bin\win32\tolua++.exe

cd /d "%DIR%"
%TOLUA% -L "%DIR%basic.lua" -o "%QUICK_COCOS2DX_ROOT%\lib\cocos2d-x\scripting\lua\cocos2dx_support\LuaCocos2d.cpp" Cocos2d.tolua

tolua的编译参数参考(方便理解上面的编译命令行参数):

点击build.bat后,等待tolua++.exe编译生成LuaCocos2d.cpp文件,执行完后,看生成的LuaCocos2d.cpp文件,

看文件里面时候有MyAdder关键字,如果有,则生成成功了。

生成成功后,还需要在LuaCocos2d.cpp文件中添加一行(否则会在编译so包时报错):

一切就绪,使用Eclipse,点击build_native.bat编译c++文件,这个编译过程中,编译了我定义的MyAdder文件,

如果自定义的文件里面有语法错误,或者其它的什么错误,这个编译过程会中断的。

它还会编译个重要的cpp文件,就是:LuaCocos2d.cpp文件。记得这里面有我定义的MyAdder类么,

把LuaCocos2d.cpp文件编译通过后,我们在lua脚本中就可以调用我自定义的类了。

整个编译通过后,生成了so文件,~~~~~

clean project,run as android application~~~~

上真机演示效果:

忘了说我的脚本调用代码了:

总结:

既然是Lua调用C++,需要知道:

1.创建我自己定义的h,cpp文件。

2.将上面创建的h,cpp文件能成功加载编译到so包中,并载入程序运行的内存中(android.mk文件的增加我的类)

3.创建lua跟c++相互调用的中间API转换文件(LuaCocos2d.cpp)

4.既然要创建LuaCocos2d.cpp文件,需要用到tolua++工具

5.既然需要用tolua++工具,就需要把自己的类的接口写成tolua文件

6.写好tolua文件,添加到cocos2d.tolua编译目录中,用来编译生成LuaCocos2d.cpp文件

7.自动生成LuaCocos2d.cpp成功,将我的类的定义写到LuaCocos2d.cpp文件中。( #include "MyAdder.h")

8.android Project下编译生成so包,测试。。。

————————————————————OVER————————————————————————

Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用,布布扣,bubuko.com

时间: 2024-10-07 21:07:10

Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用的相关文章

用tolua++把c++类转LUA调用的类库经历分享

c++类转成LUA调用的类 第一步:准备需要用的c++类 例子如下: c++头文件定义 #ifndef __testlua__#define __testlua__ #include <iostream>#include <string>#include <string.h>using namespace std;class testlua{private: static std::string testluatxt ; public: static std::stri

cocos2dx之tolua++全面分析(一):tolua++工具本身

在cocos2dx/tools/tolua++下面,有大量pkg文件,这些是按tolua++要求格式写好的.需要导出到lua中的c++类描述文件. 每当在c++类里增加了新函数需要导出时,应同步修改相应的pkg文件,然后运行此目录下的build.sh,就会重新生成cocos2dx/script/lua/cocos2dx_support/LuaCocos2d.cpp,里面就包含了对新增函数的封装代码. build.sh的内容如下: ${TOLUA} -L basic.lua -o ../../sc

quick cocos2d x场景切换的生命周期函数调用学习

先上一个场景的基本模版: 1 local ModelScene = class("ModelScene", function() 2 return display.newScene("ModelScene") 3 end) 4 5 function ModelScene:ctor() 6 self.sceneName = "ModelScene" 7 -- 注册点击事件监听 8 self.layer = display.newLayer() 9

quick cocos2d x 手机(Android端)启动过程学习

简要学习下quick cocos2d x 在安卓端启动的过程. 首先需要了解一点:quick cocos2d x是依托于Android的activity和GLSurfaceView(继承自SurfaceView)的环境来显示quick层的游戏界面. (1)首先quick类的android游戏从AndroidManifest.xml文件指定的activity(假设AC)启动. (2)AC继承父类的Cocos2dxActivity. (3)调用静态初始化块,加载cocos2dx的动态库.也就是一些C

quick cocos2d-x Xcode下省去clean,让修改的脚本生效

<quick cocos2d-x Xcode下省去clean,让修改的脚本生效> 项目  target     build phases    点击build phase的空白区域 选择Editor     Add Build Phase      Add Run Script Build Phase 编写脚本: 顺序调整:(第二顺位) 这样就可以避免每次修改了lua脚本,都要手动clean,然后再run,太费时间.. quick cocos2d-x Xcode下省去clean,让修改的脚本生

【Q2D】如何导出自定义C++类给框架使用

本文基于Quick cocos2d x这个游戏框架,为了行文流畅,后面都简称Q2D 导出自定义c++类给项目使用已经有了现成的例子了 详见:http://quick.cocos.org/?p=235 我们讨论的是如何导出给框架,使得我们以后每次新建项目的时候,都能使用到这个类 咱也是新手,忙活了会,编译成功了,就把这经历写下来,给自己一个备忘. 本例中,定义的c++类名叫Updater 1:建好C++ 头文件(Updater.h),类文件(Updater.cpp),按照开头链接给出的规则,根据头

cocos2dx中使用tolua++使lua调用c++函数

一直想学学cocos2dx中如何使用tolua++工具使得lua脚本调用C++函数,今天就来搞一下,顺便记录下来: 首先,我们打开cocos2dx-2.2.4中projects下的test的VS工程,可以看到这个例子里面已经有一个HelloWorld的类,我们就用它来说明一下. 然后,我们照着HelloWorld类的定义来写pkg文件: //MyClass.pkg class HelloWorld : public cocos2d::CCLayer { virtual bool init();

cocos2dx3.0导出自定义类到lua的方法详细步骤

我写了一个用3.0的工具导出类到lua,自动生成代码的方法. 以前要导出c++类到lua,就得手动维护pkg文件,那简直就是噩梦,3.0以后就会感觉生活很轻松了. 下面我就在说下具体做法.1.安装必要的库和工具包,以及配置相关环境变量,请按照cocos2d-x-3.0rc0\tools\tolua\README.mdown说得去做,不做赘述. 2.写c++类(我测试用的是cocos2d-x-3.0rc0\tests\lua-empty-test\project\Classes\HelloWorl

Cocos2D学习笔记(1)- 常用的类

1.坐标系 >屏幕坐标系(UIKit):原点在左上角! >OpenGl坐标系:原点在屏幕的左下角! 2.游戏设计:Director--Scene--Layer--Sprite. >CCDirector:导演类,相当于是游戏策划,负责整个游戏的布局和运行规则的制定. >CCScene:场景类,每个场景可以是一个界面或一个关卡. >CCLayer:图层类,为了方便游戏界面的渲染管理. >CCSprite:精灵类, 小结:一个导演类(CCDirector)可以指挥多个场景类(