From 6aaac0a9421aa6cdb096890a1f1f40d351b8a8cc Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Fri, 1 Apr 2022 15:01:16 +0200 Subject: [PATCH] feat: added previewline and ball booster in DebugGame --- lib/game/pinball_game.dart | 67 ++++++++++++++++++- .../lib/stories/ball/ball_booster.dart | 2 +- test/game/pinball_game_test.dart | 48 ++++++++++++- test/helpers/mocks.dart | 6 ++ 4 files changed, 120 insertions(+), 3 deletions(-) diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index b5162053..d9365441 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -6,6 +6,7 @@ import 'package:flame/extensions.dart'; import 'package:flame/input.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball/gen/assets.gen.dart'; import 'package:pinball_components/pinball_components.dart' hide Assets; @@ -109,11 +110,16 @@ class PinballGame extends Forge2DGame } } -class DebugPinballGame extends PinballGame with TapDetector { +class DebugPinballGame extends PinballGame with TapDetector, PanDetector { DebugPinballGame({required PinballTheme theme}) : super(theme: theme); + Vector2? lineStart; + Vector2? lineEnd; + @override Future onLoad() async { + unawaited(add(PreviewLine())); + await super.onLoad(); await _loadBackground(); } @@ -141,4 +147,63 @@ class DebugPinballGame extends PinballGame with TapDetector { ControlledBall.debug()..initialPosition = info.eventPosition.game, ); } + + @override + void onPanStart(DragStartInfo info) { + lineStart = info.eventPosition.game; + } + + @override + void onPanUpdate(DragUpdateInfo info) { + lineEnd = info.eventPosition.game; + } + + @override + void onPanEnd(DragEndInfo info) { + if (lineEnd != null) { + final line = lineEnd! - lineStart!; + onLine(line); + lineEnd = null; + lineStart = null; + } + } + + void onLine(Vector2 line) { + final ball = ControlledBall.debug()..initialPosition = lineStart!; + add(ball); + + ball.mounted.then((value) => ball.boost(line * 20)); + } +} + +class PreviewLine extends PositionComponent with HasGameRef { + static final _previewLinePaint = Paint() + ..color = Colors.pink + ..strokeWidth = 0.2 + ..style = PaintingStyle.stroke; + + Vector2? lineStart; + Vector2? lineEnd; + + @override + void update(double dt) { + super.update(dt); + + lineEnd = gameRef.lineEnd?.clone()?..multiply(Vector2(1, -1)); + } + + @override + void render(Canvas canvas) { + super.render(canvas); + + if (lineEnd != null) { + lineStart = gameRef.lineStart?.clone()?..multiply(Vector2(1, -1)); + + canvas.drawLine( + lineStart!.toOffset(), + lineEnd!.toOffset(), + _previewLinePaint, + ); + } + } } diff --git a/packages/pinball_components/sandbox/lib/stories/ball/ball_booster.dart b/packages/pinball_components/sandbox/lib/stories/ball/ball_booster.dart index 9f78953a..c5c4e477 100644 --- a/packages/pinball_components/sandbox/lib/stories/ball/ball_booster.dart +++ b/packages/pinball_components/sandbox/lib/stories/ball/ball_booster.dart @@ -11,6 +11,6 @@ class BallBoosterExample extends LineGame { final ball = Ball(baseColor: Colors.transparent); add(ball); - ball.mounted.then((value) => ball.boost(line * -1 * 20)); + ball.mounted.then((value) => ball.boost(line * 20)); } } diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 52008074..e31c8f31 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -13,7 +13,6 @@ void main() { group('PinballGame', () { TestWidgetsFlutterBinding.ensureInitialized(); final flameTester = FlameTester(PinballGameTest.create); - final debugModeFlameTester = FlameTester(DebugPinballGameTest.create); // TODO(alestiago): test if [PinballGame] registers // [BallScorePointsCallback] once the following issue is resolved: @@ -61,6 +60,10 @@ void main() { ); }); }); + }); + + group('DebugPinballGame', () { + final debugModeFlameTester = FlameTester(DebugPinballGameTest.create); debugModeFlameTester.test('adds a ball on tap up', (game) async { await game.ready(); @@ -79,5 +82,48 @@ void main() { equals(1), ); }); + + debugModeFlameTester.test('adds a ball on pan detection', (game) async { + await game.ready(); + + final eventStartPosition = MockEventPosition(); + when(() => eventStartPosition.game).thenReturn(Vector2.all(10)); + + final dragStartInfo = MockDragStartInfo(); + when(() => dragStartInfo.eventPosition).thenReturn(eventStartPosition); + + final eventUpdatePosition = MockEventPosition(); + when(() => eventUpdatePosition.game).thenReturn(Vector2.all(20)); + + final dragUpdateInfo = MockDragUpdateInfo(); + when(() => dragUpdateInfo.eventPosition).thenReturn(eventUpdatePosition); + + final dragEndInfo = MockDragEndInfo(); + + game.onPanStart(dragStartInfo); + game.onPanUpdate(dragUpdateInfo); + game.onPanEnd(dragEndInfo); + await game.ready(); + + final balls = game.children.whereType(); + expect( + balls.length, + equals(1), + ); + }); + + group('PreviewLine', () { + debugModeFlameTester.test( + 'loads correctly', + (game) async { + final previewLine = PreviewLine(); + + await game.ready(); + await game.ensureAdd(previewLine); + + expect(game.contains(previewLine), isTrue); + }, + ); + }); }); } diff --git a/test/helpers/mocks.dart b/test/helpers/mocks.dart index fbe8edfb..b2a52eef 100644 --- a/test/helpers/mocks.dart +++ b/test/helpers/mocks.dart @@ -58,6 +58,12 @@ class MockRawKeyUpEvent extends Mock implements RawKeyUpEvent { class MockTapUpInfo extends Mock implements TapUpInfo {} +class MockDragStartInfo extends Mock implements DragStartInfo {} + +class MockDragUpdateInfo extends Mock implements DragUpdateInfo {} + +class MockDragEndInfo extends Mock implements DragEndInfo {} + class MockEventPosition extends Mock implements EventPosition {} class MockBonusLetter extends Mock implements BonusLetter {}