C++ 二维实体的生成

C++ 二维实体的生成,c++,box2d,C++,Box2d,我在一起抚养孩子时遇到了一些问题。当我将多个夹具连接到一个实体时,似乎会在内存管理中产生问题。这在冲突期间发生,因此使用XCode时,我会收到以下错误消息: *** error for object 0xf572ef0: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to de

我在一起抚养孩子时遇到了一些问题。当我将多个夹具连接到一个实体时,似乎会在内存管理中产生问题。这在冲突期间发生,因此使用XCode时,我会收到以下错误消息:

 *** error for object 0xf572ef0: incorrect checksum for freed object - object was probably    modified after being freed.
 *** set a breakpoint in malloc_error_break to debug
当实体具有单个夹具时,不会发生这种情况

我试图实现的是,例如,如果一个角色拾取一个项目,转换将成为父对象的子对象。因此,我们将得到:

 Parent_R + Child_R
 Parent_P + Child_P
因为我处于物理引擎的环境中,所以我假设有一种方法可以在对象之间创建父/子关系。我可以简单地把这个物体从物理世界中分离出来(比如说之前掉下来的那个物体),并把它当作一个纯粹的精灵游戏物体。这涉及到相当多的来回操作(例如,当放回物理世界时,重新创建夹具/实体)。这是我的密码:

void GameObject::AttatchToBody(GameObject& obj1, GameObject& obj2, b2World& world)
{
    b2PolygonShape boxShape;
    boxShape.SetAsBox(obj2.width, obj2.height);

    b2FixtureDef boxFixtureDef;
    boxFixtureDef.restitution = 0.2f;
    boxFixtureDef.friction = 0.3f;
    boxFixtureDef.shape = &boxShape;
    boxFixtureDef.density = 1 / (obj2.width + obj2.height);

    obj2.fixture = obj1.body->CreateFixture(&boxFixtureDef);
    obj2.body = obj1.body;

}

非常感谢您的帮助

我在Box2d中没有看到任何父母关系,除了身体/固定装置关系

在我看来,obj1和obj2引用了同一个Box2d内存分配对象(主体)。例如,删除obj1时,可能会删除附加到它的主体(通过执行类似于world->DestroyBody(…)的操作)。在下一次box2d更新中,您将引用一个未分配且已告知要销毁的对象(到box2d系统)。这可能是问题所在吗

我还看到您在obj2和obj1之间共享一个夹具。当obj1被box2d系统回收时会发生什么情况(即,您破坏了obj1的身体)?这似乎并不正确……系统对你的育儿关系一无所知,C++没有内置的引用计数系统。这也可能是问题所在

如果你的目标是让一个游戏对象管理多个身体(即一群东西),那么让单个游戏对象维护多个身体的列表并管理所有身体

然而,我相信你希望他们都像被束缚一样移动。据我所知,只有两种方法可以使两个物体表现为“一”

选项#1: 第一种是在它们之间使用接头。我在一个游戏中这样做了,当时我让一艘宇宙飞船撞到一件武器上把它捡起来。当飞船这样做的时候,我创造了一个棱柱形的接头,这样火炮就会出现在飞船前面。这是我用来附加它的代码:

void BulletLauncherEntity::CreateJointConnection()
{
   Entity* owner = GetOwner();
   Body& ownerBody = owner->GetBody();

   // We put the position of this at the tip of the
   // owner.
   float32 launcherDist = 0.5*(owner->GetScale())*Constants::SCALE_TO_METERS_RATIO();
   float32 launcherSize = 0.5*GetScale()*Constants::SCALE_TO_METERS_RATIO();
   // Joint along axis of entity
   b2PrismaticJointDef jointDef;
   // Note that the "Initialize" function in the
   // jointDef did not really give us what we wanted.
    jointDef.bodyA = &ownerBody;
    jointDef.bodyB = &GetBody();
    jointDef.localAnchorA = Vec2(launcherDist-launcherSize,0);
    jointDef.localAnchorB = Vec2::Zero();
    jointDef.localAxisA = Vec2(1,0);
    jointDef.referenceAngle = 0;

   jointDef.lowerTranslation = -launcherDist;
   jointDef.upperTranslation = 0.5*GetScale()*Constants::SCALE_TO_METERS_RATIO();
   jointDef.enableLimit = true;
   jointDef.maxMotorForce = 2.0;
   jointDef.motorSpeed = 0.25;
   jointDef.enableMotor = true;
   jointDef.collideConnected = false;
   ownerBody.GetWorld()->CreateJoint(&jointDef);
}
也可以使用焊接接头

但是根据手册,使用焊接接头不会产生“刚性”连接。由于碰撞期间需要满足约束,因此它具有一定的柔软性

从手册中:

焊接接头尝试约束两个接头之间的所有相对运动 身体。参见试验台中的悬臂.h,以了解焊接接头 行为。使用焊接接头来定义易碎材料是很有诱惑力的 结构。但是,Box2D解算器是迭代的,因此关节是 有点软。因此,通过焊接接头连接的身体链将发生弯曲。 相反,最好从单个实体开始创建易碎实体 具有多个固定装置的车身。当身体破裂时,你可以摧毁一个 夹具,并在新实体上重新创建它。请参见中的易碎示例 试验台

我没有试过测试这一点,也没有看到其他关节类型有多“僵硬”。当我使用棱柱形接头时,我觉得它非常坚固。但在碰撞过程中,它确实偶尔会被“推入”

选项2: 将其作为夹具直接连接到车身上。我认为你将不得不创造,摧毁旧的身体,并创造一套新的装置只是为了这个

这有用吗