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

@ -1,36 +1,27 @@
import 'dart:async';
import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
/// {@template ramp_multiplier_behavior}
/// Increases the multiplier when a [Ball] is shot 5 times into the
/// [SpaceshipRamp].
/// {@endtemplate}
class RampMultiplierBehavior extends Component {
/// {@macro ramp_multiplier_behavior}
RampMultiplierBehavior() : super();
class RampMultiplierBehavior extends Component
with FlameBlocListenable<SpaceshipRampCubit, SpaceshipRampState> {
@override
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
Future<void> onLoad() async {
await super.onLoad();
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());
},
),
);
void onNewState(SpaceshipRampState state) {
readBloc<GameBloc, GameState>().add(const MultiplierIncreased());
}
}

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

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

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

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

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

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

@ -9,7 +9,6 @@ environment:
dependencies:
dashbook: ^0.1.7
flame: ^1.1.1
flame_bloc: ^1.4.0
flame_forge2d:
git:
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.active4.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.active4.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