簡體   English   中英

育兒Box2D實體

[英]Parenting Box2D bodies

我在育兒方面遇到了一些問題。 當我將多個固定裝置附着到主體時,似乎在內存管理中產生了問題。 這是在沖突期間發生的,因此使用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

由於我是在物理引擎的上下文中,因此我假設存在一種在對象之間創建父子關系的方法。 我可以簡單地從物理世界中分離該對象(例如先前掉落的對象)並將其視為純Sprite游戲對象。 這涉及很多往復(例如,回到物理世界時重新創建固定裝置/實體)。 這是我的代碼:

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 ++沒有內置引用計數系統。 這也可能是問題所在。

如果您的目標是讓一個GameObject管理多個實體(即一群東西),那么讓單個GameObject維護多個實體的列表並管理它們。

但是,我相信您希望它們都像附着一樣移動。 據我所知,只有兩種方法可以使兩個物體表現為“一個”。

選項#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);
}

您也可以使用焊接接頭。

但是 ,按照手冊,使用焊接接頭不會產生“剛性”連接。 它具有一定的柔韌性,因為在碰撞過程中需要滿足約束條件。

從手冊:

焊接接頭試圖限制兩個實體之間的所有相對運動。 請參見測試平台中的Cantilever.h,以查看焊接接頭的行為。 使用焊接接頭來定義易碎結構是很誘人的。 但是,Box2D解算器是迭代的,因此關節有點軟。 因此,通過焊接接頭連接的實體鏈將彎曲。 相反,最好是從具有多個固定裝置的單個主體開始創建易碎的主體。 身體破裂時,您可以銷毀燈具並將其重新創建在新的物體上。 請參閱測試平台中的Breakable示例。

我沒有嘗試測試它,也沒有看到其他關節類型有多“僵硬”。 當我使用棱柱形接頭時,對我來說似乎很牢固。 但是它有時會在碰撞過程中被“推入”。

選項2:將其作為固定裝置直接連接到主體。 我認為您將不得不為此創造毀滅性的身體並創建一套新的固定裝置。

這個有幫助嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM