2016-04-13 11 views
2

Ich mache meine eigene Spiel-Engine, mit Lua C API. Ich solche Lua Tabellenhierarchie bekam:Funktion in Untertabelle einfügen mit Lua C API

my_lib = { 
    system = { ... }, 
    keyboard = { ... }, 
    graphics = { ... }, 
    ... 
} 

Auch habe ich eine C-Funktion, möchte ich so etwas registrieren,:

inline static int lua_mylib_do_cool_things(lua_State *L) { 
    mylib_do_cool_things(luaL_checknumber(L, 1)); 
    return 0; 
} 

Also, wie kann ich es wie Mitglied my_lib sub- registrieren Tisch, einfach so?

my_lib = { 
    system = { do_cool_things, ... }, 
    keyboard = { ... } 
    graphics = { ...} 
} 

Jetzt weiß ich, nur die Art und Weise Mitglieder der globalen Tabellen zu registrieren, funktioniert es wie folgt aus:

inline void mylib_registerFuncAsTMem(const char *table, lua_CFunction func, const char *index) { 
    lua_getglobal(mylib_luaState, table); 
    lua_pushstring(mylib_luaState, index); 
    lua_pushcfunction(mylib_luaState, func); 
    lua_rawset(mylib_luaState, -3); 
} 

Aber was Untertabellen?

+0

Es gibt [API-Funktionen] (https://www.lua.org/manual/5.3/manual.html# luaL_setfuncs), die beim Registrieren von Funktionen in Tabellen helfen können, welche Version von Lua verwenden Sie? – Adam

+0

Danke für die Antwort. Ich benutze Lua 5.1, und es sieht so aus, als gäbe es keine solche API-Funktion. –

+0

Wahr, diese Funktion wurde in Lua 5.2 hinzugefügt, aber Sie können stattdessen [luaL_register] (https://www.lua.org/manual/5.1/manual.html#luaL_register) verwenden. – Adam

Antwort

2

Eine einfache Möglichkeit zum Registrieren mehrerer Lua C-Funktionen in einer Tabelle (mit Lua 5.1) ist die Verwendung von luaL_register.

Zuerst implementieren Sie Ihre Lua-Funktionen, sollten sie die Form eines lua_CFunction nehmen.

static int graphics_draw(lua_State *L) { 
    return luaL_error(L, "graphics.draw unimplemented"); 
} 

static int system_wait(lua_State *L) { 
    return luaL_error(L, "system.wait unimplemented"); 
} 

Als Nächstes erstellen Sie eine luaL_Reg Struktur für jede Untertabelle mit Lua-Funktionen und ihre Namen (Schlüssel).

static const struct luaL_Reg module_graphics[] = { 
    {"draw", graphics_draw},   
    // add more graphic functions here.. 
    {NULL, NULL} // terminate the list with sentinel value 
}; 

static const struct luaL_Reg module_system[] = { 
    {"wait", system_wait},   
    {NULL, NULL} 
}; 

Dann wird in der Funktion, wo Sie Ihre Modultabelle, die jede Untertabelle und register Funktionen erstellen zurückzukehren.

int luaopen_game(lua_State *L) {  
    lua_newtable(L); // create the module table 

    lua_newtable(L);       // create the graphics table 
    luaL_register(L, NULL, module_graphics); // register functions into graphics table 
    lua_setfield(L, -2, "graphics");   // add graphics table to module 

    lua_newtable(L);       // create the system table 
    luaL_register(L, NULL, module_system); // register functions into system table 
    lua_setfield(L, -2, "system");   // add system table to module 

    // repeat the same process for other sub-tables 

    return 1; // return module table 
} 

Diese mit der folgenden Struktur in einem Modultabelle führen soll:

game = { 
    graphics = { 
     draw -- C function graphics_draw 
    }, 
    system = { 
     wait -- C function system_wait 
    } 
} 
+0

Vielen Dank. Nachdem ich die Frage gestellt habe, habe ich die Lösung selbst gefunden, aber deine ist viel komplexer. –

+1

Gern geschehen. Dieses Muster wird normalerweise für Lua-Module verwendet, die in C geschrieben sind, wie in dem ausgezeichneten Buch [Programming in Lua] (http://www.lua.org/pil/28.1.html) gezeigt. Die erste Ausgabe ist online kostenlos verfügbar. – Adam