Commit ab104c80 authored by Viktor Lidholt's avatar Viktor Lidholt

Handle removal of sprite physics bodies during the physics simulation

parent 071201a5
......@@ -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) {
......
......@@ -120,7 +120,7 @@ class PhysicsBody {
void _detach() {
if (_attached) {
_physicsNode.b2World.destroyBody(_body);
_physicsNode._bodiesScheduledForDestruction.add(_body);
_attached = false;
}
}
......
......@@ -31,6 +31,8 @@ class PhysicsNode extends Node {
_ContactHandler _contactHandler;
List<box2d.Body> _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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment