refactor: alien to android (#246)

Co-authored-by: Alejandro Santiago <dev@alestiago.com>
pull/249/head
Allison Ryan 3 years ago committed by GitHub
parent 46e9152225
commit c33d34e42f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -5,25 +5,30 @@ import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_flame/pinball_flame.dart';
/// {@template alien_zone} /// {@template android_acres}
/// Area positioned below [Spaceship] where the [Ball] /// Area positioned on the left side of the board containing the [Spaceship],
/// can bounce off [AlienBumper]s. /// [SpaceshipRamp], [SpaceshipRail], and [AndroidBumper]s.
/// {@endtemplate} /// {@endtemplate}
class AlienZone extends Blueprint { class AndroidAcres extends Blueprint {
/// {@macro alien_zone} /// {@macro android_acres}
AlienZone() AndroidAcres()
: super( : super(
components: [ components: [
AlienBumper.a( AndroidBumper.a(
children: [ children: [
ScoringBehavior(points: 20), ScoringBehavior(points: 20),
], ],
)..initialPosition = Vector2(-32.52, -9.1), )..initialPosition = Vector2(-32.52, -9.1),
AlienBumper.b( AndroidBumper.b(
children: [ children: [
ScoringBehavior(points: 20), ScoringBehavior(points: 20),
], ],
)..initialPosition = Vector2(-22.89, -17.35), )..initialPosition = Vector2(-22.89, -17.35),
], ],
blueprints: [
SpaceshipRamp(),
Spaceship(position: Vector2(-26.5, -28.5)),
SpaceshipRail(),
],
); );
} }

@ -1,4 +1,4 @@
export 'alien_zone.dart'; export 'android_acres.dart';
export 'board.dart'; export 'board.dart';
export 'camera_controller.dart'; export 'camera_controller.dart';
export 'controlled_ball.dart'; export 'controlled_ball.dart';

@ -77,10 +77,10 @@ extension PinballGameAssetsX on PinballGame {
), ),
images.load(components.Assets.images.spaceship.rail.main.keyName), images.load(components.Assets.images.spaceship.rail.main.keyName),
images.load(components.Assets.images.spaceship.rail.foreground.keyName), images.load(components.Assets.images.spaceship.rail.foreground.keyName),
images.load(components.Assets.images.alienBumper.a.active.keyName), images.load(components.Assets.images.androidBumper.a.lit.keyName),
images.load(components.Assets.images.alienBumper.a.inactive.keyName), images.load(components.Assets.images.androidBumper.a.dimmed.keyName),
images.load(components.Assets.images.alienBumper.b.active.keyName), images.load(components.Assets.images.androidBumper.b.lit.keyName),
images.load(components.Assets.images.alienBumper.b.inactive.keyName), images.load(components.Assets.images.androidBumper.b.dimmed.keyName),
images.load(components.Assets.images.chromeDino.mouth.keyName), images.load(components.Assets.images.chromeDino.mouth.keyName),
images.load(components.Assets.images.chromeDino.head.keyName), images.load(components.Assets.images.chromeDino.head.keyName),
images.load(components.Assets.images.sparky.computer.top.keyName), images.load(components.Assets.images.sparky.computer.top.keyName),

@ -53,20 +53,10 @@ class PinballGame extends Forge2DGame
final launcher = Launcher(); final launcher = Launcher();
unawaited(addFromBlueprint(launcher)); unawaited(addFromBlueprint(launcher));
unawaited(add(Board())); unawaited(add(Board()));
await addFromBlueprint(AlienZone());
await addFromBlueprint(SparkyFireZone()); await addFromBlueprint(SparkyFireZone());
await addFromBlueprint(AndroidAcres());
unawaited(addFromBlueprint(Slingshots())); unawaited(addFromBlueprint(Slingshots()));
unawaited(addFromBlueprint(DinoWalls())); unawaited(addFromBlueprint(DinoWalls()));
unawaited(addFromBlueprint(SpaceshipRamp()));
unawaited(
addFromBlueprint(
Spaceship(
position: Vector2(-26.5, -28.5),
),
),
);
unawaited(addFromBlueprint(SpaceshipRail()));
await add( await add(
GoogleWord( GoogleWord(
position: Vector2( position: Vector2(

@ -10,8 +10,8 @@ import 'package:flutter/widgets.dart';
class $AssetsImagesGen { class $AssetsImagesGen {
const $AssetsImagesGen(); const $AssetsImagesGen();
$AssetsImagesAlienBumperGen get alienBumper => $AssetsImagesAndroidBumperGen get androidBumper =>
const $AssetsImagesAlienBumperGen(); const $AssetsImagesAndroidBumperGen();
$AssetsImagesBackboardGen get backboard => const $AssetsImagesBackboardGen(); $AssetsImagesBackboardGen get backboard => const $AssetsImagesBackboardGen();
$AssetsImagesBallGen get ball => const $AssetsImagesBallGen(); $AssetsImagesBallGen get ball => const $AssetsImagesBallGen();
$AssetsImagesBaseboardGen get baseboard => const $AssetsImagesBaseboardGen(); $AssetsImagesBaseboardGen get baseboard => const $AssetsImagesBaseboardGen();
@ -33,11 +33,13 @@ class $AssetsImagesGen {
$AssetsImagesSparkyGen get sparky => const $AssetsImagesSparkyGen(); $AssetsImagesSparkyGen get sparky => const $AssetsImagesSparkyGen();
} }
class $AssetsImagesAlienBumperGen { class $AssetsImagesAndroidBumperGen {
const $AssetsImagesAlienBumperGen(); const $AssetsImagesAndroidBumperGen();
$AssetsImagesAlienBumperAGen get a => const $AssetsImagesAlienBumperAGen(); $AssetsImagesAndroidBumperAGen get a =>
$AssetsImagesAlienBumperBGen get b => const $AssetsImagesAlienBumperBGen(); const $AssetsImagesAndroidBumperAGen();
$AssetsImagesAndroidBumperBGen get b =>
const $AssetsImagesAndroidBumperBGen();
} }
class $AssetsImagesBackboardGen { class $AssetsImagesBackboardGen {
@ -269,28 +271,28 @@ class $AssetsImagesSparkyGen {
const $AssetsImagesSparkyComputerGen(); const $AssetsImagesSparkyComputerGen();
} }
class $AssetsImagesAlienBumperAGen { class $AssetsImagesAndroidBumperAGen {
const $AssetsImagesAlienBumperAGen(); const $AssetsImagesAndroidBumperAGen();
/// File path: assets/images/alien_bumper/a/active.png /// File path: assets/images/android_bumper/a/dimmed.png
AssetGenImage get active => AssetGenImage get dimmed =>
const AssetGenImage('assets/images/alien_bumper/a/active.png'); const AssetGenImage('assets/images/android_bumper/a/dimmed.png');
/// File path: assets/images/alien_bumper/a/inactive.png /// File path: assets/images/android_bumper/a/lit.png
AssetGenImage get inactive => AssetGenImage get lit =>
const AssetGenImage('assets/images/alien_bumper/a/inactive.png'); const AssetGenImage('assets/images/android_bumper/a/lit.png');
} }
class $AssetsImagesAlienBumperBGen { class $AssetsImagesAndroidBumperBGen {
const $AssetsImagesAlienBumperBGen(); const $AssetsImagesAndroidBumperBGen();
/// File path: assets/images/alien_bumper/b/active.png /// File path: assets/images/android_bumper/b/dimmed.png
AssetGenImage get active => AssetGenImage get dimmed =>
const AssetGenImage('assets/images/alien_bumper/b/active.png'); const AssetGenImage('assets/images/android_bumper/b/dimmed.png');
/// File path: assets/images/alien_bumper/b/inactive.png /// File path: assets/images/android_bumper/b/lit.png
AssetGenImage get inactive => AssetGenImage get lit =>
const AssetGenImage('assets/images/alien_bumper/b/inactive.png'); const AssetGenImage('assets/images/android_bumper/b/lit.png');
} }
class $AssetsImagesDashBumperGen { class $AssetsImagesDashBumperGen {

@ -1,2 +0,0 @@
export 'alien_bumper_ball_contact_behavior.dart';
export 'alien_bumper_blinking_behavior.dart';

@ -1,17 +0,0 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'alien_bumper_state.dart';
class AlienBumperCubit extends Cubit<AlienBumperState> {
AlienBumperCubit() : super(AlienBumperState.active);
void onBallContacted() {
emit(AlienBumperState.inactive);
}
void onBlinked() {
emit(AlienBumperState.active);
}
}

@ -1,10 +0,0 @@
part of 'alien_bumper_cubit.dart';
/// Indicates the [AlienBumperCubit]'s current state.
enum AlienBumperState {
/// A lit up bumper.
active,
/// A dimmed bumper.
inactive,
}

@ -4,71 +4,71 @@ import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/alien_bumper/behaviors/behaviors.dart'; import 'package:pinball_components/src/components/android_bumper/behaviors/behaviors.dart';
import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_flame/pinball_flame.dart';
export 'cubit/alien_bumper_cubit.dart'; export 'cubit/android_bumper_cubit.dart';
/// {@template alien_bumper} /// {@template android_bumper}
/// Bumper for area under the [Spaceship]. /// Bumper for area under the [Spaceship].
/// {@endtemplate} /// {@endtemplate}
class AlienBumper extends BodyComponent with InitialPosition { class AndroidBumper extends BodyComponent with InitialPosition {
/// {@macro alien_bumper} /// {@macro android_bumper}
AlienBumper._({ AndroidBumper._({
required double majorRadius, required double majorRadius,
required double minorRadius, required double minorRadius,
required String onAssetPath, required String litAssetPath,
required String offAssetPath, required String dimmedAssetPath,
Iterable<Component>? children, Iterable<Component>? children,
required this.bloc, required this.bloc,
}) : _majorRadius = majorRadius, }) : _majorRadius = majorRadius,
_minorRadius = minorRadius, _minorRadius = minorRadius,
super( super(
priority: RenderPriority.alienBumper, priority: RenderPriority.androidBumper,
renderBody: false, renderBody: false,
children: [ children: [
AlienBumperBallContactBehavior(), AndroidBumperBallContactBehavior(),
AlienBumperBlinkingBehavior(), AndroidBumperBlinkingBehavior(),
_AlienBumperSpriteGroupComponent( _AndroidBumperSpriteGroupComponent(
offAssetPath: offAssetPath, dimmedAssetPath: dimmedAssetPath,
onAssetPath: onAssetPath, litAssetPath: litAssetPath,
state: bloc.state, state: bloc.state,
), ),
...?children, ...?children,
], ],
); );
/// {@macro alien_bumper} /// {@macro android_bumper}
AlienBumper.a({ AndroidBumper.a({
Iterable<Component>? children, Iterable<Component>? children,
}) : this._( }) : this._(
majorRadius: 3.52, majorRadius: 3.52,
minorRadius: 2.97, minorRadius: 2.97,
onAssetPath: Assets.images.alienBumper.a.active.keyName, litAssetPath: Assets.images.androidBumper.a.lit.keyName,
offAssetPath: Assets.images.alienBumper.a.inactive.keyName, dimmedAssetPath: Assets.images.androidBumper.a.dimmed.keyName,
bloc: AlienBumperCubit(), bloc: AndroidBumperCubit(),
children: children, children: children,
); );
/// {@macro alien_bumper} /// {@macro android_bumper}
AlienBumper.b({ AndroidBumper.b({
Iterable<Component>? children, Iterable<Component>? children,
}) : this._( }) : this._(
majorRadius: 3.19, majorRadius: 3.19,
minorRadius: 2.79, minorRadius: 2.79,
onAssetPath: Assets.images.alienBumper.b.active.keyName, litAssetPath: Assets.images.androidBumper.b.lit.keyName,
offAssetPath: Assets.images.alienBumper.b.inactive.keyName, dimmedAssetPath: Assets.images.androidBumper.b.dimmed.keyName,
bloc: AlienBumperCubit(), bloc: AndroidBumperCubit(),
children: children, children: children,
); );
/// Creates an [AlienBumper] without any children. /// Creates an [AndroidBumper] without any children.
/// ///
/// This can be used for testing [AlienBumper]'s behaviors in isolation. /// This can be used for testing [AndroidBumper]'s behaviors in isolation.
// TODO(alestiago): Refactor injecting bloc once the following is merged: // TODO(alestiago): Refactor injecting bloc once the following is merged:
// https://github.com/flame-engine/flame/pull/1538 // https://github.com/flame-engine/flame/pull/1538
@visibleForTesting @visibleForTesting
AlienBumper.test({ AndroidBumper.test({
required this.bloc, required this.bloc,
}) : _majorRadius = 3.52, }) : _majorRadius = 3.52,
_minorRadius = 2.97; _minorRadius = 2.97;
@ -80,7 +80,7 @@ class AlienBumper extends BodyComponent with InitialPosition {
// TODO(alestiago): Consider refactoring once the following is merged: // TODO(alestiago): Consider refactoring once the following is merged:
// https://github.com/flame-engine/flame/pull/1538 // https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs // ignore: public_member_api_docs
final AlienBumperCubit bloc; final AndroidBumperCubit bloc;
@override @override
void onRemove() { void onRemove() {
@ -107,23 +107,23 @@ class AlienBumper extends BodyComponent with InitialPosition {
} }
} }
class _AlienBumperSpriteGroupComponent class _AndroidBumperSpriteGroupComponent
extends SpriteGroupComponent<AlienBumperState> extends SpriteGroupComponent<AndroidBumperState>
with HasGameRef, ParentIsA<AlienBumper> { with HasGameRef, ParentIsA<AndroidBumper> {
_AlienBumperSpriteGroupComponent({ _AndroidBumperSpriteGroupComponent({
required String onAssetPath, required String litAssetPath,
required String offAssetPath, required String dimmedAssetPath,
required AlienBumperState state, required AndroidBumperState state,
}) : _onAssetPath = onAssetPath, }) : _litAssetPath = litAssetPath,
_offAssetPath = offAssetPath, _dimmedAssetPath = dimmedAssetPath,
super( super(
anchor: Anchor.center, anchor: Anchor.center,
position: Vector2(0, -0.1), position: Vector2(0, -0.1),
current: state, current: state,
); );
final String _onAssetPath; final String _litAssetPath;
final String _offAssetPath; final String _dimmedAssetPath;
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
@ -131,11 +131,11 @@ class _AlienBumperSpriteGroupComponent
parent.bloc.stream.listen((state) => current = state); parent.bloc.stream.listen((state) => current = state);
final sprites = { final sprites = {
AlienBumperState.active: Sprite( AndroidBumperState.lit: Sprite(
gameRef.images.fromCache(_onAssetPath), gameRef.images.fromCache(_litAssetPath),
), ),
AlienBumperState.inactive: AndroidBumperState.dimmed:
Sprite(gameRef.images.fromCache(_offAssetPath)), Sprite(gameRef.images.fromCache(_dimmedAssetPath)),
}; };
this.sprites = sprites; this.sprites = sprites;
size = sprites[current]!.originalSize / 10; size = sprites[current]!.originalSize / 10;

@ -4,7 +4,7 @@ import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_flame/pinball_flame.dart';
class AlienBumperBallContactBehavior extends ContactBehavior<AlienBumper> { class AndroidBumperBallContactBehavior extends ContactBehavior<AndroidBumper> {
@override @override
void beginContact(Object other, Contact contact) { void beginContact(Object other, Contact contact) {
super.beginContact(other, contact); super.beginContact(other, contact);

@ -2,20 +2,20 @@ import 'package:flame/components.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_flame/pinball_flame.dart';
/// {@template alien_bumper_blinking_behavior} /// {@template android_bumper_blinking_behavior}
/// Makes a [AlienBumper] blink back to [AlienBumperState.active] when /// Makes an [AndroidBumper] blink back to [AndroidBumperState.lit] when
/// [AlienBumperState.inactive]. /// [AndroidBumperState.dimmed].
/// {@endtemplate} /// {@endtemplate}
class AlienBumperBlinkingBehavior extends TimerComponent class AndroidBumperBlinkingBehavior extends TimerComponent
with ParentIsA<AlienBumper> { with ParentIsA<AndroidBumper> {
/// {@macro alien_bumper_blinking_behavior} /// {@macro android_bumper_blinking_behavior}
AlienBumperBlinkingBehavior() : super(period: 0.05); AndroidBumperBlinkingBehavior() : super(period: 0.05);
void _onNewState(AlienBumperState state) { void _onNewState(AndroidBumperState state) {
switch (state) { switch (state) {
case AlienBumperState.active: case AndroidBumperState.lit:
break; break;
case AlienBumperState.inactive: case AndroidBumperState.dimmed:
timer timer
..reset() ..reset()
..start(); ..start();

@ -0,0 +1,2 @@
export 'android_bumper_ball_contact_behavior.dart';
export 'android_bumper_blinking_behavior.dart';

@ -0,0 +1,17 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'android_bumper_state.dart';
class AndroidBumperCubit extends Cubit<AndroidBumperState> {
AndroidBumperCubit() : super(AndroidBumperState.dimmed);
void onBallContacted() {
emit(AndroidBumperState.dimmed);
}
void onBlinked() {
emit(AndroidBumperState.lit);
}
}

@ -0,0 +1,8 @@
// ignore_for_file: public_member_api_docs
part of 'android_bumper_cubit.dart';
enum AndroidBumperState {
lit,
dimmed,
}

@ -1,4 +1,4 @@
export 'alien_bumper/alien_bumper.dart'; export 'android_bumper/android_bumper.dart';
export 'backboard/backboard.dart'; export 'backboard/backboard.dart';
export 'ball.dart'; export 'ball.dart';
export 'baseboard.dart'; export 'baseboard.dart';

@ -83,7 +83,7 @@ abstract class RenderPriority {
static const int turboChargeFlame = _above + ballOnBoard; static const int turboChargeFlame = _above + ballOnBoard;
// Android Spaceship // Android Acres
static const int spaceshipRail = _above + bottomGroup; static const int spaceshipRail = _above + bottomGroup;
@ -106,7 +106,7 @@ abstract class RenderPriority {
static const int spaceshipRampBoardOpening = _below + ballOnBoard; static const int spaceshipRampBoardOpening = _below + ballOnBoard;
static const int alienBumper = _above + ballOnBoard; static const int androidBumper = _above + ballOnBoard;
// Score Text // Score Text

@ -64,8 +64,8 @@ flutter:
- assets/images/kicker/ - assets/images/kicker/
- assets/images/plunger/ - assets/images/plunger/
- assets/images/slingshot/ - assets/images/slingshot/
- assets/images/alien_bumper/a/ - assets/images/android_bumper/a/
- assets/images/alien_bumper/b/ - assets/images/android_bumper/b/
- assets/images/sparky/ - assets/images/sparky/
- assets/images/sparky/computer/ - assets/images/sparky/computer/
- assets/images/sparky/bumper/a/ - assets/images/sparky/bumper/a/

@ -23,7 +23,7 @@ void main() {
addPlungerStories(dashbook); addPlungerStories(dashbook);
addSlingshotStories(dashbook); addSlingshotStories(dashbook);
addSparkyBumperStories(dashbook); addSparkyBumperStories(dashbook);
addAlienZoneStories(dashbook); addAndroidAcresStories(dashbook);
addBoundariesStories(dashbook); addBoundariesStories(dashbook);
addGoogleWordStories(dashbook); addGoogleWordStories(dashbook);
addLaunchRampStories(dashbook); addLaunchRampStories(dashbook);

@ -1,36 +0,0 @@
import 'package:dashbook/dashbook.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/alien_zone/alien_bumper_a_game.dart';
import 'package:sandbox/stories/alien_zone/alien_bumper_b_game.dart';
import 'package:sandbox/stories/alien_zone/spaceship_game.dart';
import 'package:sandbox/stories/alien_zone/spaceship_rail_game.dart';
import 'package:sandbox/stories/alien_zone/spaceship_ramp_game.dart';
void addAlienZoneStories(Dashbook dashbook) {
dashbook.storiesOf('Alien Zone')
..addGame(
title: 'Alien Bumper A',
description: AlienBumperAGame.description,
gameBuilder: (_) => AlienBumperAGame(),
)
..addGame(
title: 'Alien Bumper B',
description: AlienBumperBGame.description,
gameBuilder: (_) => AlienBumperBGame(),
)
..addGame(
title: 'Spaceship',
description: SpaceshipGame.description,
gameBuilder: (_) => SpaceshipGame(),
)
..addGame(
title: 'Spaceship Rail',
description: SpaceshipRailGame.description,
gameBuilder: (_) => SpaceshipRailGame(),
)
..addGame(
title: 'Spaceship Ramp',
description: SpaceshipRampGame.description,
gameBuilder: (_) => SpaceshipRampGame(),
);
}

@ -4,18 +4,18 @@ import 'package:flame/extensions.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart'; import 'package:sandbox/stories/ball/basic_ball_game.dart';
class AlienBumperAGame extends BallGame { class AndroidBumperAGame extends BallGame {
AlienBumperAGame() AndroidBumperAGame()
: super( : super(
color: const Color(0xFF0000FF), color: const Color(0xFF0000FF),
imagesFileNames: [ imagesFileNames: [
Assets.images.alienBumper.a.active.keyName, Assets.images.androidBumper.a.lit.keyName,
Assets.images.alienBumper.a.inactive.keyName, Assets.images.androidBumper.a.dimmed.keyName,
], ],
); );
static const description = ''' static const description = '''
Shows how a AlienBumperA is rendered. Shows how a AndroidBumperA is rendered.
- Activate the "trace" parameter to overlay the body. - Activate the "trace" parameter to overlay the body.
'''; ''';
@ -26,7 +26,7 @@ class AlienBumperAGame extends BallGame {
camera.followVector2(Vector2.zero()); camera.followVector2(Vector2.zero());
await add( await add(
AlienBumper.a()..priority = 1, AndroidBumper.a()..priority = 1,
); );
await traceAllBodies(); await traceAllBodies();

@ -4,18 +4,18 @@ import 'package:flame/extensions.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart'; import 'package:sandbox/stories/ball/basic_ball_game.dart';
class AlienBumperBGame extends BallGame { class AndroidBumperBGame extends BallGame {
AlienBumperBGame() AndroidBumperBGame()
: super( : super(
color: const Color(0xFF0000FF), color: const Color(0xFF0000FF),
imagesFileNames: [ imagesFileNames: [
Assets.images.alienBumper.b.active.keyName, Assets.images.androidBumper.b.lit.keyName,
Assets.images.alienBumper.b.inactive.keyName, Assets.images.androidBumper.b.dimmed.keyName,
], ],
); );
static const description = ''' static const description = '''
Shows how a AlienBumperB is rendered. Shows how a AndroidBumperB is rendered.
- Activate the "trace" parameter to overlay the body. - Activate the "trace" parameter to overlay the body.
'''; ''';
@ -26,7 +26,7 @@ class AlienBumperBGame extends BallGame {
camera.followVector2(Vector2.zero()); camera.followVector2(Vector2.zero());
await add( await add(
AlienBumper.b()..priority = 1, AndroidBumper.b()..priority = 1,
); );
await traceAllBodies(); await traceAllBodies();

@ -0,0 +1,36 @@
import 'package:dashbook/dashbook.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/android_acres/android_bumper_a_game.dart';
import 'package:sandbox/stories/android_acres/android_bumper_b_game.dart';
import 'package:sandbox/stories/android_acres/spaceship_game.dart';
import 'package:sandbox/stories/android_acres/spaceship_rail_game.dart';
import 'package:sandbox/stories/android_acres/spaceship_ramp_game.dart';
void addAndroidAcresStories(Dashbook dashbook) {
dashbook.storiesOf('Android Acres')
..addGame(
title: 'Android Bumper A',
description: AndroidBumperAGame.description,
gameBuilder: (_) => AndroidBumperAGame(),
)
..addGame(
title: 'Android Bumper B',
description: AndroidBumperBGame.description,
gameBuilder: (_) => AndroidBumperBGame(),
)
..addGame(
title: 'Spaceship',
description: SpaceshipGame.description,
gameBuilder: (_) => SpaceshipGame(),
)
..addGame(
title: 'Spaceship Rail',
description: SpaceshipRailGame.description,
gameBuilder: (_) => SpaceshipRailGame(),
)
..addGame(
title: 'Spaceship Ramp',
description: SpaceshipRampGame.description,
gameBuilder: (_) => SpaceshipRampGame(),
);
}

@ -1,4 +1,4 @@
export 'alien_zone/stories.dart'; export 'android_acres/stories.dart';
export 'backboard/stories.dart'; export 'backboard/stories.dart';
export 'ball/stories.dart'; export 'ball/stories.dart';
export 'baseboard/stories.dart'; export 'baseboard/stories.dart';

@ -17,7 +17,7 @@ class MockContact extends Mock implements Contact {}
class MockComponent extends Mock implements Component {} class MockComponent extends Mock implements Component {}
class MockAlienBumperCubit extends Mock implements AlienBumperCubit {} class MockAndroidBumperCubit extends Mock implements AndroidBumperCubit {}
class MockGoogleLetterCubit extends Mock implements GoogleLetterCubit {} class MockGoogleLetterCubit extends Mock implements GoogleLetterCubit {}

@ -1,24 +0,0 @@
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_components/pinball_components.dart';
void main() {
group(
'AlienBumperCubit',
() {
blocTest<AlienBumperCubit, AlienBumperState>(
'onBallContacted emits inactive',
build: AlienBumperCubit.new,
act: (bloc) => bloc.onBallContacted(),
expect: () => [AlienBumperState.inactive],
);
blocTest<AlienBumperCubit, AlienBumperState>(
'onBlinked emits active',
build: AlienBumperCubit.new,
act: (bloc) => bloc.onBlinked(),
expect: () => [AlienBumperState.active],
);
},
);
}

@ -6,48 +6,48 @@ import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/alien_bumper/behaviors/behaviors.dart'; import 'package:pinball_components/src/components/android_bumper/behaviors/behaviors.dart';
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
Assets.images.alienBumper.a.active.keyName, Assets.images.androidBumper.a.lit.keyName,
Assets.images.alienBumper.a.inactive.keyName, Assets.images.androidBumper.a.dimmed.keyName,
Assets.images.alienBumper.b.active.keyName, Assets.images.androidBumper.b.lit.keyName,
Assets.images.alienBumper.b.inactive.keyName, Assets.images.androidBumper.b.dimmed.keyName,
]; ];
final flameTester = FlameTester(() => TestGame(assets)); final flameTester = FlameTester(() => TestGame(assets));
group('AlienBumper', () { group('AndroidBumper', () {
flameTester.test('"a" loads correctly', (game) async { flameTester.test('"a" loads correctly', (game) async {
final alienBumper = AlienBumper.a(); final androidBumper = AndroidBumper.a();
await game.ensureAdd(alienBumper); await game.ensureAdd(androidBumper);
expect(game.contains(alienBumper), isTrue); expect(game.contains(androidBumper), isTrue);
}); });
flameTester.test('"b" loads correctly', (game) async { flameTester.test('"b" loads correctly', (game) async {
final alienBumper = AlienBumper.b(); final androidBumper = AndroidBumper.b();
await game.ensureAdd(alienBumper); await game.ensureAdd(androidBumper);
expect(game.contains(alienBumper), isTrue); expect(game.contains(androidBumper), isTrue);
}); });
// TODO(alestiago): Consider refactoring once the following is merged: // TODO(alestiago): Consider refactoring once the following is merged:
// https://github.com/flame-engine/flame/pull/1538 // https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs // ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async { flameTester.test('closes bloc when removed', (game) async {
final bloc = MockAlienBumperCubit(); final bloc = MockAndroidBumperCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<AlienBumperState>.empty(), const Stream<AndroidBumperState>.empty(),
initialState: AlienBumperState.active, initialState: AndroidBumperState.lit,
); );
when(bloc.close).thenAnswer((_) async {}); when(bloc.close).thenAnswer((_) async {});
final alienBumper = AlienBumper.test(bloc: bloc); final androidBumper = AndroidBumper.test(bloc: bloc);
await game.ensureAdd(alienBumper); await game.ensureAdd(androidBumper);
game.remove(alienBumper); game.remove(androidBumper);
await game.ready(); await game.ready();
verify(bloc.close).called(1); verify(bloc.close).called(1);
@ -56,19 +56,19 @@ void main() {
group('adds', () { group('adds', () {
flameTester.test('new children', (game) async { flameTester.test('new children', (game) async {
final component = Component(); final component = Component();
final alienBumper = AlienBumper.a( final androidBumper = AndroidBumper.a(
children: [component], children: [component],
); );
await game.ensureAdd(alienBumper); await game.ensureAdd(androidBumper);
expect(alienBumper.children, contains(component)); expect(androidBumper.children, contains(component));
}); });
flameTester.test('an AlienBumperBallContactBehavior', (game) async { flameTester.test('an AndroidBumperBallContactBehavior', (game) async {
final alienBumper = AlienBumper.a(); final androidBumper = AndroidBumper.a();
await game.ensureAdd(alienBumper); await game.ensureAdd(androidBumper);
expect( expect(
alienBumper.children androidBumper.children
.whereType<AlienBumperBallContactBehavior>() .whereType<AndroidBumperBallContactBehavior>()
.single, .single,
isNotNull, isNotNull,
); );

@ -5,7 +5,7 @@ import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/alien_bumper/behaviors/behaviors.dart'; import 'package:pinball_components/src/components/android_bumper/behaviors/behaviors.dart';
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
@ -14,33 +14,33 @@ void main() {
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
group( group(
'AlienBumperBallContactBehavior', 'AndroidBumperBallContactBehavior',
() { () {
test('can be instantiated', () { test('can be instantiated', () {
expect( expect(
AlienBumperBallContactBehavior(), AndroidBumperBallContactBehavior(),
isA<AlienBumperBallContactBehavior>(), isA<AndroidBumperBallContactBehavior>(),
); );
}); });
flameTester.test( flameTester.test(
'beginContact emits onBallContacted when contacts with a ball', 'beginContact emits onBallContacted when contacts with a ball',
(game) async { (game) async {
final behavior = AlienBumperBallContactBehavior(); final behavior = AndroidBumperBallContactBehavior();
final bloc = MockAlienBumperCubit(); final bloc = MockAndroidBumperCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<AlienBumperState>.empty(), const Stream<AndroidBumperState>.empty(),
initialState: AlienBumperState.active, initialState: AndroidBumperState.lit,
); );
final alienBumper = AlienBumper.test(bloc: bloc); final androidBumper = AndroidBumper.test(bloc: bloc);
await alienBumper.add(behavior); await androidBumper.add(behavior);
await game.ensureAdd(alienBumper); await game.ensureAdd(androidBumper);
behavior.beginContact(MockBall(), MockContact()); behavior.beginContact(MockBall(), MockContact());
verify(alienBumper.bloc.onBallContacted).called(1); verify(androidBumper.bloc.onBallContacted).called(1);
}, },
); );
}, },

@ -5,7 +5,7 @@ import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/alien_bumper/behaviors/behaviors.dart'; import 'package:pinball_components/src/components/android_bumper/behaviors/behaviors.dart';
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
@ -14,25 +14,25 @@ void main() {
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
group( group(
'AlienBumperBlinkingBehavior', 'AndroidBumperBlinkingBehavior',
() { () {
flameTester.testGameWidget( flameTester.testGameWidget(
'calls onBlinked after 0.05 seconds when inactive', 'calls onBlinked after 0.05 seconds when dimmed',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = AlienBumperBlinkingBehavior(); final behavior = AndroidBumperBlinkingBehavior();
final bloc = MockAlienBumperCubit(); final bloc = MockAndroidBumperCubit();
final streamController = StreamController<AlienBumperState>(); final streamController = StreamController<AndroidBumperState>();
whenListen( whenListen(
bloc, bloc,
streamController.stream, streamController.stream,
initialState: AlienBumperState.active, initialState: AndroidBumperState.lit,
); );
final alienBumper = AlienBumper.test(bloc: bloc); final androidBumper = AndroidBumper.test(bloc: bloc);
await alienBumper.add(behavior); await androidBumper.add(behavior);
await game.ensureAdd(alienBumper); await game.ensureAdd(androidBumper);
streamController.add(AlienBumperState.inactive); streamController.add(AndroidBumperState.dimmed);
await tester.pump(); await tester.pump();
game.update(0.05); game.update(0.05);

@ -0,0 +1,24 @@
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_components/pinball_components.dart';
void main() {
group(
'AndroidBumperCubit',
() {
blocTest<AndroidBumperCubit, AndroidBumperState>(
'onBallContacted emits dimmed',
build: AndroidBumperCubit.new,
act: (bloc) => bloc.onBallContacted(),
expect: () => [AndroidBumperState.dimmed],
);
blocTest<AndroidBumperCubit, AndroidBumperState>(
'onBlinked emits lit',
build: AndroidBumperCubit.new,
act: (bloc) => bloc.onBlinked(),
expect: () => [AndroidBumperState.lit],
);
},
);
}

@ -1,48 +0,0 @@
// ignore_for_file: cascade_invocations
import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import '../../helpers/helpers.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final assets = [
Assets.images.alienBumper.a.active.keyName,
Assets.images.alienBumper.a.inactive.keyName,
Assets.images.alienBumper.b.active.keyName,
Assets.images.alienBumper.b.inactive.keyName,
];
final flameTester = FlameTester(
() => EmptyPinballTestGame(assets: assets),
);
group('AlienZone', () {
flameTester.test(
'loads correctly',
(game) async {
await game.addFromBlueprint(AlienZone());
await game.ready();
},
);
group('loads', () {
flameTester.test(
'two AlienBumper',
(game) async {
final alienZone = AlienZone();
await game.addFromBlueprint(alienZone);
await game.ready();
expect(
game.descendants().whereType<AlienBumper>().length,
equals(2),
);
},
);
});
});
}

@ -0,0 +1,88 @@
// ignore_for_file: cascade_invocations
import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import '../../helpers/helpers.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final assets = [
Assets.images.spaceship.ramp.boardOpening.keyName,
Assets.images.spaceship.ramp.railingForeground.keyName,
Assets.images.spaceship.ramp.railingBackground.keyName,
Assets.images.spaceship.ramp.main.keyName,
Assets.images.spaceship.ramp.arrow.inactive.keyName,
Assets.images.spaceship.ramp.arrow.active1.keyName,
Assets.images.spaceship.ramp.arrow.active2.keyName,
Assets.images.spaceship.ramp.arrow.active3.keyName,
Assets.images.spaceship.ramp.arrow.active4.keyName,
Assets.images.spaceship.ramp.arrow.active5.keyName,
Assets.images.androidBumper.a.lit.keyName,
Assets.images.androidBumper.a.dimmed.keyName,
Assets.images.androidBumper.b.lit.keyName,
Assets.images.androidBumper.b.dimmed.keyName,
];
final flameTester = FlameTester(
() => EmptyPinballTestGame(assets: assets),
);
group('AndroidAcres', () {
flameTester.test(
'loads correctly',
(game) async {
await game.addFromBlueprint(AndroidAcres());
await game.ready();
},
);
group('loads', () {
flameTester.test(
'a Spaceship',
(game) async {
expect(
AndroidAcres().blueprints.whereType<Spaceship>().single,
isNotNull,
);
},
);
flameTester.test(
'a SpaceshipRamp',
(game) async {
expect(
AndroidAcres().blueprints.whereType<SpaceshipRamp>().single,
isNotNull,
);
},
);
flameTester.test(
'a SpaceshipRail',
(game) async {
expect(
AndroidAcres().blueprints.whereType<SpaceshipRail>().single,
isNotNull,
);
},
);
flameTester.test(
'two AndroidBumper',
(game) async {
final androidZone = AndroidAcres();
await game.addFromBlueprint(androidZone);
await game.ready();
expect(
game.descendants().whereType<AndroidBumper>().length,
equals(2),
);
},
);
});
});
}

@ -24,10 +24,10 @@ void main() {
Assets.images.signpost.active1.keyName, Assets.images.signpost.active1.keyName,
Assets.images.signpost.active2.keyName, Assets.images.signpost.active2.keyName,
Assets.images.signpost.active3.keyName, Assets.images.signpost.active3.keyName,
Assets.images.alienBumper.a.active.keyName, Assets.images.androidBumper.a.lit.keyName,
Assets.images.alienBumper.a.inactive.keyName, Assets.images.androidBumper.a.dimmed.keyName,
Assets.images.alienBumper.b.active.keyName, Assets.images.androidBumper.b.lit.keyName,
Assets.images.alienBumper.b.inactive.keyName, Assets.images.androidBumper.b.dimmed.keyName,
Assets.images.sparky.bumper.a.active.keyName, Assets.images.sparky.bumper.a.active.keyName,
Assets.images.sparky.bumper.a.inactive.keyName, Assets.images.sparky.bumper.a.inactive.keyName,
Assets.images.sparky.bumper.b.active.keyName, Assets.images.sparky.bumper.b.active.keyName,

@ -82,6 +82,6 @@ class MockActiveOverlaysNotifier extends Mock
class MockGameFlowController extends Mock implements GameFlowController {} class MockGameFlowController extends Mock implements GameFlowController {}
class MockAlienBumper extends Mock implements AlienBumper {} class MockAndroidBumper extends Mock implements AndroidBumper {}
class MockSparkyBumper extends Mock implements SparkyBumper {} class MockSparkyBumper extends Mock implements SparkyBumper {}

Loading…
Cancel
Save