lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Hello ! I am kinda new to lua and programming in general . I have a
question about one part of the following code :

//------------------------------------------------------------------------------------
class Monster {

	public:

		Monster (int h) {
			hp = h;
		}

		~Monster () {
			// ...
		}

		void rawr () {
			std::cout << "Gonna eat you !" << std::endl;
		}

		int hp;
};
//------------------------------------------------------------------------------------
int monster_create (lua_State * ls)
{
	int a = lua_tointeger(ls,-1);
	Monster * monster = new (lua_newuserdata(ls, sizeof(Monster))) Monster (a);
	luaL_getmetatable(ls, "MetaMonster");
        lua_setmetatable(ls, -2);

	return 1;
}
//------------------------------------------------------------------------------------
int monster_rawr (lua_State * ls)
{
	luaL_checktype(ls, -1, LUA_TUSERDATA);
	Monster * monster = reinterpret_cast<Monster*>(lua_touserdata(ls, 1));
	monster->rawr();

	return 0;
}
//------------------------------------------------------------------------------------
static const luaL_reg Monster_funcs[] =
{
    {"create", monster_create},
    {0, 0}
};
//------------------------------------------------------------------------------------
static const luaL_reg Monster_methods[] =
{
	{"rawr", monster_rawr},
	{"greet", monster_greet},
	{"jump", monster_jump},
    {0, 0}
};
//------------------------------------------------------------------------------------
//The following is in main.cpp !

	lua_State* ls = lua_open (ls);
	luaL_openlibs (ls);

	luaL_newmetatable(ls, "MetaMonster");
	lua_pushstring(ls, "__index");
	lua_pushvalue(ls, -2);

	lua_settable(ls, -3);
	
	luaL_openlib(ls, 0, Monster_methods, 0);
	luaL_openlib(ls, "Monster", Monster_funcs, 0);

	luaL_dofile (ls,"new.lua");
//------------------------------------------------------------------------------------

The following code runs perfectly fine ! But i have one question :
Can someone explain me the following lines:

	luaL_newmetatable(ls, "MetaMonster");
	lua_pushstring(ls, "__index");
	lua_pushvalue(ls, -2);

	lua_settable(ls, -3);

I mean why they are used ? What they achieve ? Why they are needed ?!

I am obvioulsy new to this and the code is NOT mine (dah !) ....

Thank you all in advance !!!