2009-09-22 2 views
2

Я искал учебники, демонстрирующие, как совместно использовать объект C++ с помощью Lua с использованием API. Большинство учебников показывают, как экспортировать класс.Как я могу делиться данными между C++ и Lua?

Я хотел бы начать очень просто и выставить переменную (скажем int myVar = 5) таким образом, что изменение в Lua будет отражено в приложении C++.

Кто-нибудь знает какие-либо хорошие учебные пособия, которые могут показать мне, как это сделать?

ответ

3

Как уже упоминалось СБК, вы бы получить доступ к переменной в качестве члена UserData:

print(cside.myVar) -- 5 

Вот некоторые примеры кода, чтобы сделать это с помощью API Lua. Его простой, хотя и утомительный. Вы либо хотите сделать свой собственный генератор кода, или используя что-то вроде глотка или 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

Похоже, что вы хотите посмотреть на tolua++

+0

Я действительно сделать это с API Lua, а не с использованием библиотеки, но я дам ему вид. –

5

Подвергая переменные для прямой модификации с использованием только Lua API не все так просто. Вы должны создать Lua таблицу или UserData (используя lua_newtable или lua_newuserdata соответственно), а затем создать мета-таблицу - в вашем случае он должен иметь __index и __newindex события для чтения и записи доступа, так и в тех, функции, которые должны соответствовать вашей переменной по имени. Это не забавно писать вручную.

При этом должно быть достаточно ясно, что вы не можете выставить переменную на глобальном уровне Lua - вы должны сделать ее членом таблицы/userdata. Это будет очень похоже на класс/объект из Lua, поэтому просто разоблачение одной переменной не проще, чем разоблачение класса. Более того, разоблачение функций/методов намного проще. Поэтому чтение этих учебных пособий об экспонировании классов определенно поможет.

Но использование только Lua API по-прежнему не представляет труда. Не поймите меня неправильно, Lua API является опрятным и замечательным, но если у вас есть много, чтобы разоблачить его, он станет очень утомительным, и вы в конечном итоге либо напишите много скучного повторяющегося кода, чтобы привязать вас к классам или написать какие-то инструмент для автоматизации этой задачи для вас (использование большого количества макросов, скорее всего, станет вашей первой идеей, было там, сделано это;)). Такие инструменты уже существуют, tolua++, luabind и, возможно, многие другие.

+0

Это похоже на то, что я искал. Могу ли я расширить это, используя аналогичный подход для доступа к данным типа «scene.objects [5] .material.diffuseColor.red'? –

Смежные вопросы