diff --git a/lib/game/components/jetpack_ramp.dart b/lib/game/components/jetpack_ramp.dart index a69b2111..93f03c9e 100644 --- a/lib/game/components/jetpack_ramp.dart +++ b/lib/game/components/jetpack_ramp.dart @@ -1,63 +1,83 @@ +// ignore_for_file: public_member_api_docs + import 'dart:math' as math; import 'package:flame/components.dart'; import 'package:flame/extensions.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball/flame/blueprint.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; /// {@template jetpack_ramp} /// Represents the upper left blue ramp of the [Board]. /// {@endtemplate} -class JetpackRamp extends Component with HasGameRef { - /// {@macro jetpack_ramp} - JetpackRamp({ - required this.position, - }); - - /// The position of this [JetpackRamp]. - final Vector2 position; - +class Jetpack extends Forge2DBlueprint { @override - Future onLoad() async { - const layer = Layer.jetpack; - - gameRef.addContactCallback( - RampOpeningBallContactCallback<_JetpackRampOpening>(), + void build(_) { + final position = Vector2( + PinballGame.boardBounds.left + 40.5, + PinballGame.boardBounds.top - 31.5, ); - final curvePath = Pathway.arc( - // TODO(ruialonso): Remove color when not needed. - // TODO(ruialonso): Use a bezier curve once control points are defined. - color: const Color.fromARGB(255, 8, 218, 241), - center: position, - width: 5, - radius: 18, - angle: math.pi, - rotation: math.pi, - )..layer = layer; + addAllContactCallback([ + RampOpeningBallContactCallback<_JetpackRampOpening>(), + ]); - final leftOpening = _JetpackRampOpening( + final _leftOpening = _JetpackRampOpening( outsideLayer: Layer.spaceship, rotation: math.pi, ) ..initialPosition = position + Vector2(-2.5, -20.2) ..layer = Layer.jetpack; - final rightOpening = _JetpackRampOpening( + final _curve = JetpackRamp() + ..initialPosition = position + ..layer = Layer.jetpack; + + final _rightOpening = _JetpackRampOpening( rotation: math.pi, ) ..initialPosition = position + Vector2(12.9, -20.2) ..layer = Layer.opening; - await addAll([ - curvePath, - leftOpening, - rightOpening, + addAll([ + _leftOpening, + _curve, + _rightOpening, ]); } } +class JetpackRamp extends BodyComponent with InitialPosition, Layered { + JetpackRamp() : super(priority: 2) { + layer = Layer.jetpack; + paint = Paint() + ..color = const Color.fromARGB(255, 8, 218, 241) + ..style = PaintingStyle.stroke; + } + + @override + Body createBody() { + final curveShape = ArcShape( + center: initialPosition, + arcRadius: 18, + angle: math.pi, + rotation: math.pi, + ); + + final bodyDef = BodyDef() + ..userData = this + ..position = initialPosition; + + return world.createBody(bodyDef) + ..createFixture( + FixtureDef(curveShape), + ); + } +} + /// {@template jetpack_ramp_opening} /// [RampOpening] with [Layer.jetpack] to filter [Ball] collisions /// inside [JetpackRamp]. diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 681a6431..9f5055ef 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -82,12 +82,8 @@ class PinballGame extends Forge2DGame } Future _addPaths() async { - final jetpackRamp = JetpackRamp( - position: Vector2( - PinballGame.boardBounds.left + 40.5, - PinballGame.boardBounds.top - 31.5, - ), - ); + unawaited(addFromBlueprint(Jetpack())); + final launcherRamp = LauncherRamp( position: Vector2( PinballGame.boardBounds.right - 30, @@ -96,7 +92,6 @@ class PinballGame extends Forge2DGame ); await addAll([ - jetpackRamp, launcherRamp, ]); } diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index 677bbd0c..a7b09a2b 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -1,3 +1,4 @@ export 'ball.dart'; export 'initial_position.dart'; export 'layer.dart'; +export 'shapes/shapes.dart';