2009-09-22 14 views
2

Je cherchais des tutoriels montrant comment partager un objet C++ avec Lua en utilisant l'API. La plupart des tutoriels montrent juste comment exporter une classe.Comment puis-je partager des données entre C++ et Lua?

Je voudrais commencer très simple et exposer une variable (par exemple int myVar = 5) de telle sorte qu'une modification de Lua sera reflétée dans l'application C++.

Est-ce que quelqu'un sait de bons tutoriels autour de qui peut me montrer comment faire cela?

Répondre

3

Comme mentionné sbk, vous devez accéder à votre variable en tant que membre d'un userdata:

print(cside.myVar) -- 5 

Voici quelques exemples de code pour le faire en utilisant l'API Lua. C'est simple, bien que fastidieux. Vous voulez, soit faire votre propre générateur de code ou d'utiliser quelque chose comme rasade ou tolua ++

/* gcc -o simple simple.c -llua -lm -ldl */ 
#include <stdio.h> 

#include "lua.h" 
#include "lauxlib.h" 

int myVar = 5; 

int l_set(lua_State *L) 
{ 
const char *key = luaL_checkstring(L, 2); 
int val = luaL_checkint(L, 3); 

if (strcmp(key, "myVar") == 0) 
    myVar = val; 
} 

int l_get(lua_State *L) 
{ 
const char *key = luaL_checkstring(L, 2); 

if (strcmp(key, "myVar") == 0) 
{ 
    lua_pushinteger(L, myVar); 
    return 1; 
} 
} 

int main(int argc, char *argv[]) 
{ 
const struct luaL_Reg somemt[] = 
{ 
    { "__index", l_get }, 
    { "__newindex", l_set }, 
    { NULL, NULL } 
}; 

lua_State *L = luaL_newstate(); 
luaL_openlibs(L); 

lua_newuserdata(L, sizeof(void *)); 

luaL_newmetatable(L, "somemt"); 
luaL_register(L, NULL, somemt); 
lua_setmetatable(L, -2); 

lua_setglobal(L, "cside"); 

luaL_dostring(L, "print('from Lua:', cside.myVar)"); 
luaL_dostring(L, "cside.myVar = 200"); 

printf("from C: myVar = %d\n", myVar); 
} 
2

On dirait que vous voulez regarder tolua++

+0

que je cherchais vraiment de le faire avec l'API Lua plutôt que d'utiliser une bibliothèque, mais je vais lui donner un coup d'oeil. –

5

Révéler vos variables pour la modification directe en utilisant uniquement l'API Lua est pas si simple. Vous devez créer la table Lua ou UserData (en utilisant lua_newtable ou lua_newuserdata respectivement), puis créer une méta table - dans votre cas, il devrait avoir les __index et __newindex événements pour la lecture et l'accès en écriture et dans les fonctions vous devez correspondre à votre variable par son nom. Ce n'est pas amusant d'écrire manuellement. Cela dit, il devrait être assez clair que vous ne pouvez pas exposer une variable au niveau global de Lua - vous devriez en faire un membre d'une table/userdata. Cela ressemblera beaucoup à une classe/un objet de Lua, donc exposer une seule variable n'est pas plus simple que d'exposer une classe. De plus, exposer des fonctions/méthodes est beaucoup plus simple. Donc lire ces tutoriels sur l'exposition des classes va certainement aider. Mais utiliser seulement Lua API n'est toujours pas amusant. Ne vous méprenez pas, l'API de Lua est belle et géniale, mais si vous avez beaucoup à exposer, cela devient vraiment fastidieux et vous finirez soit par écrire beaucoup de code répétitif ennuyeux pour vous lier à des cours ou écrire une sorte de outil pour automatiser cette tâche pour vous (en utilisant beaucoup de macros sera probablement votre première idée, été là, fait cela;)). De tels outils existent déjà, tolua++, luabind et peut-être bien d'autres.

+0

Cela ressemble exactement à ce que je cherchais. Puis-je l'étendre en utilisant une approche similaire pour accéder à des données comme 'scene.objects [5] .material.diffuseColor.red'? –

Questions connexes