您的位置:首页 > 移动开发 > Cocos引擎

Tolua使用,利用pkg文件,封装自己的lua支持的cocos2dx的接口

2013-09-27 11:45 519 查看
首先,我们在c++ cocos2d-x工程里面实现一个自己的接口:
#pragma once
#include "sprite_nodes\CCSprite.h"

class MySprite :
public cocos2d::Sprite
{
public:
static MySprite* createMS(const char* fileName, int x, int y);
};
</pre><pre name="code" class="cpp"><pre name="code" class="cpp">#include "MySprite.h"
using namespace cocos2d;
MySprite* MySprite::createMS(const char* fileName, int x, int y)
{
MySprite * temp = new MySprite();
//Sprite::create(fileName);
if (temp && temp->initWithFile(fileName))
{
temp->setPosition(Point(x, y));
temp->autorelease();
return temp;
}
CC_SAFE_DELETE(temp);
return NULL;
}
然后开始封装我们的pkg文件:打开cocos2d-x中自己带的tolua工具:cocos2d-x\tools\tolua++发现里面有很多pkg文件,就是现在lua现在支持的cocos2d-x的一些API,可以用文本文件打开,看到里面就是cocos2d-x函数的声明把里面的tolua++.rar文件打开(windows),土豪们可以用(tolua++.Mac.zip),(呵呵, 话说土豪我们做朋友吧)然后我们自己新建一个文件夹 ,然后我们把所有的文件都考到这个目录下:然后我们改一下自己的pkg,文件放到这个目录下。pkg文件的修改规则:(readme)  (下面特别注意:)
1)enum keeps the same 保持枚举类型不变
2)remove CC_DLL for the class defines, pay attention to multi inherites 删除CC_DLL的类定义、改为多继承(lua中好像不支持多继承)
3)remove inline keyword for declaration and implementation 删掉声明的inline关键词
4)remove public protect and private 删除访问限定
5)remove the decalration of class member variable 删除类的成员变量
6)keep static keyword  保留statiic关键词
7)remove memeber functions that declared as private or protected 成员函数声明为私人或受保护的都删掉
8)删除命名空间,继承中写的命名空间也要删除掉
9)删除#include 头文件, 预编译指令,宏定义
10)特殊的类型,const前缀要删掉, char * 类型不用,否则会报错
11)如果函数是定义,改删掉定义,改为声明
12)pkg文件只是告诉lua有什么函数需要生成,如果lua用不到的函数,不必导出lua接口,比如用不到的构造函数或析构函数。
13)tolua的文件,非自定义类型,只支持c语言的基本类型,在函数的返回值和参数类型需要修改,比如
const string & 改为 char *
Number 改为 float
uint 改为 init
14)c++里面的注册事件调用的是C++的函数,如果要调用lua的函数,需要重新写,一种做法是重写注册事件,传入lua函数与特定的代表事件的字符串,void registerScriptHandler(int funId, String type);存到一个map里面,然后调用,核心调用方法:cocos2d::CCLuaEngine* luaEngine = dynamic_cast<cocos2d::CCLuaEngine*>(cocos2d::CCScriptEngineManager::sharedManager()->getScriptEngine());if (luaEngine){cocos2d::CCLuaStack *pStack = luaEngine->getLuaStack();int nHandler = iter1->second;if (!nHandler) return;pStack->pushCCObject(event, "CCObject");pStack->executeFunctionByHandler(nHandler, 1);pStack->clean(); }
如果需要新编译成新的文件,在一个pkg文件中加入如下:
$pfile "CCDragonBones.pkg"$pfile "Cocos2dxAtlasNode.pkg"$pfile "Cocos2dxDisplayBridge.pkg"
然后修改 build.bat  批处理文件,添加 生成文件的位置和名字, 编码不对会导致生成失败,请用NotePad++,把文件转换为     UFT8 无 BOM格式
tolua++ -L basic.lua -o "C:/Users/hqy/Desktop/xx/LuaCocosStudio.cpp" CocosStudio.pkg
编译的时候也会提示一些错误,然后按照提示改一下就行了。编译成功,如果是新生成的 cpp文件,#include 在lua中用到c++头文件 和 命名空间 ,  查看该Cpp最后,有这样的东西
#if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501TOLUA_API int luaopen_CocosStudio (lua_State* tolua_S) {return tolua_CocosStudio_open(tolua_S);};#endif
为这个Cpp文件定义一个配套的头文件,声明上面的函数(这个可复制,需要改的就是该函数名不一样,防止重复引用头文件 宏定义不一样)
#ifndef __LUADRAGON_H_#define __LUADRAGON_H_#ifdef __cplusplusextern "C" {#endif#include "tolua++.h"#ifdef __cplusplus}#endifTOLUA_API int luaopen_dragonBones(lua_State* tolua_S);  //与cpp中的函数要一致#endif // __LUADRAGON_H_
然后在CCLuaStack.cpp中 包含 刚才修改的头文件,在 CCLuaStack::init()  函数中,引入初始化上面 函数
luaopen_dragonBones(m_state);
这样就可以在lua中调用导出的接口了,如果有问题,查看一下导出的cpp,文件 是否有问题,比如  类的继承中 是否是带了 命名空间。这个我改好的pkg文件:
class MySprite :public CCSprite{static MySprite* createMS(const char* fileName, int x, int y);};
注:cocos2d-x3.0, C++已经取消类前面+ CC,但是封装lua接口的时候这个CC就必须要加上。修改好了之后,我们打开Cocos2d.pkg,在下面添加上我们的pkg文件:$pfile "MySprite.pkg"然后修改bulid.bat文件 更改一下生成的LuaCocos2d.cpp的位置:(添加暂停)tolua++ -L basic.lua -o "C:/Users/h/Desktop/tolua++/LuaCocos2d.cpp" Cocos2d.pkgpause          我配置到桌面了,你们随意,然后生成在目录下会生成LuaCocos2d.cpp把这个东西放到放到这个目录下cocos2d-x\scripting\lua\cocos2dx_support:(建议备份,别给自己整悲剧了)在LuaCocos2d.cpp文件中加入,#include “MySprite.h” (包含你自定义类的头文件)然后在helloLua,目录下加入,你刚才自己定义的类,然后包含到工程:编译一下:成功然后在cocos2d-x\samples\Lua\HelloLua\Resources,打开hello.lua编译测试我们绑定的接口:VS中Debug一下: OK,成功~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐