[英]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.