feat: improving bonus letters grouping

pull/35/head
Erick Zanardo 4 years ago
parent 6889a47e59
commit f916e30f38

@ -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<void> 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<PinballGame>
}
}
/// 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<Ball, BonusLetter> {
@override

@ -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';

@ -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<void> _addFlippers() async {

@ -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:

@ -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:

@ -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<BonusWord>().first;
final letters = bonusWord.children.whereType<BonusLetter>();
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<BonusWord>()
.first
.children
.whereType<BonusLetter>()
.first;
}
setUp(() {
whenListen(
gameBloc,
@ -128,7 +152,8 @@ void main() {
(game, tester) async {
await game.ready();
game.children.whereType<BonusLetter>().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<BonusLetter>().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<BonusLetter>().first;
final bonusLetter = _getBonusLetter(game);
bonusLetter.onNewState(state);
await tester.pump();
@ -196,7 +221,7 @@ void main() {
bonusHistory: [],
);
final bonusLetter = game.children.whereType<BonusLetter>().first;
final bonusLetter = _getBonusLetter(game);
expect(
bonusLetter.listenWhen(const GameState.initial(), state),
Loading…
Cancel
Save