feat: defined SignpostCubit

pull/303/head
alestiago 3 years ago
parent 6207ed3a49
commit 18de0d73d6

@ -26,7 +26,7 @@ export 'plunger.dart';
export 'rocket.dart'; export 'rocket.dart';
export 'score_text.dart'; export 'score_text.dart';
export 'shapes/shapes.dart'; export 'shapes/shapes.dart';
export 'signpost.dart'; export 'signpost/signpost.dart';
export 'slingshot.dart'; export 'slingshot.dart';
export 'spaceship_rail.dart'; export 'spaceship_rail.dart';
export 'spaceship_ramp.dart'; export 'spaceship_ramp.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<Signpost> {
@override
Future<void> onLoad() async {
await super.onLoad();
}
}

@ -0,0 +1,14 @@
import 'package:bloc/bloc.dart';
part 'signpost_state.dart';
class SignpostCubit extends Cubit<SignpostState> {
SignpostCubit() : super(SignpostState.inactive);
void progress() {
final index = SignpostState.values.indexOf(state);
emit(
SignpostState.values[(index + 1) % SignpostState.values.length],
);
}
}

@ -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,
}

@ -1,43 +1,8 @@
import 'package:flame/components.dart'; 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:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
/// Represents the [Signpost]'s current [Sprite] state. export 'cubit/signpost_cubit.dart';
@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];
}
}
/// {@template signpost} /// {@template signpost}
/// A sign, found in the Flutter Forest. /// A sign, found in the Flutter Forest.
@ -48,18 +13,28 @@ class Signpost extends BodyComponent with InitialPosition {
/// {@macro signpost} /// {@macro signpost}
Signpost({ Signpost({
Iterable<Component>? children, Iterable<Component>? children,
}) : this._(
children: children,
bloc: SignpostCubit(),
);
Signpost._({
Iterable<Component>? children,
required this.bloc,
}) : super( }) : super(
renderBody: false, renderBody: false,
children: [ children: [
_SignpostSpriteComponent(), _SignpostSpriteComponent(
current: bloc.state,
),
...?children, ...?children,
], ],
); );
/// Forwards the sprite to the next [SignpostSpriteState]. // TODO(alestiago): Consider refactoring once the following is merged:
/// // https://github.com/flame-engine/flame/pull/1538
/// If the current state is the last one it cycles back to the initial state. // ignore: public_member_api_docs
void progress() => firstChild<_SignpostSpriteComponent>()!.progress(); final SignpostCubit bloc;
@override @override
Body createBody() { Body createBody() {
@ -72,29 +47,44 @@ class Signpost extends BodyComponent with InitialPosition {
} }
} }
class _SignpostSpriteComponent extends SpriteGroupComponent<SignpostSpriteState> class _SignpostSpriteComponent extends SpriteGroupComponent<SignpostState>
with HasGameRef { with HasGameRef {
_SignpostSpriteComponent() _SignpostSpriteComponent({
: super( required SignpostState current,
}) : super(
anchor: Anchor.bottomCenter, anchor: Anchor.bottomCenter,
position: Vector2(0.65, 0.45), position: Vector2(0.65, 0.45),
current: current,
); );
void progress() => current = current?.next;
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
final sprites = <SignpostSpriteState, Sprite>{}; final sprites = <SignpostState, Sprite>{};
this.sprites = sprites; this.sprites = sprites;
for (final spriteState in SignpostSpriteState.values) { for (final spriteState in SignpostState.values) {
sprites[spriteState] = Sprite( sprites[spriteState] = Sprite(
gameRef.images.fromCache(spriteState.path), gameRef.images.fromCache(spriteState.path),
); );
} }
current = SignpostSpriteState.inactive; current = SignpostState.inactive;
size = sprites[current]!.originalSize / 10; 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;
}
}
}

Loading…
Cancel
Save