diff --git a/examples/game/test_physics.dart b/examples/game/test_physics.dart index a7c23f9b117..2a9ad884ac0 100644 --- a/examples/game/test_physics.dart +++ b/examples/game/test_physics.dart @@ -83,6 +83,7 @@ class TestBed extends NodeWithSize { void myCallback(PhysicsContactType type, PhysicsContact contact) { print("CONTACT type: $type"); + contact.nodeB.removeFromParent(); } bool handleEvent(SpriteBoxEvent event) { diff --git a/packages/flutter_sprites/lib/physics_body.dart b/packages/flutter_sprites/lib/physics_body.dart index 99c8ea426e7..e9446b65e1f 100644 --- a/packages/flutter_sprites/lib/physics_body.dart +++ b/packages/flutter_sprites/lib/physics_body.dart @@ -120,7 +120,7 @@ class PhysicsBody { void _detach() { if (_attached) { - _physicsNode.b2World.destroyBody(_body); + _physicsNode._bodiesScheduledForDestruction.add(_body); _attached = false; } } diff --git a/packages/flutter_sprites/lib/physics_node.dart b/packages/flutter_sprites/lib/physics_node.dart index bc19c6adbdf..12ea4f8531b 100644 --- a/packages/flutter_sprites/lib/physics_node.dart +++ b/packages/flutter_sprites/lib/physics_node.dart @@ -31,6 +31,8 @@ class PhysicsNode extends Node { _ContactHandler _contactHandler; + List _bodiesScheduledForDestruction = []; + double b2WorldToNodeConversionFactor = 500.0; Offset get gravity { @@ -57,6 +59,9 @@ class PhysicsNode extends Node { } void _stepPhysics(double dt) { + // Remove bodies that were marked for destruction during the update phase + _removeBodiesScheduledForDestruction(); + // Calculate a step in the simulation b2World.stepDt(dt, 10, 10); @@ -71,6 +76,16 @@ class PhysicsNode extends Node { body._node._setRotationFromPhysics(degrees(b2Body.getAngle())); } + + // Remove bodies that were marked for destruction during the simulation + _removeBodiesScheduledForDestruction(); + } + + void _removeBodiesScheduledForDestruction() { + for (box2d.Body b2Body in _bodiesScheduledForDestruction) { + b2World.destroyBody(b2Body); + } + _bodiesScheduledForDestruction.clear(); } void _updatePosition(PhysicsBody body, Point position) { @@ -257,6 +272,11 @@ class _ContactHandler extends box2d.ContactListener { b2Contact.isTouching(), b2Contact.isEnabled() ); + + if (type == PhysicsContactType.postSolve) { + + } + // Make callback info.callback(type, contact);