cocos2d-x 3.0 在C++中调用lua函数(2)
个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下:
#ifndef __CC_LUA_STACKEX_H_ #define __CC_LUA_STACKEX_H_ #include "CCLuaStack.h" NS_CC_BEGIN class LuaStackEx : public LuaStack { public: void call_script_fun(const char* fun) { executeGlobalFunction(fun); } template<typename... Args> void call_script_fun(const char* fun, Args... args) { lua_getglobal(_state, fun); /* query function by name, stack: function */ if (!lua_isfunction(_state, -1)) { CCLOG("[LUA ERROR] name '%s' does not represent a Lua function", fun); lua_pop(_state, 1); return; } int args_amount = 0; split_args(args_amount, args...); executeFunction(args_amount); } protected: template<typename T> void split_args(int &args_amount, T data) { push_data(data); args_amount++; } template<typename T, typename... Args> void split_args(int &args_amount, T data, Args... args) { push_data(data); args_amount++; split_args(args_amount, args...); } protected: template<typename T> void push_data(T data) { CCLOG("存在未定义类型的数据, 无法传参到lua脚本."); } template<> void push_data(int data) { pushInt(data); } template<> void push_data(long data) { pushLong(data); } template<> void push_data(float data) { pushFloat(data); } template<> void push_data(std::string str) { pushString(str.c_str()); } template<> void push_data(const std::string& str) { pushString(str.c_str()); } template<> void push_data(const char* str) { pushString(str); } template<> void push_data(bool data) { pushBoolean(data); } // 用户数据, 传指针 template<> void push_data(void* udata) { lua_pushlightuserdata(_state, udata); } }; NS_CC_END #endif // __CC_LUA_STACKEX_H_
#include "CCLuaStackEx.h"