Войти
ПрограммированиеФорумОбщее

Lua - глобальная переменная из c++

#0
9:52, 16 ноя. 2009

Здравствуйте

У меня вопрос: как объявить в lua статическую переменную из c++ чтобы оставалась метаинфомация о классе?
Есть переменная в коде(экземпляр класса Game), нужно ее перенести в скрипт.
Можно было бы сделать
lua_pushlightuserdata(m_Lua,mp_Game);
lua_setfield(L, LUA_GLOBALSINDEX, "game");
но в этом случае не сохранится вся метаинфрмация

как быть?


#1
13:13, 16 ноя. 2009

sergiokey
> но в этом случае не сохранится вся метаинфрмация
а какая метаиформация должна сохраняться? и в каком случае она сохраняется? метатаблицы - есть только в луа, в с++ их нету , и перенести их невозможно.
зы
мои телепатические способности подсказывают что ты не знаком с luabind ;)

#2
14:00, 16 ноя. 2009

Если написать game = Game(), то Lua будет воспринимать переменную как будто она - типа Game и будет возможно вызывать ее методы, etc. Это я и назвал метаинформацией.

Если сделать так:
lua_pushlightuserdata(m_Lua,mp_Game);
lua_setfield(L, LUA_GLOBALSINDEX, "game");

то будет уже нельзя пользовать методами, как я понимаю.
про  luabind - я wxLua пользуюсь, так получилось)))

#3
14:08, 16 ноя. 2009

sergiokey
> сли написать game = Game(), то Lua будет воспринимать переменную как будто она
> - типа Game и будет возможно вызывать ее методы, etc. Это я и назвал
> метаинформацией.
ты в одну кучу понятия не мешай. для себя разберись хотябы. откуда в луа берется метаинформация? правильно, если ее туда никто не положил, то ее там не будет. соотвественно фунция Game - формирует эту метаинформацию....

еще раз! луабинд изучил? я так понимаю что game = Game();  это какраз позволяет луабинд такое делать (трудно предположить что это какойто велосипед, ибо тогдабы ты знал что как и почему). значит попробуй вот что
luabind::globаls["game"] = mp_Game;

#4
14:14, 16 ноя. 2009

sergiokey
tolua++ тоже посмотри

#5
17:23, 16 ноя. 2009

LowPolyMan
> tolua++ тоже посмотри
кодогенератор? фу!!!! бяка!!!

#6
18:00, 16 ноя. 2009

спасибо за ответы)))

решил сделать через static Game* inctance(), потому что по другим причинам была необходимость реализовать Game как синглетон)))))
а то что я хотел реализуется через
int lua_setmetatable ( lua_State * lua, int index ); (если кому-то понадобится) (2Kloun - не везде нужен luabind;))))

теперь у меня такой вопрос:
решил переписать require("..."), чтобы открывало из архивов

int Require(lua_State* L){
  if (sp_Game->m_Lua.IsStringType(1)){
    wxString filename = lua2wx(sp_Game->m_Lua.GetStringType(1));
    sp_Game->m_Lua.lua_Pop(1);
    sp_Game->RunLuaFile(filename);
    return sp_Game->m_Lua.lua_Error();
  }else{
    wxlua_error(sp_Game->m_Lua.GetLuaState(),wxT("Param must be string"));
  }
  return 0;
}

но при выполнении require("sub"),например, вываливается сообщение о том, что lua уже выполняется:
failed in wxLuaState::RunBuffer(): Lua interpreter is already running
Все это логично, но как мне тогда это реализовать?

(lua_Reader не предлагать))))

#7
18:43, 16 ноя. 2009

sergiokey
> решил сделать через static Game* inctance(), потому что по другим причинам была
> необходимость реализовать Game как синглетон)))))
> а то что я хотел реализуется через
> int lua_setmetatable ( lua_State * lua, int index ); (если кому-то понадобится)
> (2Kloun - не везде нужен luabind;))))
так тыже не пояснил, каким образом ты вообще метаданные устанавливаешь! если ты писал функцию Game() ( которая в первом посте в луа коде у тебя), то в этой функции ты был обязан указывать метаданные, соотвественно во втором случае, код должен быть аналогичный по "опусканию" объекта game на стек. отсюда вывод сам напросился - функция Game() была забиндина в луа сторонней программой ))) я предположил что луабинд. от тебя никаких пояснений так и не дождался..... зачем вообще было тогда спрашивать...

sergiokey
> failed in wxLuaState::RunBuffer(): Lua interpreter is already running
ничего логичного в этом нету, это похоже какаято недоработка враппера wx. для луа нету проблем в вызове функций луа, из с-функций. (lua - файл - это по сути таже функция, исполнение файла - исполнение этой функции).
используй luaL_dofile ))

#8
20:09, 16 ноя. 2009

Kloun
> ничего логичного в этом нету, это похоже какаято недоработка враппера wx
скорее переработка))))
LoadBuffer/PCall замечательно прошли))

Kloun
> от тебя никаких пояснений так и не дождался.....

sergiokey
> про luabind - я wxLua пользуюсь, так получилось)))

в wx есть и генератор кода)

#9
20:38, 16 ноя. 2009

sergiokey
> > про luabind - я wxLua пользуюсь, так получилось)))
блин пропустил эту фразу. извиняйте ;(

ПрограммированиеФорумОбщее

Тема в архиве.