Я новичок в Луа, так что голый со мной!
Я действительно не хочу идти по пути метатаблиц и т. Д., Поскольку это кажется довольно сложным
В настоящее время для грубого доступа к структурам C в Lua я делаю:
void execute_lua_script(char *name)
{
lua_pushstring (L,name);
lua_gettable (L, LUA_GLOBALSINDEX);
lua_pushstring(L,"junk");
lua_pushinteger(L,7);
lua_pushlightuserdata(L, avatar_obj);
lua_pcall (L, 3, 2, 0);
}
Зарегистрированная функция C:
int get_obj_struct(lua_State *L)
{
const char *str;
OBJECT_DEF *obj;
int stack;
obj=(OBJECT_DEF *)lua_touserdata(L,1);
str=lua_tostring(L,2);
//printf("\nIN OBJ:%d %s",obj,str);
if (!strcmp(str,"body->p.x"))
lua_pushnumber(L,obj->body->p.x);
if (!strcmp(str,"collided_with"))
lua_pushlightuserdata(L, obj->collided_with);
if (!strcmp(str,"type"))
lua_pushnumber(L,obj->type);
stack=lua_gettop(L);
//printf("\n%d",stack);
if (stack<3)
report_error("Unknown structure request ",(char *)str);
return 1;
}
Хотя сырой; оно работает! :-)
Проблема в том, когда я запрашиваю "collided_with" (указатель); Мне нужно вернуть это обратно в мой сценарий; но по причинам, которые я не понимаю, 'obj' заканчивается как ноль.
Мой сценарий Луа:
function test(a,b,obj)
--print("\nLUA! test:",a,b);
b=b+1;
c=get_obj_struct(obj,"body->p.x");
--print("x:",c);
collided_with=get_obj_struct(obj,"collided_with");
type=get_obj_struct(collided_with,"type");
print("type:",type);
return a,b;
end
Я ожидаю, что 'collided_with' будет указателем, который я затем смогу вернуть обратно в get_obj_struct и найти тип.
Я знаю, что это связано с тем, что я неправильно использую pushlightuserdata, а также читаю для obj.
Так что объяснение было бы здорово! Также, если кто-то захочет дать версию, которая использует «таблицы» (как я полагаю, это будет намного эффективнее), я буду благодарен за помощь.
Приветствия