diff --git a/lib/game/components/flipper.dart b/lib/game/components/flipper.dart index 0691da34..f60732b4 100644 --- a/lib/game/components/flipper.dart +++ b/lib/game/components/flipper.dart @@ -187,4 +187,28 @@ class FlipperAnchorRevoluteJointDef extends RevoluteJointDef { /// The total angle of the arc motion. static const _sweepingAngle = math.pi / 7; + + /// Unlocks the [Flipper] from its resting position. + /// + /// The [Flipper] is locked when initialized in order to force it to be at + /// its resting position. + // TODO(alestiago): consider refactor once the issue is solved: + // https://github.com/flame-engine/forge2d/issues/36 + static void unlock(RevoluteJoint joint) { + assert(joint.bodyA is Flipper && joint.bodyB is Anchor, 'Invalid joint.'); + final flipper = joint.bodyA as Flipper; + + late final double upperLimit, lowerLimit; + switch (flipper.side) { + case BoardSide.left: + lowerLimit = joint.lowerLimit * -1; + upperLimit = joint.upperLimit; + break; + case BoardSide.right: + lowerLimit = joint.lowerLimit; + upperLimit = joint.upperLimit * -1; + } + + joint.setLimits(lowerLimit, upperLimit); + } } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 64db9c5d..21c291f4 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -82,14 +82,8 @@ class PinballGame extends Forge2DGame with FlameBloc, KeyboardEvents { await _leftFlipper.hasMounted.future; await _rightFlipper.hasMounted.future; - _leftFlipperRevoluteJoint.setLimits( - _leftFlipperRevoluteJoint.lowerLimit * -1, - _leftFlipperRevoluteJoint.upperLimit, - ); - _rightFlipperRevoluteJoint.setLimits( - _rightFlipperRevoluteJoint.lowerLimit, - _rightFlipperRevoluteJoint.upperLimit * -1, - ); + FlipperAnchorRevoluteJointDef.unlock(_leftFlipperRevoluteJoint); + FlipperAnchorRevoluteJointDef.unlock(_rightFlipperRevoluteJoint); } @override