#include #include #include "Base/ExportHelp.h" #include "ScriptBind/Script.h" using namespace Aurora; inline void doFile(lua_State *L, const char *fileName) { bool ret = luaL_dofile(L, fileName ) == 0; if(!ret) { const char* error_info = lua_tostring(L, -1); LUA_ERROR(L, "%s", error_info); } } class BaseClass { public: BaseClass() : x_(0) {} void SetX(int x) {x_ = x; printf("TestClass SetX to %d\n", x);} int GetX() /*const*/ {printf("TestClass GetX %d\n", x_); return x_;} int Foo5(int, int, int, int, int){} static void Print() {printf("BaseClass Print\n");} int x_; }; class DerivedClass : public BaseClass { public: DerivedClass() {} DerivedClass(int) {} static void Print() {printf("DerivedClass Print\n");} }; class ScriptComponent { public: ScriptComponent() {} void SetScriptClass(LuaTable sptClass) { script_class_ = sptClass; script_init_func_ = sptClass.Get("OnInit"); script_start_func_ = sptClass.Get("OnStart"); } void Init() { if(script_init_func_.IsValid()) script_init_func_(this); } void Start() { if(script_start_func_.IsValid()) script_start_func_(this); } void print() { printf("ScriptComponent print\n"); } private: LuaTable script_class_; LuaFunction script_init_func_; LuaFunction script_start_func_; }; inline ScriptComponent* doComponent(lua_State *L, const char *fileName, const char *compName) { LuaFunction func(L, "LoadComponentFile"); func(fileName, compName); LuaTable sptClass = func.Return(); LuaFunction newFunc = sptClass.Get("new"); newFunc(); ScriptComponent* component = newFunc.Return(); component->SetScriptClass(sptClass); return component; } void test_lua(lua_State* L) { run_buildin_bindings(); BEGIN_BASE_CLASS(BaseClass) CONSTRUCTOR() METHOD(GetX) METHOD(SetX) METHOD_STATIC(Print) END_CLASS() BEGIN_INHERITED_CLASS(DerivedClass, BaseClass) CONSTRUCTOR() METHOD_STATIC(Print) END_CLASS() BEGIN_BASE_CLASS(ScriptComponent) CONSTRUCTOR() METHOD(print) END_CLASS() BaseClass bc; doFile(L, "class.lua"); doFile(L, "buildin.lua"); doFile(L, "sample1.lua"); ScriptComponent* t1 = doComponent(L, "test_comp.lua", "TestSptComp"); t1->Init(); t1->Start(); ScriptComponent* t2 = doComponent(L, "test_comp1.lua", "TestSptComp1"); t2->Init(); t2->Start(); printf("test finished\n"); } int main() { // test lua lua_State* L = OpenLua(); test_lua(L); CloseLua(L); // pause std::cin.ignore(1); return 0; }