pull/187/head
Erick Zanardo 3 years ago
parent 6664cc6a86
commit 665f24163e

@ -1,6 +1,8 @@
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:pinball/flame/flame.dart'; import 'package:pinball/flame/flame.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
/// {@template controlled_flipper} /// {@template controlled_flipper}
@ -19,7 +21,7 @@ class ControlledFlipper extends Flipper with Controls<FlipperController> {
/// A [ComponentController] that controls a [Flipper]s movement. /// A [ComponentController] that controls a [Flipper]s movement.
/// {@endtemplate} /// {@endtemplate}
class FlipperController extends ComponentController<Flipper> class FlipperController extends ComponentController<Flipper>
with KeyboardHandler { with KeyboardHandler, BlocComponent<GameBloc, GameState> {
/// {@macro flipper_controller} /// {@macro flipper_controller}
FlipperController(Flipper flipper) FlipperController(Flipper flipper)
: _keys = flipper.side.flipperKeys, : _keys = flipper.side.flipperKeys,
@ -35,6 +37,7 @@ class FlipperController extends ComponentController<Flipper>
RawKeyEvent event, RawKeyEvent event,
Set<LogicalKeyboardKey> keysPressed, Set<LogicalKeyboardKey> keysPressed,
) { ) {
if (state?.isGameOver ?? false) return true;
if (!_keys.contains(event.logicalKey)) return true; if (!_keys.contains(event.logicalKey)) return true;
if (event is RawKeyDownEvent) { if (event is RawKeyDownEvent) {

@ -1,6 +1,8 @@
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:pinball/flame/flame.dart'; import 'package:pinball/flame/flame.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
/// {@template controlled_plunger} /// {@template controlled_plunger}
@ -18,7 +20,7 @@ class ControlledPlunger extends Plunger with Controls<PlungerController> {
/// A [ComponentController] that controls a [Plunger]s movement. /// A [ComponentController] that controls a [Plunger]s movement.
/// {@endtemplate} /// {@endtemplate}
class PlungerController extends ComponentController<Plunger> class PlungerController extends ComponentController<Plunger>
with KeyboardHandler { with KeyboardHandler, BlocComponent<GameBloc, GameState> {
/// {@macro plunger_controller} /// {@macro plunger_controller}
PlungerController(Plunger plunger) : super(plunger); PlungerController(Plunger plunger) : super(plunger);
@ -36,6 +38,7 @@ class PlungerController extends ComponentController<Plunger>
RawKeyEvent event, RawKeyEvent event,
Set<LogicalKeyboardKey> keysPressed, Set<LogicalKeyboardKey> keysPressed,
) { ) {
if (state?.isGameOver ?? false) return true;
if (!_keys.contains(event.logicalKey)) return true; if (!_keys.contains(event.logicalKey)) return true;
if (event is RawKeyDownEvent) { if (event is RawKeyDownEvent) {

@ -28,7 +28,11 @@ class GameFlowController extends ComponentController<PinballGame>
/// Puts the game on a game over state /// Puts the game on a game over state
void gameOver() { void gameOver() {
component.firstChild<Backboard>()?.gameOverMode(); // TODO(erickzanardo): implement score submission and "navigate" to the
// next page
component.firstChild<Backboard>()?.gameOverMode(
score: state?.score ?? 0,
);
component.firstChild<CameraController>()?.focusOnBackboard(); component.firstChild<CameraController>()?.focusOnBackboard();
} }

@ -41,7 +41,7 @@ class PinballGame extends Forge2DGame
unawaited(add(ScoreEffectController(this))); unawaited(add(ScoreEffectController(this)));
unawaited(add(gameFlowController = GameFlowController(this))); unawaited(add(gameFlowController = GameFlowController(this)));
unawaited(add(CameraController(this))); unawaited(add(CameraController(this)));
unawaited(add(Backboard(position: Vector2(0, -88)))); unawaited(add(Backboard.waiting(position: Vector2(0, -88))));
await _addGameBoundaries(); await _addGameBoundaries();
unawaited(addFromBlueprint(Boundaries())); unawaited(addFromBlueprint(Boundaries()));

@ -22,15 +22,6 @@ class Backboard extends PositionComponent with HasGameRef {
anchor: Anchor.bottomCenter, anchor: Anchor.bottomCenter,
); );
/// [TextPaint] used on the [Backboard]
static final textPaint = TextPaint(
style: TextStyle(
fontSize: 6,
color: Colors.white,
fontFamily: PinballFonts.pixeloidSans,
),
);
/// {@macro backboard} /// {@macro backboard}
/// ///
/// Returns a [Backboard] initialized in the waiting mode /// Returns a [Backboard] initialized in the waiting mode
@ -55,6 +46,15 @@ class Backboard extends PositionComponent with HasGameRef {
); );
} }
/// [TextPaint] used on the [Backboard]
static final textPaint = TextPaint(
style: TextStyle(
fontSize: 6,
color: Colors.white,
fontFamily: PinballFonts.pixeloidSans,
),
);
/// Puts the Backboard in waiting mode, where the scoreboard is shown. /// Puts the Backboard in waiting mode, where the scoreboard is shown.
Future<void> waitingMode() async { Future<void> waitingMode() async {
children.removeWhere((element) => true); children.removeWhere((element) => true);
@ -64,12 +64,14 @@ class Backboard extends PositionComponent with HasGameRef {
/// Puts the Backboard in game over mode, where the score input is shown. /// Puts the Backboard in game over mode, where the score input is shown.
Future<void> gameOverMode({ Future<void> gameOverMode({
required int score, required int score,
required BackboardOnSubmit onSubmit, BackboardOnSubmit? onSubmit,
}) async { }) async {
children.removeWhere((element) => true); children.removeWhere((element) => true);
await add(BackboardGameOver( await add(
score: score, BackboardGameOver(
onSubmit: onSubmit, score: score,
)); onSubmit: onSubmit,
),
);
} }
} }

@ -18,12 +18,12 @@ class BackboardGameOver extends PositionComponent with HasGameRef {
/// {@macro backboard_game_over} /// {@macro backboard_game_over}
BackboardGameOver({ BackboardGameOver({
required int score, required int score,
required BackboardOnSubmit onSubmit, BackboardOnSubmit? onSubmit,
}) : _score = score, }) : _score = score,
_onSubmit = onSubmit; _onSubmit = onSubmit;
final int _score; final int _score;
final BackboardOnSubmit _onSubmit; final BackboardOnSubmit? _onSubmit;
final _numberFormat = NumberFormat('#,###,###'); final _numberFormat = NumberFormat('#,###,###');
@ -103,7 +103,7 @@ class BackboardGameOver extends PositionComponent with HasGameRef {
.join(); .join();
bool _submit() { bool _submit() {
_onSubmit(initials); _onSubmit?.call(initials);
return true; return true;
} }

@ -1,5 +1,6 @@
import 'dart:collection'; import 'dart:collection';
import 'package:bloc_test/bloc_test.dart';
import 'package:flame_test/flame_test.dart'; import 'package:flame_test/flame_test.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
@ -12,6 +13,22 @@ void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(EmptyPinballGameTest.new); final flameTester = FlameTester(EmptyPinballGameTest.new);
final gameOverBlocTester = FlameBlocTester<EmptyPinballGameTest, GameBloc>(
gameBuilder: EmptyPinballGameTest.new,
blocBuilder: () {
final bloc = MockGameBloc();
const state = GameState(
score: 0,
balls: 0,
bonusHistory: [],
activatedBonusLetters: [],
activatedDashNests: {},
);
whenListen(bloc, Stream.value(state), initialState: state);
return bloc;
},
);
group('FlipperController', () { group('FlipperController', () {
group('onKeyEvent', () { group('onKeyEvent', () {
final leftKeys = UnmodifiableListView([ final leftKeys = UnmodifiableListView([
@ -48,6 +65,20 @@ void main() {
); );
}); });
testRawKeyDownEvents(leftKeys, (event) {
gameOverBlocTester.testGameWidget(
'does nothing when is game over',
setUp: (game, tester) async {
await game.ensureAdd(flipper);
controller.onKeyEvent(event, {});
},
verify: (game, tester) async {
expect(flipper.body.linearVelocity.y, isZero);
expect(flipper.body.linearVelocity.x, isZero);
},
);
});
testRawKeyUpEvents(leftKeys, (event) { testRawKeyUpEvents(leftKeys, (event) {
flameTester.test( flameTester.test(
'moves downwards ' 'moves downwards '
@ -119,6 +150,20 @@ void main() {
); );
}); });
testRawKeyDownEvents(rightKeys, (event) {
gameOverBlocTester.testGameWidget(
'does nothing when is game over',
setUp: (game, tester) async {
await game.ensureAdd(flipper);
controller.onKeyEvent(event, {});
},
verify: (game, tester) async {
expect(flipper.body.linearVelocity.y, isZero);
expect(flipper.body.linearVelocity.x, isZero);
},
);
});
testRawKeyUpEvents(leftKeys, (event) { testRawKeyUpEvents(leftKeys, (event) {
flameTester.test( flameTester.test(
'does nothing ' 'does nothing '

@ -42,7 +42,12 @@ void main() {
gameFlowController = GameFlowController(game); gameFlowController = GameFlowController(game);
overlays = MockActiveOverlaysNotifier(); overlays = MockActiveOverlaysNotifier();
when(backboard.gameOverMode).thenAnswer((_) async {}); when(
() => backboard.gameOverMode(
score: any(named: 'score'),
onSubmit: any(named: 'onSubmit'),
),
).thenAnswer((_) async {});
when(backboard.waitingMode).thenAnswer((_) async {}); when(backboard.waitingMode).thenAnswer((_) async {});
when(cameraController.focusOnBackboard).thenAnswer((_) async {}); when(cameraController.focusOnBackboard).thenAnswer((_) async {});
when(cameraController.focusOnGame).thenAnswer((_) async {}); when(cameraController.focusOnGame).thenAnswer((_) async {});
@ -67,7 +72,12 @@ void main() {
), ),
); );
verify(backboard.gameOverMode).called(1); verify(
() => backboard.gameOverMode(
score: 0,
onSubmit: any(named: 'onSubmit'),
),
).called(1);
verify(cameraController.focusOnBackboard).called(1); verify(cameraController.focusOnBackboard).called(1);
}, },
); );

Loading…
Cancel
Save