먹는 ê²ƒì— ëŒ€í•œ 사랑보다 ë” ê±°ì§“ 없는 ì‚¬ëž‘ì€ ì—†ë‹¤. ―조지 버나드 쇼
[[Include(분류/lua)]]
- ìƒë‹¹ížˆ ê´œì°®ì€ í…œí”Œë¦¿ ë¼ì´ë¸ŒëŸ¬ë¦¬ìž…니다. luaì— í´ëž˜ìФ ê¸°ëŠ¥ì„ ë”해주는 ê²ƒë§Œí•´ë„ ê°’ì–´ì¹˜ê°€ ìžˆì£ .
ì›ëž˜ 언어가 C로 ë˜ì–´ìžˆì–´ ì •ì‹ê¸°ëŠ¥ìœ¼ë¡œ 들어갈지는 ì˜ë¬¸ì´ì§€ë§Œ... ì§€ê¸ˆë§Œìœ¼ë¡œë„ ê´œì°®ì„ ê²ƒ 같습니다.
2.1 luaìƒì˜ class 맴버함수 호출하기 #
luabind::object gt_ = luabind::get_globals(L);
if (gt_["stage"])
{
using namespace luabind;
try {
object stage_ = object_cast< object >(gt_["stage"]);
call_member<void>(stage_, "onTest");
printf("stage가 존재합니다!\n");
}
catch(luabind::error& e) {
printf("존재하지 않는 stage ì´ë²¤íЏ 함수 호출!");
}
}
else
printf("stageê°€ ì„ ì–¸ë˜ì§€ 않았습니다\n");
2.2 enum 테스트 #
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <iostream>
#include <luabind/luabind.hpp>
using namespace luabind;
class test {
enum key_val {TEST_VALUE, TEST_VALUE2};
};
int main(int argc, char **argv)
{
module(l)
[
class_<test>("test")
.enum_("key_val")
[
value("TEST_VALUE", 12345),
value("TEST_VALUE2", 67890)
]
];
lua_dostring(l, "print('TEST_VALUE : ', test.TEST_VALUE)" );
lua_dostring(l, "print('TEST_VALUE2 : ', test.TEST_VALUE2)");
return 0;
}
2.3 luaìƒì˜ 함수ê°ì²´ë¥¼ 콜백으로 ê°„ì£¼í•˜ê³ C++ìƒì—서 실행하기 #
ì›ë³¸ í´ëž˜ìФ 코드 :
class test_klass {
object objfunc_;
public:
void register_callback(object functor_) {
if (functor_.is_valid() && functor_.type() == LUA_TFUNCTION)
objfunc = functor_;
else
{
object dummy;
objfunc = dummy;
}
}
void run_callback() {
if (objfunc) objfunc();
}
};
ë“±ë¡ ì½”ë“œ :
module(L, "test")
[
class_<test_klass>("test_klass")
.def(constructor< >())
.def("register", &lua_Connector::register_callback)
.def("run", &lua_Connector::run_callback)
];
lua 코드 ì˜ˆì œ :
a = test.test_klass()
function callback1() print("ì´ê²ƒì´ ë³´ì´ë©´ 실행성공!") end
a:register(callback1)
a:run()
2.4 C++ í´ëž˜ìŠ¤ë¥¼ ìƒì†í•œ lua í´ëž˜ìŠ¤ë¥¼ 다시 C++ì—서 호출하기 #
ì´ê²ƒì€ ì—”ì§„ì œìž‘ì‹œ 엔진ì—서 ê°ì²´ë¥¼ 스í¬ë¦½íЏì—서 í™•ìž¥í• ìˆ˜ 있ë„ë¡ í•˜ê³ ìž í• ë•Œ ìœ ìš©í•©ë‹ˆë‹¤. virtual 함수를 í¬í•¨í•˜ëŠ” C++ í´ëž˜ìŠ¤ì˜ lua ì´ì‹ì€ ìƒë‹¹ížˆ 귀찮으므로 ì´ì •ë„ë¡œë„ ê´œì°®ì„듯...
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include <string>
#include <iostream>
#include <luabind/luabind.hpp>
#include <luabind/out_value_policy.hpp>
using namespace std;
using namespace luabind;
static const luaL_reg lualibs[] = {
{"base", luaopen_base},
{"table", luaopen_table},
{"io", luaopen_io},
{"string", luaopen_string},
{"math", luaopen_math},
{"debug", luaopen_debug},
{"loadlib", luaopen_loadlib},
{NULL, NULL}
};
static void openstdlibs (lua_State *l) {
const luaL_reg *lib = lualibs;
for (; lib->func; lib++) {
lib->func(l); /* open library */
lua_settop(l, 0); /* discard any results */
}
}
class baseclip {
public:
int x, y;
baseclip() {}
void get(int &x_, int &y_) { x_ = x; y_ = y; }
void set(int x_, int y_) { x = x_; y = y_; }
const char *type() {return "clip";}
};
int main(int argc, char **argv) {
lua_State *L = lua_open();
openstdlibs(L);
luabind::open(L);
module (L)
[
class_<baseclip>("clip")
.def(constructor<>())
.def("get", &baseclip::get, pure_out_value(_1) + pure_out_value(_2))
.def("set", &baseclip::set)
.def("type", &baseclip::type)
];
try {
lua_dostring(L,
"class 'testclip'(clip)\n"
"function testclip:__init() super() end\n"
"function testclip:type2() return 'testclip' end\n"
"function testclip:type() return clip.type(self)..'(ìƒì†ë²„ì „)' end\n"
"aa = testclip()\n"
"print(aa:type2())\n");
object aa_ = get_globals(L).at("aa");
cout << call_member<const char *>(aa_, "type2") << endl;
lua_dostring(L,
"print(aa:type())\n");
cout << call_member<const char *>(aa_, "type") << endl;
lua_dostring(L,
"aa:set(10, 20)\n"
"print(aa:get())\n");
}
catch (error &e) {
cout << e.what() << endl;
}
lua_close(L);
}
실행하면 다ìŒê³¼ ê°™ì´ ì‹¤í–‰ë©ë‹ˆë‹¤. C++ì—서 ìƒì†ëœ testclip í´ëž˜ìŠ¤ì˜ ì˜¤ë²„ë¼ì´ë”©ëœ type() 함수를 호출하는 ê²ƒì„ ì•Œ 수 있습니다. 마지막 10 20 ì¶œë ¥ì€ C++ í•¨ìˆ˜ì˜ ë§¤ê°œë³€ìˆ˜ë¥¼ 사용해서 ì—¬ëŸ¬ê°’ì„ ë°˜í™˜í•˜ëŠ” lua 함수 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 구성한 ì˜ˆì œìž…ë‹ˆë‹¤. (luabindì˜ out_value ì •ì±… 사용)
testclip testclip clip(ìƒì†ë²„ì „) clip(ìƒì†ë²„ì „) 10 20









![[http]](/wiki/imgs/http.png)
