diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index 43ba302f..6b4fba38 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -26,7 +26,7 @@ export 'plunger.dart'; export 'rocket.dart'; export 'score_text.dart'; export 'shapes/shapes.dart'; -export 'signpost.dart'; +export 'signpost/signpost.dart'; export 'slingshot.dart'; export 'spaceship_rail.dart'; export 'spaceship_ramp.dart'; diff --git a/packages/pinball_components/lib/src/components/signpost/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/signpost/behaviors/behaviors.dart new file mode 100644 index 00000000..e69de29b diff --git a/packages/pinball_components/lib/src/components/signpost/behaviors/sign_post_progressing_behavior.dart b/packages/pinball_components/lib/src/components/signpost/behaviors/sign_post_progressing_behavior.dart new file mode 100644 index 00000000..80c1cab8 --- /dev/null +++ b/packages/pinball_components/lib/src/components/signpost/behaviors/sign_post_progressing_behavior.dart @@ -0,0 +1,10 @@ +import 'package:flame/components.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class SignPostProgressingBehavior extends Component with ParentIsA { + @override + Future onLoad() async { + await super.onLoad(); + } +} diff --git a/packages/pinball_components/lib/src/components/signpost/cubit/signpost_cubit.dart b/packages/pinball_components/lib/src/components/signpost/cubit/signpost_cubit.dart new file mode 100644 index 00000000..66972a5a --- /dev/null +++ b/packages/pinball_components/lib/src/components/signpost/cubit/signpost_cubit.dart @@ -0,0 +1,14 @@ +import 'package:bloc/bloc.dart'; + +part 'signpost_state.dart'; + +class SignpostCubit extends Cubit { + SignpostCubit() : super(SignpostState.inactive); + + void progress() { + final index = SignpostState.values.indexOf(state); + emit( + SignpostState.values[(index + 1) % SignpostState.values.length], + ); + } +} diff --git a/packages/pinball_components/lib/src/components/signpost/cubit/signpost_state.dart b/packages/pinball_components/lib/src/components/signpost/cubit/signpost_state.dart new file mode 100644 index 00000000..0141ae06 --- /dev/null +++ b/packages/pinball_components/lib/src/components/signpost/cubit/signpost_state.dart @@ -0,0 +1,17 @@ +// ignore_for_file: public_member_api_docs + +part of 'signpost_cubit.dart'; + +enum SignpostState { + /// Signpost with no active dashes. + inactive, + + /// Signpost with a single sign of lit up dashes. + active1, + + /// Signpost with two signs of lit up dashes. + active2, + + /// Signpost with all signs of lit up dashes. + active3, +} diff --git a/packages/pinball_components/lib/src/components/signpost/signpost.dart b/packages/pinball_components/lib/src/components/signpost/signpost.dart index d7feaeaa..42d2c495 100644 --- a/packages/pinball_components/lib/src/components/signpost/signpost.dart +++ b/packages/pinball_components/lib/src/components/signpost/signpost.dart @@ -1,43 +1,8 @@ import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:flutter/material.dart'; import 'package:pinball_components/pinball_components.dart'; -/// Represents the [Signpost]'s current [Sprite] state. -@visibleForTesting -enum SignpostSpriteState { - /// Signpost with no active dashes. - inactive, - - /// Signpost with a single sign of active dashes. - active1, - - /// Signpost with two signs of active dashes. - active2, - - /// Signpost with all signs of active dashes. - active3, -} - -extension on SignpostSpriteState { - String get path { - switch (this) { - case SignpostSpriteState.inactive: - return Assets.images.signpost.inactive.keyName; - case SignpostSpriteState.active1: - return Assets.images.signpost.active1.keyName; - case SignpostSpriteState.active2: - return Assets.images.signpost.active2.keyName; - case SignpostSpriteState.active3: - return Assets.images.signpost.active3.keyName; - } - } - - SignpostSpriteState get next { - return SignpostSpriteState - .values[(index + 1) % SignpostSpriteState.values.length]; - } -} +export 'cubit/signpost_cubit.dart'; /// {@template signpost} /// A sign, found in the Flutter Forest. @@ -48,18 +13,28 @@ class Signpost extends BodyComponent with InitialPosition { /// {@macro signpost} Signpost({ Iterable? children, + }) : this._( + children: children, + bloc: SignpostCubit(), + ); + + Signpost._({ + Iterable? children, + required this.bloc, }) : super( renderBody: false, children: [ - _SignpostSpriteComponent(), + _SignpostSpriteComponent( + current: bloc.state, + ), ...?children, ], ); - /// Forwards the sprite to the next [SignpostSpriteState]. - /// - /// If the current state is the last one it cycles back to the initial state. - void progress() => firstChild<_SignpostSpriteComponent>()!.progress(); + // TODO(alestiago): Consider refactoring once the following is merged: + // https://github.com/flame-engine/flame/pull/1538 + // ignore: public_member_api_docs + final SignpostCubit bloc; @override Body createBody() { @@ -72,29 +47,44 @@ class Signpost extends BodyComponent with InitialPosition { } } -class _SignpostSpriteComponent extends SpriteGroupComponent +class _SignpostSpriteComponent extends SpriteGroupComponent with HasGameRef { - _SignpostSpriteComponent() - : super( + _SignpostSpriteComponent({ + required SignpostState current, + }) : super( anchor: Anchor.bottomCenter, position: Vector2(0.65, 0.45), + current: current, ); - void progress() => current = current?.next; - @override Future onLoad() async { await super.onLoad(); - final sprites = {}; + final sprites = {}; this.sprites = sprites; - for (final spriteState in SignpostSpriteState.values) { + for (final spriteState in SignpostState.values) { sprites[spriteState] = Sprite( gameRef.images.fromCache(spriteState.path), ); } - current = SignpostSpriteState.inactive; + current = SignpostState.inactive; size = sprites[current]!.originalSize / 10; } } + +extension on SignpostState { + String get path { + switch (this) { + case SignpostState.inactive: + return Assets.images.signpost.inactive.keyName; + case SignpostState.active1: + return Assets.images.signpost.active1.keyName; + case SignpostState.active2: + return Assets.images.signpost.active2.keyName; + case SignpostState.active3: + return Assets.images.signpost.active3.keyName; + } + } +}