C++ 二维实体的生成
我在一起抚养孩子时遇到了一些问题。当我将多个夹具连接到一个实体时,似乎会在内存管理中产生问题。这在冲突期间发生,因此使用XCode时,我会收到以下错误消息: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
*** 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:
将其作为夹具直接连接到车身上。我认为你将不得不创造,摧毁旧的身体,并创造一套新的装置只是为了这个
这有用吗