From 7febbfc70fd3b887504cfa28315b3a9263a14f87 Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Fri, 16 Oct 2015 10:18:35 -0700 Subject: [PATCH 1/2] Correctly resets targets for kinematic sprite physics bodies --- packages/flutter_sprites/lib/src/physics_node.dart | 7 +++++++ 1 file changed, 7 insertions(+) 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 From 23bae330771723e0af0c652d44e3181751d40d50 Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Fri, 16 Oct 2015 10:19:25 -0700 Subject: [PATCH 2/2] Adds teleporting methods for moving sprite kinematic physics bodies without assigning velocities --- packages/flutter_sprites/lib/src/node.dart | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) 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;