在cocos2dx3.0 lua教程 自己写的类连接lua 使lua能调用自己类的函数
2014-03-31 18:31
531 查看
我们可以在lua上面编写cocos2dx 用lua调用到cocos2dx的api 是因为在
lua_cocos2dx_auto这类函数里面建立的连接,大家可以参考然后自己写做连接。
如我一下建立一个类 如building
class Building : public Node
{
public:
Building(const std::string &fileName);
static Building* create(const std::string &fileName);
void setSelected(bool selected);
void setPosition(float x, float y);
我自己再仿照lua_cocos2dx_auto建立连接,如下
在TOLUA_API int register_all_classes(lua_State* tolua_S)函数里面写
lua_register_Building(tolua_S);这里是实现
int lua_register_Building(lua_State* tolua_S)
{
tolua_usertype(tolua_S,"Building");
tolua_cclass(tolua_S,"Building","Building","cc.Sprite",NULL);
tolua_beginmodule(tolua_S,"Building");
tolua_function(tolua_S,"create", lua_Building_create);这里是实现 lua_Building_create 等各个函数
int lua_Building_create(lua_State* tolua_S)
{
int argc = lua_gettop(tolua_S)-1;
if (argc != 1) {
CCLOG("%s, %d+++++++++++argc error :%d", __FUNCTION__, __LINE__, argc);
return 0;
}
std::string arg0;
if (luaval_to_std_string(tolua_S, 2, &arg0) == false) //栈里总共两个元素,第2个和第-1个都是一样的
{
CCLOG("%s, %d+++++++++++get argc error", __FUNCTION__, __LINE__);
return 0;
}
Building* ret = Building::create(arg0);
if (NULL != ret)
{
std::string className = "BayuArmature";
cocos2d::Object *dynObject = dynamic_cast<cocos2d::Object *>((Building*)ret);
if (NULL != dynObject)
{
int ID = ret ? (int)(dynObject->_ID) : -1;
int* luaID = ret ? &(dynObject->_luaID) : NULL;
toluafix_pushusertype_ccobject(tolua_S,ID, luaID, (void*)ret, className.c_str());
}
else
{
tolua_pushusertype(tolua_S, (void*)ret, className.c_str());
}
}
else
{
lua_pushnil(tolua_S);
}
return 1;
}
最后在AppDelegate函数钟调用 register_all_classes 的函数然后就算是注册成功了。
如下代码
// register lua engine
auto engine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()->setScriptEngine(engine);
register_all_classes(engine->getLuaStack()->getLuaState());
然后就可以在lua调用building类了
lua_cocos2dx_auto这类函数里面建立的连接,大家可以参考然后自己写做连接。
如我一下建立一个类 如building
class Building : public Node
{
public:
Building(const std::string &fileName);
static Building* create(const std::string &fileName);
void setSelected(bool selected);
void setPosition(float x, float y);
我自己再仿照lua_cocos2dx_auto建立连接,如下
在TOLUA_API int register_all_classes(lua_State* tolua_S)函数里面写
lua_register_Building(tolua_S);这里是实现
int lua_register_Building(lua_State* tolua_S)
{
tolua_usertype(tolua_S,"Building");
tolua_cclass(tolua_S,"Building","Building","cc.Sprite",NULL);
tolua_beginmodule(tolua_S,"Building");
tolua_function(tolua_S,"create", lua_Building_create);这里是实现 lua_Building_create 等各个函数
int lua_Building_create(lua_State* tolua_S)
{
int argc = lua_gettop(tolua_S)-1;
if (argc != 1) {
CCLOG("%s, %d+++++++++++argc error :%d", __FUNCTION__, __LINE__, argc);
return 0;
}
std::string arg0;
if (luaval_to_std_string(tolua_S, 2, &arg0) == false) //栈里总共两个元素,第2个和第-1个都是一样的
{
CCLOG("%s, %d+++++++++++get argc error", __FUNCTION__, __LINE__);
return 0;
}
Building* ret = Building::create(arg0);
if (NULL != ret)
{
std::string className = "BayuArmature";
cocos2d::Object *dynObject = dynamic_cast<cocos2d::Object *>((Building*)ret);
if (NULL != dynObject)
{
int ID = ret ? (int)(dynObject->_ID) : -1;
int* luaID = ret ? &(dynObject->_luaID) : NULL;
toluafix_pushusertype_ccobject(tolua_S,ID, luaID, (void*)ret, className.c_str());
}
else
{
tolua_pushusertype(tolua_S, (void*)ret, className.c_str());
}
}
else
{
lua_pushnil(tolua_S);
}
return 1;
}
最后在AppDelegate函数钟调用 register_all_classes 的函数然后就算是注册成功了。
如下代码
// register lua engine
auto engine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()->setScriptEngine(engine);
register_all_classes(engine->getLuaStack()->getLuaState());
然后就可以在lua调用building类了
相关文章推荐
- 关于指针的一些事情
- C/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解
- C++中引用(&)的用法与应用实例分析
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- C++ Primer 第一部分基本语言
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 探讨C++中数组名与指针的用法比较分析
- 深入解析C++中的引用类型
- C++可变参数的实现方法