프로그래밍 | 2010. 5. 30. 02:29
-- sample.lua lua_int = 3 // main.cpp // sample2.lua를 읽어들여 실행한다. luaL_dofile( L, "sample.lua" ); // lua_int 값을 찾기 위해 키를 Stack에 Push lua_pushstring( L, "lua_int" ); // Global 테이블에서 stack에 넣어진 키에 해당하는 값을 꺼내 // Stack의 맨 위에 push 한다. lua_gettable( L, LUA_GLOBALSINDEX ); // stack의 가장 윗부분의 값을 가져온다. int lua_int = luaL_checknumber( L, -1 ); // stack에서 1개 pop한다. lua_pop( L, 1 );
// main.cpp int cpp_int = 100; // 테이블에서 사용할 키를 Stack에 push lua_pushstring( L, "cpp_int" ); // 값을 Stack에 push lua_pushnumber( L, cpp_int ); // Global 테이블에 "appoint“를 키(key)로하여 cpp_int를 값으로 추가 lua_settable( L, LUA_GLOBALSINDEX ); luaL_dofile( L, "sample.lua" ); -- sample.lua print("cpp_int = ".. cpp_int) // 잘 쓴다......
-- sample.lua function LuaFunc() print( "in LuaFunc" ) return 3 end // main.cpp luaL_dofile( L, "sample.lua" ); // sample.lua를 읽어 들여 실행 한다. // Global 테이블에서 키가 LuaFunc인 것을 찾아 Stack의 맨 위에push lua_getfield( L, LUA_GLOBALSINDEX, "LuaFunc" ); // stack에 push된 함수를 호출, // 인자는 0이며, 반환 값은 1개, 에러 처리는 하지 않음 lua_pcall( L, 0, 1, 0 ); int luaFuncResult = (int)luaL_checknumber( L, -1 );
4. 루아에서 C++함수를 사용하는 방법
// main.cpp int cpp_func( lua_State *L ) { // 매개변수가 2개 필요하므로 Stack에서 두개를 가져온다. int arg1 = (int)luaL_checknumber( L, -2 ); int arg2 = (int)luaL_checknumber( L, -1 ); lua_pushnumber( L, arg1+arg2 ); // 결과값을 스택에 넣는다. return 1; // 결과 값의 개수를 return } // 루아 테이블에서 키로 사용할 이름을 넣는다. lua_pushstring(L, "Func" ); // 값으로는 함수의 포인터를 넘겨준다. lua_pushlightuserdata(L, cpp_func); lua_pushcclosure( L, cpp_func, 1 ); // 전역테이블에 키,값을 저장한다. lua_settable(L, LUA_GLOBALSINDEX); luaL_dofile( L, "sample.lua" ); // sample.lua를 읽어 들여 실행 한다. -- sample.lua a = Func( 1, 2 ) // 잘 쓴다..
-- sample.lua -- Lua쪽 변수에 값을 할당한다. lua_int = cpp_int // main.cpp luaL_dofile(L, "sample.lua"); // global 테이블에서 lua_int 키를 찾아서 값을 가져온다. size_t lua_int = luabind::object_cast(luabind::globals(L)["lua_int"]);
// main.cpp int cpp_int = 100; // Global 테이블에 cpp_int 추가 luabind::globals(L)["cpp_int"] = cpp_int; luaL_dofile(L, "sample.lua"); -- sample.lua print("Get cpp cpp_int :", cpp_int) // 잘쓴다...
-- sample.lua function LuaFunc() print( "In Lua LuaFunc()" ) return 3 end // main.cpp luaL_dofile(L, "sample.lua"); // 반환값이int 이고 이름이 LuaFunc인 루아함수를 실행 int luaFuncResult = luabind::call_function(L,"LuaFunc");
// main.cpp int func( int a, int b ) { return a + b; } // c함수를 lua로 연결 luabind::module(L) [ luabind::def("Func", &func) ]; luaL_dofile(L, "sample.lua"); -- sample.lua print( Func( 2, 2 ) )
-- sample.lua -- Lua쪽 변수에 값을 할당한다. lua_int = cpp_int // main.cpp // sample1.lua 파일을 로드/실행 한다. lua_tinker::dofile(L, "sample.lua"); // sample1.lua의 변수를 호출한다. int lua_int = lua_tinker::get(L, "lua_int");
// main.cpp int cpp_int = 100; // LuaTinker를 이용해서 cpp_int를 Lua에 전달 lua_tinker::set(L, "cpp_int", cpp_int); lua_tinker::dofile(L, "sample.lua"); -- sample.lua print( cpp_int )
-- sample.lua function LuaFunc() print( "In Lua LuaFunc()" ) return 3 end // main.cpp // sample.lua 파일을 로드/실행한다. lua_tinker::dofile(L, "sample.lua"); // sample1.lua의 LuaFunc함수를 실행, 반환값은 int int luaFuncResult = lua_tinker::call(L, "LuaFunc");
// main.cpp int cpp_func(int arg1, int arg2) { return arg1 + arg2; } // Func 이름으로 Lua에서 사용할수있도록 함수를 등록 lua_tinker::def(L, "Func", cpp_func ); -- sample.lua print( Func( 2, 2 ) )
LuaBind와 LuaTinker를 사용하면 Lua API나 스택에 대해서 세심하게 신경쓰지 않아도 Lua와 C++ 사이의 값교환이 가능함을 알 수 있다. 물론 LuaBind와 LuaTinker는 위에서 작성한 것이외에도 클래스, 상속관계... 여러가지 많은 기능을 제공한다.
LuaBind의 느린 빌드 속도를 줄이기 위해서 Pre-Compiled Header를 사용하는 방법에 대해서도 조사해보았다.
Lua Binding 관련해서 볼만한 Game Programming gems 부분들..
Xcode에서 OpenGL 프로그래밍 하기 (0) | 2010.12.17 |
---|---|
LuaTinker로 싱글턴(Singleton) 넘기기 (1) | 2010.06.02 |
코딩도장 - 단어찾기 (0) | 2010.04.27 |
일정 예측 (0) | 2010.04.23 |
소스코드 관리 시스템(SCM)에 로그 제대로 남기기 (0) | 2010.04.21 |
Recent Comments