diff --git a/lib/flame/component_controller.dart b/lib/flame/component_controller.dart index c52e46bf..a4c9c572 100644 --- a/lib/flame/component_controller.dart +++ b/lib/flame/component_controller.dart @@ -16,6 +16,7 @@ abstract class ComponentController extends Component { /// Ads the [ComponentController] to its [component]. Future attach() async { + // TODO(alestiago): check if component already attached. await component.add(this); } diff --git a/lib/game/components/ball.dart b/lib/game/components/ball_controller.dart similarity index 69% rename from lib/game/components/ball.dart rename to lib/game/components/ball_controller.dart index 91eb2571..ffc8d5f3 100644 --- a/lib/game/components/ball.dart +++ b/lib/game/components/ball_controller.dart @@ -1,4 +1,5 @@ import 'package:flame/components.dart'; +import 'package:flame_forge2d/forge2d_game.dart'; import 'package:pinball/flame/flame.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -6,8 +7,7 @@ import 'package:pinball_components/pinball_components.dart'; /// {@template ball_controller} /// Controller attached to a [Ball] that handles its game related logic. /// {@endtemplate} -class BallController extends ComponentController - with HasGameRef { +class BallController extends ComponentController { /// {@macro ball_controller} BallController(Ball ball) : super(ball); @@ -17,6 +17,19 @@ class BallController extends ComponentController /// Triggered by [BottomWallBallContactCallback] when the [Ball] falls into /// a [BottomWall]. void lost() { + component.shouldRemove = true; + } +} + +/// {@macro ball_controller} +class PlungerBallController extends BallController + with HasGameRef { + /// {@macro ball_controller} + PlungerBallController(Ball ball) : super(ball); + + @override + void lost() { + super.lost(); final bloc = gameRef.read()..add(const BallLost()); final shouldBallRespwan = !bloc.state.isLastBall && !bloc.state.isGameOver; diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index 3c1a4302..3fad782b 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -1,4 +1,4 @@ -export 'ball.dart'; +export 'ball_controller.dart'; export 'baseboard.dart'; export 'board.dart'; export 'bonus_word.dart'; diff --git a/lib/game/components/flutter_forest.dart b/lib/game/components/flutter_forest.dart index a5544ac8..bf28ebe3 100644 --- a/lib/game/components/flutter_forest.dart +++ b/lib/game/components/flutter_forest.dart @@ -31,11 +31,12 @@ class FlutterForest extends Component @override void onNewState(GameState state) { super.onNewState(state); - gameRef.add( - Ball( - baseColor: gameRef.theme.characterTheme.ballColor, - )..initialPosition = Vector2(17.2, 52.7), - ); + + final ball = Ball( + baseColor: gameRef.theme.characterTheme.ballColor, + )..initialPosition = Vector2(17.2, 52.7); + BallController(ball).attach(); + gameRef.add(ball); } @override diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 6505bd09..ec88328b 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -107,7 +107,7 @@ class PinballGame extends Forge2DGame plunger.body.position.x, plunger.body.position.y + Ball.size.y, ); - BallController(ball).attach(); + PlungerBallController(ball).attach(); add(ball); } } @@ -140,9 +140,9 @@ class DebugPinballGame extends PinballGame with TapDetector { @override void onTapUp(TapUpInfo info) { - add( - Ball(baseColor: const Color(0xFFFF0000)) - ..initialPosition = info.eventPosition.game, - ); + final ball = Ball(baseColor: const Color(0xFFFF0000)) + ..initialPosition = info.eventPosition.game; + BallController(ball).attach(); + add(ball); } }