Как связать необработанный указатель с Luabind

0

Я пытаюсь использовать 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)
];

Вот мой код lua:

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, lua выдает ошибку:

terminate called after throwing an instance of 'luabind::error'
what():  lua runtime error

Как бы вы const b2Shape* shape; привязывать что-то вроде const b2Shape* shape; в luaBind, так как что-то вроде .def_readwrite("shape", &b2FixtureDef::shape) дает мне проблемы. Я видел некоторый код в документах, которые используют интеллектуальные указатели в операторах привязки класса_, но это не устранило проблемы.

Благодарю.

Теги:
pointers
lua
box2d
luabind

1 ответ

0

Выставляя &shape как устанавливаемый параметр, вы пытаетесь назначить адрес (anchorShape, потому что это то, что есть) для объекта (shape). Синтаксис &shape может заставлять вас думать, что вам разрешено изменять адрес члена shape, но это невозможно. Поскольку по адресу &shape вы должны написать весь объект shape типа, но anchorFixDef.shape = anchorShape в lua просто выполняет назначение указателя. Вот почему luabind задыхается.

У вас есть варианты:

  1. Предоставьте установщик 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

  2. Сделайте shape указателем внутри b2Fixture.

Первое гораздо предпочтительнее, поскольку оно позволяет избежать всех осложнений, связанных с управлением памятью указателей, и хорошо, почему нужно завершать членов класса.

Причина def_readwrite работает для других членов, вероятно, потому, что у них простые базовые типы (я предполагаю что-то вроде float или int), которые имеют эквивалентный тип в Lua.

  • 0
    Я исследую первый пункт, но форма уже является указателем в b2Fixture. Это то, что я пытаюсь связать. code.google.com/p/box2d/source/browse/trunk/Box2D/Box2D/...
  • 0
    @ Солнце, я размышляю здесь. Возможно, что luabind поддерживает присваивания только через readwrite для «известных» типов. И указатель является «неизвестным» типом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню