refactor: removed ids from Bumpers

pull/190/head
alestiago 3 years ago
parent 9ece8fea94
commit 1207a51df9

@ -13,8 +13,6 @@ import 'package:pinball_flame/pinball_flame.dart';
/// When all [DashNestBumper]s are hit at least once, the [GameBonus.dashNest] /// When all [DashNestBumper]s are hit at least once, the [GameBonus.dashNest]
/// is awarded, and the [BigDashNestBumper] releases a new [Ball]. /// is awarded, and the [BigDashNestBumper] releases a new [Ball].
/// {@endtemplate} /// {@endtemplate}
// TODO(alestiago): Make a [Blueprint] once [Blueprint] inherits from
// [Component].
class FlutterForest extends Component class FlutterForest extends Component
with Controls<_FlutterForestController>, HasGameRef<PinballGame> { with Controls<_FlutterForestController>, HasGameRef<PinballGame> {
/// {@macro flutter_forest} /// {@macro flutter_forest}
@ -25,17 +23,16 @@ class FlutterForest extends Component
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
gameRef.addContactCallback(_DashNestBumperBallContactCallback());
final signPost = FlutterSignPost()..initialPosition = Vector2(8.35, 58.3); final signPost = FlutterSignPost()..initialPosition = Vector2(8.35, 58.3);
final bigNest = _ControlledBigDashNestBumper( final bigNest = _BigDashNestBumper()
id: 'big_nest_bumper', ..initialPosition = Vector2(18.55, 59.35);
)..initialPosition = Vector2(18.55, -59.35); final smallLeftNest = _SmallDashNestBumper.a()
final smallLeftNest = _ControlledSmallDashNestBumper.a( ..initialPosition = Vector2(8.95, 51.95);
id: 'small_nest_bumper_a', final smallRightNest = _SmallDashNestBumper.b()
)..initialPosition = Vector2(8.95, -51.95); ..initialPosition = Vector2(23.3, 46.75);
final smallRightNest = _ControlledSmallDashNestBumper.b(
id: 'small_nest_bumper_b',
)..initialPosition = Vector2(23.3, -46.75);
final dashAnimatronic = DashAnimatronic()..position = Vector2(20, -66); final dashAnimatronic = DashAnimatronic()..position = Vector2(20, -66);
await addAll([ await addAll([
@ -52,13 +49,18 @@ class _FlutterForestController extends ComponentController<FlutterForest>
with HasGameRef<PinballGame> { with HasGameRef<PinballGame> {
_FlutterForestController(FlutterForest flutterForest) : super(flutterForest); _FlutterForestController(FlutterForest flutterForest) : super(flutterForest);
final _activatedBumpers = <String>{}; final _activatedBumpers = <DashNestBumper>{};
void activateBumper(DashNestBumper dashNestBumper) {
if (!_activatedBumpers.add(dashNestBumper)) return;
void activateBumper(String id) { dashNestBumper.activate();
if (!_activatedBumpers.add(id)) return;
final activatedBonus = _activatedBumpers.length == 3; final activatedBonus = _activatedBumpers.length == 3;
if (activatedBonus) { if (activatedBonus) {
children.whereType<DashNestBumper>().forEach(
(dashNestBumper) => dashNestBumper.deactivate(),
);
// gameRef.read<GameBloc>().add(const BonusActivated(GameBonus.dashNest)); // gameRef.read<GameBloc>().add(const BonusActivated(GameBonus.dashNest));
_addBonusBall(); _addBonusBall();
_activatedBumpers.clear(); _activatedBumpers.clear();
@ -74,53 +76,29 @@ class _FlutterForestController extends ComponentController<FlutterForest>
} }
} }
class _ControlledBigDashNestBumper extends BigDashNestBumper with ScorePoints { // TODO(alestiago): Revisit ScorePoints logic once the FlameForge2D
_ControlledBigDashNestBumper({ // ContactCallback process is enhanced.
required this.id, class _BigDashNestBumper extends BigDashNestBumper with ScorePoints {
});
final String id;
@override @override
int get points => 20; int get points => 20;
} }
class _ControlledBigDashNestBumperBallContactCallback class _SmallDashNestBumper extends SmallDashNestBumper with ScorePoints {
extends ContactCallback<_ControlledBigDashNestBumper, Ball> { _SmallDashNestBumper.a() : super.a();
@override
void begin(_ControlledBigDashNestBumper controlledBigDashNestBumper, _, __) {
(controlledBigDashNestBumper.parent! as FlutterForest)
.controller
.activateBumper(controlledBigDashNestBumper.id);
}
}
class _ControlledSmallDashNestBumper extends SmallDashNestBumper
with ScorePoints {
_ControlledSmallDashNestBumper.a({
required this.id,
}) : super.a();
_ControlledSmallDashNestBumper.b({ _SmallDashNestBumper.b() : super.b();
required this.id,
}) : super.b();
final String id;
@override @override
int get points => 20; int get points => 20;
} }
class _ControlledSmallDashNestBumperBallContactCallback class _DashNestBumperBallContactCallback
extends ContactCallback<_ControlledSmallDashNestBumper, Ball> { extends ContactCallback<DashNestBumper, Ball> {
@override @override
void begin( void begin(DashNestBumper dashNestBumper, _, __) {
_ControlledSmallDashNestBumper controlledSmallDashNestBumper, if (dashNestBumper.parent is FlutterForest) return;
_,
__, final parent = dashNestBumper.parent! as FlutterForest;
) { parent.controller.activateBumper(dashNestBumper);
(controlledSmallDashNestBumper.parent! as FlutterForest)
.controller
.activateBumper(controlledSmallDashNestBumper.id);
} }
} }

@ -34,10 +34,7 @@ class BallScorePointsCallback extends ContactCallback<Ball, ScorePoints> {
ScorePoints scorePoints, ScorePoints scorePoints,
Contact __, Contact __,
) { ) {
_gameRef.read<GameBloc>().add( _gameRef.read<GameBloc>().add(Scored(points: scorePoints.points));
Scored(points: scorePoints.points),
);
_gameRef.audio.score(); _gameRef.audio.score();
} }
} }

@ -96,14 +96,13 @@ void main() {
'add Scored event', 'add Scored event',
setUp: (game, tester) async { setUp: (game, tester) async {
final flutterForest = FlutterForest(); final flutterForest = FlutterForest();
await game.ensureAdd(flutterForest); await game.ensureAddAll([
await game.ensureAdd(ball); flutterForest,
ball,
]);
game.addContactCallback(BallScorePointsCallback(game)); game.addContactCallback(BallScorePointsCallback(game));
final bumpers = flutterForest final bumpers = flutterForest.descendants().whereType<ScorePoints>();
.descendants()
.whereType<DashNestBumper>()
.whereType<ScorePoints>();
for (final bumper in bumpers) { for (final bumper in bumpers) {
beginContact(game, bumper, ball); beginContact(game, bumper, ball);

Loading…
Cancel
Save