Я обнаружил, Luabridge очень удобно при выполнении этих задач.Это библиотека только для заголовков, которая работает со старым кодом C ++ (до c ++ 11 и после).
Вы не программируете непосредственно для стека Lua, вместо этого вы включаете обычный класс / структуру в определение связывания.
Код привязки выглядит примерно так:
getGlobalNamespace(L).beginNamespace("GameFrameworkName")
.beginClass<RectF>("Rect")
.addStaticFunction("__call", &RectF_Ctor) // Constructor from Table!
.addData<float>("x", &RectF::x)
.addData<float>("y", &RectF::y)
.addData<float>("width", &RectF::width)
.addData<float>("height", &RectF::height)
.addFunction("Union", &RectF::Union)
.addFunction("Intersects", (bool (RectF::*)(const RectF&)) &RectF::Intersects)
.addFunction("Intersection", &RectF::Intersection)
.addFunction("Contains", (bool (RectF::*)(const PointF&)) &RectF::Contains)
.addFunction("Offset", (void (RectF::*)(const PointF&)) &RectF::Offset)
.addFunction("Inflate", (void (RectF::*)(float, float)) &RectF::Inflate)
.addFunction("__tostring", &RectF_ToString)
.addFunction("__eq", (bool (RectF::*)(const RectF&)) &RectF::operator==)
.addFunction("Copy", &RectF_Copy)
.endClass()
.beginClass<PointF>("Point")
.addStaticFunction("__call", &PointF_Ctor) // Constructor from Table!
.addData<float>("x", &PointF::x)
.addData<float>("y", &PointF::y)
.addFunction("__tostring", &PointF_ToString)
.addFunction("__add", (PointF (PointF::*)(const PointF&)) &PointF::operator+ )
.addFunction("__sub", &PointF_SubtractOperator )
.addFunction("__mul", &PointF_MultiplyOperator )
.addFunction("__div", &PointF_DivideOperator )
.addFunction("__eq", (bool (PointF::*)(const PointF&)) &PointF::operator==)
.addFunction("__unm", &PointF_Unm)
.addFunction("Copy", &PointF_Copy)
.endClass()
.endNamespace();
Для игровых объектов я обычно управляю временем жизни в C ++ и просто передаю указатели Lua.Luabind позволяет вам переопределить Lua CTor (__call) и ~ Tor (__gc).Вот мои копии:
template<typename T>
std::string DoNotCreate()
{
DBG_ASSERT(false); // Do not try to create a new instance of this type
return StrFormat("ERROR: Lua cannot create an instance of %s.", typeid(T).name());
}
///////////////////////////////////////
// \brief Do Not Allow Lua or Luabridge to delete us
void DoNotGarbageCollect(void*) {}
И их использование:
.deriveClass<Sprite, DisplayObject>("Sprite")
.addStaticFunction("__call", &DoNotCreate<Sprite>)
.addFunction("__gc", (void (*) (Sprite*)) &DoNotGarbageCollect)
Для вызова Lua Code из C ++ вы используете LuaRefs, которые (IIRC) в основном являются вариантами, которые могут быть любым типом Lua.
Если вам интересно, я нашел Zerobrane хорошим отладчиком, вам просто нужно добавить библиотеки lua для сокетов