U E D R S I H C RSS
ID
Password
Join
먹는 ê²ƒì— ëŒ€í•œ 사랑보다 ë” ê±°ì§“ 없는 ì‚¬ëž‘ì€ ì—†ë‹¤. ―조지 버나드 쇼

[[Include(분류/lua)]]

Contents

1 lua
2 C++
2.1 luaìƒì˜ class 맴버함수 호출하기
2.2 enum 테스트
2.3 luaìƒì˜ 함수ê°ì²´ë¥¼ 콜백으로 간주하고 C++ìƒì—서 실행하기
2.4 C++ í´ëž˜ìŠ¤ë¥¼ ìƒì†í•œ lua í´ëž˜ìŠ¤ë¥¼ 다시 C++ì—서 호출하기
  • ìƒë‹¹ížˆ ê´œì°®ì€ í…œí”Œë¦¿ ë¼ì´ë¸ŒëŸ¬ë¦¬ìž…니다. luaì— í´ëž˜ìФ ê¸°ëŠ¥ì„ ë”해주는 ê²ƒë§Œí•´ë„ ê°’ì–´ì¹˜ê°€ 있죠. :) ì›ëž˜ 언어가 C로 ë˜ì–´ìžˆì–´ ì •ì‹ê¸°ëŠ¥ìœ¼ë¡œ 들어갈지는 ì˜ë¬¸ì´ì§€ë§Œ... ì§€ê¸ˆë§Œìœ¼ë¡œë„ ê´œì°®ì„ ê²ƒ 같습니다.

1 lua #


2 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

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.4039 sec