Как связать необработанный указатель с Luabind
Я пытаюсь использовать luabind для связывания box2d, чтобы я мог использовать его в своих сценариях lua. Я столкнулся с проблемой, когда не могу связать сырые указатели с luabind. Ниже мой код:
luabind::module(luaState)[
luabind::class_<b2Shape>("b2Shape")
];
luabind::module(luaState)[
luabind::class_<b2PolygonShape, luabind::bases<b2Shape>>("b2PolygonShape")
.def(luabind::constructor<>())
.def("GetChildCount", &b2PolygonShape::GetChildCount)
.def("SetAsBox", (void (b2PolygonShape::*) (float32 hx, float32 hy) ) &b2PolygonShape::SetAsBox)
.def("SetAsBox", (void (b2PolygonShape::*) (float32 hx, float32 hy, const b2Vec2& center, float32 angle) ) &b2PolygonShape::SetAsBox)
.def("TestPoint", (void (b2PolygonShape::*) (const b2Transform& transform, const b2Vec2& p) ) &b2PolygonShape::TestPoint)
.def("ComputeAABB", (void (b2PolygonShape::*) (b2AABB* aabb, const b2Transform& transform, int32 childIndex) ) &b2PolygonShape::ComputeAABB)
.def("GetVertexCount", (void (b2PolygonShape::*) () ) &b2PolygonShape::GetVertexCount)
.def("GetVertex", (const b2Vec2& (b2PolygonShape::*) (int32 index) ) &b2PolygonShape::GetVertexCount)
.def("Validate", &b2PolygonShape::Validate)
];
luabind::module(luaState)[
luabind::class_<b2FixtureDef>("b2FixtureDef")
.def(luabind::constructor<>())
.def_readwrite("shape", &b2FixtureDef::shape)
.def_readwrite("friction", &b2FixtureDef::friction)
.def_readwrite("restitution", &b2FixtureDef::restitution)
.def_readwrite("density", &b2FixtureDef::density)
.def_readwrite("isSensor", &b2FixtureDef::isSensor)
.def_readwrite("filter", &b2FixtureDef::filter)
];
Вот мой код Луа:
local anchorBodyDef = b2BodyDef()
anchorBodyDef.position = b2Vec2(20.0, 0.0)
local anchorShape = b2PolygonShape()
anchorShape:SetAsBox(2.0, 0.5)
local anchorFixDef = b2FixtureDef()
anchorFixDef.shape = anchorShape
Каждый раз, когда я пытаюсь присвоить фигуру своему fixtureDef, используя anchorFixDef.shape = anchorShape
Луа выдает ошибку:
terminate called after throwing an instance of 'luabind::error'
what(): lua runtime error
Как бы вы связали что-то вроде const b2Shape* shape;
в luaBind, так как что-то вроде .def_readwrite("shape", &b2FixtureDef::shape)
дает мне проблемы. Я видел некоторый код в документах, который использует умные указатели в операторах связывания class_, но это не решило проблемы.
Благодарю.
1 ответ
Выставляя &shape
в качестве настраиваемого параметра вы пытаетесь назначить адрес (anchorShape
потому что это то, что есть) к объекту (shape
). &shape
часть синтаксиса может заставить вас думать, что вы можете изменить адрес shape
член, но это не возможно. Так как по адресу &shape
Вы должны написать весь объект типа shape
, но anchorFixDef.shape = anchorShape
оператор в lua просто делает присваивание указателя. Вот почему Луабинд задыхается.
У вас есть варианты:
Укажите для Lua установщик, например, для поля формы:
luabind::class_<b2FixtureDef>("b2FixtureDef") .property("shape", &b2FixtureDef::GetShape, b2FixtureDef::SetShape) .def_readwrite("friction", &b2FixtureDef::friction)
//assuming friction is a basic type and so onДелать
shape
указатель внутри b2Fixture.
Первый вариант гораздо предпочтительнее, поскольку позволяет избежать всех сложностей, связанных с управлением памятью указателя, и поэтому неплохо было бы обернуть членов класса.
Причина def_readwrite
работает для других членов, вероятно, потому, что они имеют простые базовые типы (я предполагаю что-то вроде float или int), которые имеют эквивалентный тип в Lua.