diff --git a/packages/flutter_sprites/lib/src/node.dart b/packages/flutter_sprites/lib/src/node.dart index e3151585a7..13b98427a8 100644 --- a/packages/flutter_sprites/lib/src/node.dart +++ b/packages/flutter_sprites/lib/src/node.dart @@ -148,6 +148,16 @@ class Node { invalidateTransformMatrix(); } + void teleportRotation(double rotation) { + assert(rotation != null); + if (_physicsBody != null && parent is PhysicsNode) { + _physicsBody._body.setTransform(_physicsBody._body.position, radians(rotation)); + _physicsBody._body.angularVelocity = 0.0; + _physicsBody._body.setType(box2d.BodyType.STATIC); + } + _setRotationFromPhysics(rotation); + } + /// The position of this node relative to its parent. /// /// myNode.position = new Point(42.0, 42.0); @@ -172,6 +182,23 @@ class Node { invalidateTransformMatrix(); } + void teleportPosition(Point position) { + assert(position != null); + if (_physicsBody != null && parent is PhysicsNode) { + PhysicsNode physicsNode = parent; + _physicsBody._body.setTransform( + new Vector2( + position.x / physicsNode.b2WorldToNodeConversionFactor, + position.y / physicsNode.b2WorldToNodeConversionFactor + ), + _physicsBody._body.getAngle() + ); + _physicsBody._body.linearVelocity = new Vector2.zero(); + _physicsBody._body.setType(box2d.BodyType.STATIC); + } + _setPositionFromPhysics(position); + } + /// The skew along the x-axis of this node in degrees. /// /// myNode.skewX = 45.0; diff --git a/packages/flutter_sprites/lib/src/physics_node.dart b/packages/flutter_sprites/lib/src/physics_node.dart index 12685c0c5c..004917433f 100644 --- a/packages/flutter_sprites/lib/src/physics_node.dart +++ b/packages/flutter_sprites/lib/src/physics_node.dart @@ -112,6 +112,13 @@ class PhysicsNode extends Node { for (box2d.Body b2Body = b2World.bodyList; b2Body != null; b2Body = b2Body.getNext()) { // Update visual position and rotation PhysicsBody body = b2Body.userData; + + if (b2Body.getType() == box2d.BodyType.KINEMATIC) { + body._targetPosition = null; + body._targetAngle = null; + } + + // Update visual position and rotation body._node._setPositionFromPhysics(new Point( b2Body.position.x * b2WorldToNodeConversionFactor, b2Body.position.y * b2WorldToNodeConversionFactor