From f916e30f3802b0778062d4df369e92da4e871536 Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Fri, 11 Mar 2022 16:43:46 -0300 Subject: [PATCH] feat: improving bonus letters grouping --- .../{bonus_letter.dart => bonus_word.dart} | 34 +++++++++++++++++-- lib/game/components/components.dart | 2 +- lib/game/pinball_game.dart | 24 ++++++------- pubspec.lock | 14 ++++---- pubspec.yaml | 13 +++---- ..._letter_test.dart => bonus_word_test.dart} | 33 +++++++++++++++--- 6 files changed, 83 insertions(+), 37 deletions(-) rename lib/game/components/{bonus_letter.dart => bonus_word.dart} (78%) rename test/game/components/{bonus_letter_test.dart => bonus_word_test.dart} (86%) diff --git a/lib/game/components/bonus_letter.dart b/lib/game/components/bonus_word.dart similarity index 78% rename from lib/game/components/bonus_letter.dart rename to lib/game/components/bonus_word.dart index cc17e0dd..a77ea7c6 100644 --- a/lib/game/components/bonus_letter.dart +++ b/lib/game/components/bonus_word.dart @@ -1,5 +1,7 @@ // ignore_for_file: avoid_renaming_method_parameters +import 'dart:async'; + import 'package:flame/components.dart'; import 'package:flame/effects.dart'; import 'package:flame_bloc/flame_bloc.dart'; @@ -7,6 +9,34 @@ import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; +/// {@template bonus_word} +/// A component that controls the bonus word feature +/// {@endtemplate} +class BonusWord extends Component { + /// {@macro bonus_word} + BonusWord({required Vector2 position}) : _position = position; + + final Vector2 _position; + + @override + Future onLoad() async { + await super.onLoad(); + final letters = GameBloc.bonusWord.split(''); + + for (var i = 0; i < letters.length; i++) { + unawaited( + add( + BonusLetter( + position: _position - Vector2(16 - (i * 6), -30), + letter: letters[i], + index: i, + ), + ), + ); + } + } +} + /// {@template bonus_letter} /// [BodyType.static] sensor component, part of a word bonus, /// which will activate its letter after contact with a [Ball]. @@ -93,8 +123,8 @@ class BonusLetter extends BodyComponent } } -/// Triggers [activate] method when a [BonusLetter] and a [Ball] come in -/// contact. +/// Triggers [BonusLetter.activate] method when a [BonusLetter] and a [Ball] +// come in contact. class BonusLetterBallContactCallback extends ContactCallback { @override diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index c1502fbb..9a18c0a0 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -1,7 +1,7 @@ export 'anchor.dart'; export 'ball.dart'; export 'board_side.dart'; -export 'bonus_letter.dart'; +export 'bonus_word.dart'; export 'flipper.dart'; export 'pathway.dart'; export 'plunger.dart'; diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 09fba8ec..669c5276 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -43,22 +43,20 @@ class PinballGame extends Forge2DGame addContactCallback(BottomWallBallContactCallback()); unawaited(_addFlippers()); - _addBonusLetters(); - addContactCallback(BonusLetterBallContactCallback()); - } - void _addBonusLetters() { - final letters = 'GOOGLE'.split(''); - - for (var i = 0; i < letters.length; i++) { + unawaited( add( - BonusLetter( - position: ballStartingPosition - Vector2(16 - (i * 6), -10), - letter: letters[i], - index: i, + BonusWord( + position: screenToWorld( + Vector2( + camera.viewport.effectiveSize.x / 2, + camera.viewport.effectiveSize.y - 20, + ), + ), ), - ); - } + ), + ); + addContactCallback(BonusLetterBallContactCallback()); } Future _addFlippers() async { diff --git a/pubspec.lock b/pubspec.lock index 9bf44ab0..8ff31de7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -140,23 +140,21 @@ packages: name: flame url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-releasecandidate.3" + version: "1.1.0-releasecandidate.4" flame_bloc: dependency: "direct main" description: name: flame_bloc url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-releasecandidate.2" + version: "1.2.0-releasecandidate.4" flame_forge2d: dependency: "direct main" description: - path: "packages/flame_forge2d" - ref: "spydon.body-component-no-debug-render" - resolved-ref: "70ec2d164f6067c6cf8ba173db159f5a9a3a89ff" - url: "git@github.com:flame-engine/flame.git" - source: git - version: "0.9.0-releasecandidate.3" + name: flame_forge2d + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.0-releasecandidate.4" flame_test: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 7b02eede..39b93fe7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,20 +9,15 @@ environment: dependencies: bloc: ^8.0.2 equatable: ^2.0.3 - flame: ^1.1.0-releasecandidate.2 - flame_bloc: ^1.2.0-releasecandidate.2 - #flame_forge2d: ^0.9.0-releasecandidate.2 - flame_forge2d: - git: - url: git@github.com:flame-engine/flame.git - path: packages/flame_forge2d - ref: spydon.body-component-no-debug-render + flame: ^1.1.0-releasecandidate.4 + flame_bloc: ^1.2.0-releasecandidate.4 + flame_forge2d: ^0.9.0-releasecandidate.4 flutter: sdk: flutter flutter_bloc: ^8.0.1 flutter_localizations: sdk: flutter - geometry: + geometry: path: packages/geometry intl: ^0.17.0 pinball_theme: diff --git a/test/game/components/bonus_letter_test.dart b/test/game/components/bonus_word_test.dart similarity index 86% rename from test/game/components/bonus_letter_test.dart rename to test/game/components/bonus_word_test.dart index 9124bc53..55c6c524 100644 --- a/test/game/components/bonus_letter_test.dart +++ b/test/game/components/bonus_word_test.dart @@ -13,6 +13,21 @@ import '../../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); + group('BonusWord', () { + final flameTester = FlameTester(PinballGameTest.create); + + flameTester.test( + 'loads the letters correctly', + (game) async { + await game.ready(); + + final bonusWord = game.children.whereType().first; + final letters = bonusWord.children.whereType(); + expect(letters.length, equals(GameBloc.bonusWord.length)); + }, + ); + }); + group('BonusLetter', () { final flameTester = FlameTester(PinballGameTest.create); @@ -113,6 +128,15 @@ void main() { group('bonus letter activation', () { final gameBloc = MockGameBloc(); + BonusLetter _getBonusLetter(PinballGame game) { + return game.children + .whereType() + .first + .children + .whereType() + .first; + } + setUp(() { whenListen( gameBloc, @@ -128,7 +152,8 @@ void main() { (game, tester) async { await game.ready(); - game.children.whereType().first.activate(); + _getBonusLetter(game).activate(); + await tester.pump(); verify(() => gameBloc.add(const BonusLetterActivated(0))).called(1); @@ -151,7 +176,7 @@ void main() { ); await game.ready(); - game.children.whereType().first.activate(); + _getBonusLetter(game).activate(); await game.ready(); // Making sure that all additions are done verifyNever(() => gameBloc.add(const BonusLetterActivated(0))); @@ -171,7 +196,7 @@ void main() { bonusHistory: [], ); - final bonusLetter = game.children.whereType().first; + final bonusLetter = _getBonusLetter(game); bonusLetter.onNewState(state); await tester.pump(); @@ -196,7 +221,7 @@ void main() { bonusHistory: [], ); - final bonusLetter = game.children.whereType().first; + final bonusLetter = _getBonusLetter(game); expect( bonusLetter.listenWhen(const GameState.initial(), state),