我對box2d比較新,我使用的是box2dweb版本。我希望能夠發現運動物體何時退出舞臺的邊界。 Box2D.Dynamics.b2BoundaryListener是顯而易見的答案,但顯然不支持box2dweb build。在box2dweb中實現邊界監聽器
有沒有一種有效的方法來創建一個偵聽器,而不是在每次調用update()期間初始檢查每個body的座標?我嘗試使用靜態物體作爲傳感器,但它們不檢測運動物體。
我對box2d比較新,我使用的是box2dweb版本。我希望能夠發現運動物體何時退出舞臺的邊界。 Box2D.Dynamics.b2BoundaryListener是顯而易見的答案,但顯然不支持box2dweb build。在box2dweb中實現邊界監聽器
有沒有一種有效的方法來創建一個偵聽器,而不是在每次調用update()期間初始檢查每個body的座標?我嘗試使用靜態物體作爲傳感器,但它們不檢測運動物體。
據我所知,b2BoundaryListener是早期版本Box2D的一部分,並且由於Box2D世界不再具有邊界而被刪除。
您可以使用動態傳感器,因爲它們也可以檢測運動物體。 如果你的世界使用重力,你將不得不修復身體。
您可以通過施加抵抗重力的力或通過將這些動態傳感器主體通過接頭(例如焊接接頭)固定到靜態主體來做到這一點。
較新的Box2D的Javascript端口還包括setGravityScale方法,將允許您創建不受重力影響動態物體(如JSBox2D)
但我想手動更新這樣做可能是一個更好的主意,並應如果您使用b2AABB類,則會非常簡單。這會在邊界框超出邊界時移除對象。
你可以做類似如下(未經測試的代碼):
var body = world.GetBodyList();
while (body != null) {
var fixture = body.GetFixtureList();
var bodyIsInBounds = false;
while (fixture != null) {
// bounds AABB are your boundaries (as b2AABB object)
if (fixture.GetAABB().TestOverlap(boundsAABB)) {
bodyIsInBounds = true;
break;
}
fixture = fixture.GetNext();
}
if (!bodyIsInBounds) {
world.DestroyBody(body);
}
body = body.GetNext();
}
您可能還需要檢查b2AABB.Contains。我不確定如果boundsAABB完全包含另一個b2AABB對象,TestOverlap是否會返回true。