diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index a255e652..9192a77e 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -16,4 +16,5 @@ export 'ramp_opening.dart'; export 'round_bumper.dart'; export 'score_points.dart'; export 'spaceship.dart'; +export 'spaceship_drop_ramp.dart'; export 'wall.dart'; diff --git a/lib/game/components/layer.dart b/lib/game/components/layer.dart index 3cc0471f..66db7f72 100644 --- a/lib/game/components/layer.dart +++ b/lib/game/components/layer.dart @@ -58,6 +58,9 @@ enum Layer { /// Collide only with Spaceship group elements. spaceship, + + /// Collide only with Spaceship drop group elements. + spaceship_drop, } /// {@template layer_mask_bits} @@ -86,6 +89,8 @@ extension LayerMaskBits on Layer { return 0x0005; case Layer.spaceship: return 0x000A; + case Layer.spaceship_drop: + return 0x0004; } } } diff --git a/lib/game/components/spaceship_drop_ramp.dart b/lib/game/components/spaceship_drop_ramp.dart new file mode 100644 index 00000000..9b5b99f3 --- /dev/null +++ b/lib/game/components/spaceship_drop_ramp.dart @@ -0,0 +1,72 @@ +import 'dart:math' as math; +import 'dart:ui'; + +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball/flame/blueprint.dart'; +import 'package:pinball/game/game.dart'; + +class SpaceshipDropRamp extends Forge2DBlueprint { + @override + void build() { + final position = Vector2( + PinballGame.boardBounds.left + 23, + PinballGame.boardBounds.center.dy + 25, + ); + + addAllContactCallback([ + SpaceshipHoleBallContactCallback(), + SpaceshipEntranceBallContactCallback(), + ]); + + final curvedPath = Pathway.bezierCurve( + color: Color.fromARGB(255, 226, 226, 218), + width: 5, + rotation: 230 * math.pi / 180, + controlPoints: [ + Vector2(0, 0), + Vector2(0, 30), + Vector2(30, 0), + Vector2(30, 30), + ], + )..layer = Layer.spaceship_drop; + + addAll([ + curvedPath..initialPosition = position, + ]); + } +} + +class SpaceshipRampEntrance extends RampOpening { + /// {@macro spaceship_ramp_entrance} + SpaceshipRampEntrance() + : super( + pathwayLayer: Layer.spaceship_drop, + orientation: RampOrientation.up, + ) { + layer = Layer.spaceship_drop; + } + + @override + Shape get shape { + const radius = Spaceship.radius * 2; + return PolygonShape(); + } +} + +class SpaceshipRampExit extends RampOpening { + /// {@macro spaceship_ramp_entrance} + SpaceshipRampExit() + : super( + pathwayLayer: Layer.spaceship_drop, + orientation: RampOrientation.down, + ) { + layer = Layer.spaceship_drop; + } + + @override + Shape get shape { + const radius = Spaceship.radius * 2; + return PolygonShape(); + } +} diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 44a7ec01..836b7520 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -83,6 +83,8 @@ class PinballGame extends Forge2DGame } Future _addPaths() async { + unawaited(addFromBlueprint(SpaceshipDropRamp())); + final jetpackRamp = JetpackRamp( position: Vector2( PinballGame.boardBounds.left + 40.5,