refactor: flamebloclistenable

pull/416/head
RuiAlonso 3 years ago
parent 1a39737cf6
commit ada5ada264

@ -1,15 +1,15 @@
import 'dart:async';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_bloc/flame_bloc.dart';
import 'package:pinball/game/behaviors/behaviors.dart'; import 'package:pinball/game/behaviors/behaviors.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
/// {@template ramp_bonus_behavior} /// {@template ramp_bonus_behavior}
/// Increases the score when a [Ball] is shot 10 times into the [SpaceshipRamp]. /// Increases the score when a [Ball] is shot 10 times into the [SpaceshipRamp].
/// {@endtemplate} /// {@endtemplate}
class RampBonusBehavior extends Component with ParentIsA<FlameBlocProvider> { class RampBonusBehavior extends Component
with
HasGameRef,
FlameBlocListenable<SpaceshipRampCubit, SpaceshipRampState> {
/// {@macro ramp_bonus_behavior} /// {@macro ramp_bonus_behavior}
RampBonusBehavior({ RampBonusBehavior({
required Points points, required Points points,
@ -19,26 +19,24 @@ class RampBonusBehavior extends Component with ParentIsA<FlameBlocProvider> {
final Points _points; final Points _points;
@override @override
Future<void> onLoad() async { bool listenWhen(
await super.onLoad(); SpaceshipRampState previousState,
await add( SpaceshipRampState newState,
FlameBlocListener<SpaceshipRampCubit, SpaceshipRampState>( ) {
listenWhen: (previousState, newState) { final hasChanged = previousState.hits != newState.hits;
final hasChanged = previousState.hits != newState.hits; final hasHit = newState.hits != 0;
final hasHit = newState.hits != 0; final achievedOneMillionPoints = newState.hits % 10 == 0;
final achievedOneMillionPoints = newState.hits % 10 == 0;
return hasChanged && hasHit && achievedOneMillionPoints;
}
return hasChanged && hasHit && achievedOneMillionPoints; @override
}, void onNewState(SpaceshipRampState state) {
onNewState: (state) { gameRef.add(
parent.add( ScoringBehavior(
ScoringBehavior( points: _points,
points: _points, position: Vector2(0, -60),
position: Vector2(0, -60), duration: 2,
duration: 2,
),
);
},
), ),
); );
} }

@ -1,36 +1,27 @@
import 'dart:async';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_bloc/flame_bloc.dart';
import 'package:pinball/game/game.dart'; 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 ramp_multiplier_behavior}
/// Increases the multiplier when a [Ball] is shot 5 times into the /// Increases the multiplier when a [Ball] is shot 5 times into the
/// [SpaceshipRamp]. /// [SpaceshipRamp].
/// {@endtemplate} class RampMultiplierBehavior extends Component
class RampMultiplierBehavior extends Component { with FlameBlocListenable<SpaceshipRampCubit, SpaceshipRampState> {
/// {@macro ramp_multiplier_behavior} @override
RampMultiplierBehavior() : super(); bool listenWhen(
SpaceshipRampState previousState,
SpaceshipRampState newState,
) {
final hasChanged =
previousState.hits != newState.hits && newState.hits != 0;
final achievedFiveShots = newState.hits % 5 == 0;
final canIncrease = readBloc<GameBloc, GameState>().state.multiplier != 6;
return hasChanged && achievedFiveShots && canIncrease;
}
@override @override
Future<void> onLoad() async { void onNewState(SpaceshipRampState state) {
await super.onLoad(); readBloc<GameBloc, GameState>().add(const MultiplierIncreased());
await add(
FlameBlocListener<SpaceshipRampCubit, SpaceshipRampState>(
listenWhen: (previousState, newState) {
final hasChanged =
previousState.hits != newState.hits && newState.hits != 0;
final achievedFiveShots = newState.hits % 5 == 0;
final canIncrease =
readBloc<GameBloc, GameState>().state.multiplier != 6;
return hasChanged && achievedFiveShots && canIncrease;
},
onNewState: (state) {
readBloc<GameBloc, GameState>().add(const MultiplierIncreased());
},
),
);
} }
} }

@ -1,43 +1,34 @@
import 'dart:async';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_bloc/flame_bloc.dart';
import 'package:pinball/game/game.dart'; 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 ramp_progress_behavior}
/// Changes arrow lit when a [Ball] is shot into the [SpaceshipRamp]. /// Changes arrow lit when a [Ball] is shot into the [SpaceshipRamp].
/// {@endtemplate} class RampProgressBehavior extends Component
class RampProgressBehavior extends Component { with FlameBlocListenable<SpaceshipRampCubit, SpaceshipRampState> {
/// {@macro ramp_progress_behavior} @override
RampProgressBehavior() : super(); bool listenWhen(
SpaceshipRampState previousState,
SpaceshipRampState newState,
) {
return previousState.hits != newState.hits && newState.hits != 0;
}
@override @override
Future<void> onLoad() async { void onNewState(SpaceshipRampState state) {
await super.onLoad(); final gameBloc = readBloc<GameBloc, GameState>();
await add( final spaceshipCubit = readBloc<SpaceshipRampCubit, SpaceshipRampState>();
FlameBlocListener<SpaceshipRampCubit, SpaceshipRampState>(
listenWhen: (previousState, newState) =>
previousState.hits != newState.hits && newState.hits != 0,
onNewState: (state) {
final gameBloc = readBloc<GameBloc, GameState>();
final spaceshipCubit =
readBloc<SpaceshipRampCubit, SpaceshipRampState>();
final canProgress = !gameBloc.state.isMaxMultiplier || final canProgress = !gameBloc.state.isMaxMultiplier ||
(gameBloc.state.isMaxMultiplier && !state.fullArrowLit); (gameBloc.state.isMaxMultiplier && !state.fullArrowLit);
if (canProgress) { if (canProgress) {
spaceshipCubit.onProgressed(); spaceshipCubit.onProgressed();
} }
if (spaceshipCubit.state.fullArrowLit && if (spaceshipCubit.state.fullArrowLit && !gameBloc.state.isMaxMultiplier) {
!gameBloc.state.isMaxMultiplier) { spaceshipCubit.onProgressed();
spaceshipCubit.onProgressed(); }
}
},
),
);
} }
} }

@ -4,24 +4,16 @@ 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 ramp_reset_behavior}
/// Reset [SpaceshipRamp] state when GameState.rounds changes. /// Reset [SpaceshipRamp] state when GameState.rounds changes.
/// /// {@endtemplate} class RampResetBehavior extends Component
class RampResetBehavior extends Component { with FlameBlocListenable<GameBloc, GameState> {
/// {@macro ramp_reset_behavior} @override
RampResetBehavior() : super(); bool listenWhen(GameState previousState, GameState newState) {
return previousState.rounds != newState.rounds;
}
@override @override
Future<void> onLoad() async { void onNewState(GameState state) {
await super.onLoad(); readBloc<SpaceshipRampCubit, SpaceshipRampState>().onReset();
await add(
FlameBlocListener<GameBloc, GameState>(
listenWhen: (previousState, newState) =>
previousState.rounds != newState.rounds,
onNewState: (state) {
readBloc<SpaceshipRampCubit, SpaceshipRampState>().onReset();
},
),
);
} }
} }

@ -1,15 +1,15 @@
import 'dart:async';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_bloc/flame_bloc.dart';
import 'package:pinball/game/behaviors/behaviors.dart'; import 'package:pinball/game/behaviors/behaviors.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
/// {@template ramp_shot_behavior} /// {@template ramp_shot_behavior}
/// Increases the score when a [Ball] is shot into the [SpaceshipRamp]. /// Increases the score when a [Ball] is shot into the [SpaceshipRamp].
/// {@endtemplate} /// {@endtemplate}
class RampShotBehavior extends Component with ParentIsA<FlameBlocProvider> { class RampShotBehavior extends Component
with
HasGameRef,
FlameBlocListenable<SpaceshipRampCubit, SpaceshipRampState> {
/// {@macro ramp_shot_behavior} /// {@macro ramp_shot_behavior}
RampShotBehavior({ RampShotBehavior({
required Points points, required Points points,
@ -19,20 +19,19 @@ class RampShotBehavior extends Component with ParentIsA<FlameBlocProvider> {
final Points _points; final Points _points;
@override @override
Future<void> onLoad() async { bool listenWhen(
await super.onLoad(); SpaceshipRampState previousState,
await add( SpaceshipRampState newState,
FlameBlocListener<SpaceshipRampCubit, SpaceshipRampState>( ) {
listenWhen: (previousState, newState) => return previousState.hits != newState.hits && newState.hits != 0;
previousState.hits != newState.hits && newState.hits != 0, }
onNewState: (state) {
parent.add( @override
ScoringBehavior( void onNewState(SpaceshipRampState state) {
points: _points, gameRef.add(
position: Vector2(0, -45), ScoringBehavior(
), points: _points,
); position: Vector2(0, -45),
},
), ),
); );
} }

@ -25,10 +25,7 @@ class SpaceshipRampCubit extends Cubit<SpaceshipRampState> {
void onReset() { void onReset() {
emit( emit(
const SpaceshipRampState( const SpaceshipRampState.initial(),
hits: 0,
lightState: ArrowLightState.inactive,
),
); );
} }
} }

@ -171,7 +171,11 @@ class _SpaceshipRampBackgroundRampSpriteComponent extends SpriteComponent
/// {@endtemplate} /// {@endtemplate}
@visibleForTesting @visibleForTesting
class SpaceshipRampArrowSpriteComponent class SpaceshipRampArrowSpriteComponent
extends SpriteGroupComponent<ArrowLightState> with HasGameRef, ZIndex { extends SpriteGroupComponent<ArrowLightState>
with
HasGameRef,
ZIndex,
FlameBlocListenable<SpaceshipRampCubit, SpaceshipRampState> {
/// {@macro spaceship_ramp_arrow_sprite_component} /// {@macro spaceship_ramp_arrow_sprite_component}
SpaceshipRampArrowSpriteComponent() SpaceshipRampArrowSpriteComponent()
: super( : super(
@ -181,17 +185,22 @@ class SpaceshipRampArrowSpriteComponent
zIndex = ZIndexes.spaceshipRampArrow; zIndex = ZIndexes.spaceshipRampArrow;
} }
@override
bool listenWhen(
SpaceshipRampState previousState,
SpaceshipRampState newState,
) {
return previousState.lightState != newState.lightState;
}
@override
void onNewState(SpaceshipRampState state) {
current = state.lightState;
}
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
await add(
FlameBlocListener<SpaceshipRampCubit, SpaceshipRampState>(
listenWhen: (previousState, newState) =>
previousState.lightState != newState.lightState,
onNewState: (state) => current = state.lightState,
),
);
final sprites = <ArrowLightState, Sprite>{}; final sprites = <ArrowLightState, Sprite>{};
this.sprites = sprites; this.sprites = sprites;
for (final spriteState in ArrowLightState.values) { for (final spriteState in ArrowLightState.values) {

@ -107,7 +107,7 @@ packages:
source: hosted source: hosted
version: "1.1.1" version: "1.1.1"
flame_bloc: flame_bloc:
dependency: "direct main" dependency: transitive
description: description:
name: flame_bloc name: flame_bloc
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"

@ -9,7 +9,6 @@ environment:
dependencies: dependencies:
dashbook: ^0.1.7 dashbook: ^0.1.7
flame: ^1.1.1 flame: ^1.1.1
flame_bloc: ^1.4.0
flame_forge2d: flame_forge2d:
git: git:
url: https://github.com/flame-engine/flame url: https://github.com/flame-engine/flame

@ -28,9 +28,6 @@ class _TestGame extends Forge2DGame {
Assets.images.android.ramp.arrow.active3.keyName, Assets.images.android.ramp.arrow.active3.keyName,
Assets.images.android.ramp.arrow.active4.keyName, Assets.images.android.ramp.arrow.active4.keyName,
Assets.images.android.ramp.arrow.active5.keyName, Assets.images.android.ramp.arrow.active5.keyName,
Assets.images.android.rail.main.keyName,
Assets.images.android.rail.exit.keyName,
Assets.images.score.fiveThousand.keyName,
]); ]);
} }

@ -28,9 +28,6 @@ class _TestGame extends Forge2DGame {
Assets.images.android.ramp.arrow.active3.keyName, Assets.images.android.ramp.arrow.active3.keyName,
Assets.images.android.ramp.arrow.active4.keyName, Assets.images.android.ramp.arrow.active4.keyName,
Assets.images.android.ramp.arrow.active5.keyName, Assets.images.android.ramp.arrow.active5.keyName,
Assets.images.android.rail.main.keyName,
Assets.images.android.rail.exit.keyName,
Assets.images.score.fiveThousand.keyName,
]); ]);
} }

Loading…
Cancel
Save