From 49b306ff0fd17df3b53b54b4ff57dfb455e99aed Mon Sep 17 00:00:00 2001 From: Jochum van der Ploeg Date: Mon, 2 May 2022 17:31:33 +0200 Subject: [PATCH] fix: plunger on mobile (#259) * fix: plunger on mobile * fix: plunger on mobile * fix: plunger on mobile --- lib/game/pinball_game.dart | 13 +---- .../lib/src/components/plunger.dart | 23 +++++++++ .../test/src/components/plunger_test.dart | 27 ++++++++++ test/game/pinball_game_test.dart | 49 +------------------ 4 files changed, 54 insertions(+), 58 deletions(-) diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 41005886..f9018ee5 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -88,7 +88,7 @@ class PinballGame extends Forge2DGame // NOTE(wolfen): As long as Flame does not have https://github.com/flame-engine/flame/issues/1586 we need to check it at the highest level manually. if (bounds.contains(info.eventPosition.game.toOffset())) { - descendants().whereType().single.pull(); + descendants().whereType().single.pullFor(2); } else { final leftSide = info.eventPosition.widget.x < canvasSize.x / 2; focusedBoardSide = leftSide ? BoardSide.left : BoardSide.right; @@ -104,21 +104,12 @@ class PinballGame extends Forge2DGame @override void onTapUp(TapUpInfo info) { - final rocket = descendants().whereType().first; - final bounds = rocket.topLeftPosition & rocket.size; - - if (bounds.contains(info.eventPosition.game.toOffset())) { - descendants().whereType().single.release(); - } else { - _moveFlippersDown(); - } + _moveFlippersDown(); super.onTapUp(info); } @override void onTapCancel() { - descendants().whereType().single.release(); - _moveFlippersDown(); super.onTapCancel(); } diff --git a/packages/pinball_components/lib/src/components/plunger.dart b/packages/pinball_components/lib/src/components/plunger.dart index fa81c783..79b370a0 100644 --- a/packages/pinball_components/lib/src/components/plunger.dart +++ b/packages/pinball_components/lib/src/components/plunger.dart @@ -68,6 +68,14 @@ class Plunger extends BodyComponent with InitialPosition, Layered, ZIndex { return body; } + var _pullingDownTime = 0.0; + + /// Pulls the plunger down for the given amount of [seconds]. + // ignore: use_setters_to_change_properties + void pullFor(double seconds) { + _pullingDownTime = seconds; + } + /// Set a constant downward velocity on the [Plunger]. void pull() { body.linearVelocity = Vector2(0, 7); @@ -79,11 +87,26 @@ class Plunger extends BodyComponent with InitialPosition, Layered, ZIndex { /// The velocity's magnitude depends on how far the [Plunger] has been pulled /// from its original [initialPosition]. void release() { + _pullingDownTime = 0; final velocity = (initialPosition.y - body.position.y) * 11; body.linearVelocity = Vector2(0, velocity); _spriteComponent.release(); } + @override + void update(double dt) { + // Ensure that we only pull or release when the time is greater than zero. + if (_pullingDownTime > 0) { + _pullingDownTime -= dt; + if (_pullingDownTime <= 0) { + release(); + } else { + pull(); + } + } + super.update(dt); + } + /// Anchors the [Plunger] to the [PrismaticJoint] that controls its vertical /// motion. Future _anchorToJoint() async { diff --git a/packages/pinball_components/test/src/components/plunger_test.dart b/packages/pinball_components/test/src/components/plunger_test.dart index eafc15d5..abb42d68 100644 --- a/packages/pinball_components/test/src/components/plunger_test.dart +++ b/packages/pinball_components/test/src/components/plunger_test.dart @@ -121,6 +121,33 @@ void main() { ); }); + group('pullFor', () { + late Plunger plunger; + + setUp(() { + plunger = Plunger( + compressionDistance: compressionDistance, + ); + }); + + flameTester.testGameWidget( + 'moves downwards for given period when pullFor is called', + setUp: (game, tester) async { + await game.ensureAdd(plunger); + }, + verify: (game, tester) async { + plunger.pullFor(2); + game.update(0); + + expect(plunger.body.linearVelocity.y, isPositive); + + await tester.pump(const Duration(seconds: 2)); + + expect(plunger.body.linearVelocity.y, isZero); + }, + ); + }); + group('pull', () { late Plunger plunger; diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 8d76e8f0..732c2d82 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -414,54 +414,9 @@ void main() { game.onTapDown(tapDownEvent); - expect(plunger.body.linearVelocity.y, equals(7)); - }); - - flameTester.test('tap up releases plunger', (game) async { - final eventPosition = MockEventPosition(); - when(() => eventPosition.game).thenReturn(Vector2(40, 60)); - - final raw = MockTapDownDetails(); - when(() => raw.kind).thenReturn(PointerDeviceKind.touch); - - final tapDownEvent = MockTapDownInfo(); - when(() => tapDownEvent.eventPosition).thenReturn(eventPosition); - when(() => tapDownEvent.raw).thenReturn(raw); - - final plunger = game.descendants().whereType().first; - game.onTapDown(tapDownEvent); - - expect(plunger.body.linearVelocity.y, equals(7)); - - final tapUpEvent = MockTapUpInfo(); - when(() => tapUpEvent.eventPosition).thenReturn(eventPosition); - - game.onTapUp(tapUpEvent); - - expect(plunger.body.linearVelocity.y, equals(0)); - }); - - flameTester.test('tap cancel releases plunger', (game) async { - await game.ready(); - - final eventPosition = MockEventPosition(); - when(() => eventPosition.game).thenReturn(Vector2(40, 60)); - - final raw = MockTapDownDetails(); - when(() => raw.kind).thenReturn(PointerDeviceKind.touch); - - final tapDownEvent = MockTapDownInfo(); - when(() => tapDownEvent.eventPosition).thenReturn(eventPosition); - when(() => tapDownEvent.raw).thenReturn(raw); - - final plunger = game.descendants().whereType().first; - game.onTapDown(tapDownEvent); - - expect(plunger.body.linearVelocity.y, equals(7)); - - game.onTapCancel(); + game.update(1); - expect(plunger.body.linearVelocity.y, equals(0)); + expect(plunger.body.linearVelocity.y, isPositive); }); }); });