diff --git a/packages/pinball_components/lib/src/components/launch_ramp.dart b/packages/pinball_components/lib/src/components/launch_ramp.dart index 2eea7a91..deaa3941 100644 --- a/packages/pinball_components/lib/src/components/launch_ramp.dart +++ b/packages/pinball_components/lib/src/components/launch_ramp.dart @@ -11,6 +11,9 @@ import 'package:pinball_components/pinball_components.dart'; /// [_LaunchRampForegroundRailing]. /// {@endtemplate} class LaunchRamp extends Forge2DBlueprint { + /// Base priority for [Ball] while inside [LaunchRamp]. + static const ballPriorityInsideRamp = 0; + @override void build(_) { addAllContactCallback([ @@ -40,7 +43,10 @@ class LaunchRamp extends Forge2DBlueprint { /// {@endtemplate} class _LaunchRampBase extends BodyComponent with InitialPosition, Layered { /// {@macro launch_ramp_base} - _LaunchRampBase() : super(priority: -1) { + _LaunchRampBase() + : super( + priority: LaunchRamp.ballPriorityInsideRamp - 1, + ) { layer = Layer.launcher; } @@ -143,7 +149,10 @@ class _LaunchRampBaseSpriteComponent extends SpriteComponent with HasGameRef { class _LaunchRampForegroundRailing extends BodyComponent with InitialPosition, Layered { /// {@macro launch_ramp_foreground_railing} - _LaunchRampForegroundRailing() : super(priority: 1) { + _LaunchRampForegroundRailing() + : super( + priority: LaunchRamp.ballPriorityInsideRamp + 1, + ) { layer = Layer.launcher; } @@ -227,7 +236,7 @@ class _LaunchRampExit extends RampOpening { super( insideLayer: Layer.launcher, orientation: RampOrientation.down, - insidePriority: 3, + insidePriority: LaunchRamp.ballPriorityInsideRamp, ); final double _rotation; diff --git a/packages/pinball_components/lib/src/components/spaceship.dart b/packages/pinball_components/lib/src/components/spaceship.dart index 10144eef..6643a53a 100644 --- a/packages/pinball_components/lib/src/components/spaceship.dart +++ b/packages/pinball_components/lib/src/components/spaceship.dart @@ -37,7 +37,7 @@ class Spaceship extends Forge2DBlueprint { AndroidHead()..initialPosition = position, SpaceshipHole( outsideLayer: Layer.spaceshipExitRail, - outsidePriority: SpaceshipRail.ballPriorityWhenOnSpaceshipRail, + outsidePriority: SpaceshipRail.ballPriorityInsideRail, )..initialPosition = position - Vector2(5.2, 4.8), SpaceshipHole()..initialPosition = position - Vector2(-7.2, 0.8), SpaceshipWall()..initialPosition = position, diff --git a/packages/pinball_components/lib/src/components/spaceship_rail.dart b/packages/pinball_components/lib/src/components/spaceship_rail.dart index 2cc8bccc..b63e401a 100644 --- a/packages/pinball_components/lib/src/components/spaceship_rail.dart +++ b/packages/pinball_components/lib/src/components/spaceship_rail.dart @@ -14,8 +14,8 @@ class SpaceshipRail extends Forge2DBlueprint { /// {@macro spaceship_rail} SpaceshipRail(); - /// Base priority for ball while be in [_SpaceshipRailRamp]. - static const ballPriorityWhenOnSpaceshipRail = 2; + /// Base priority for [Ball] while inside [SpaceshipRail]. + static const ballPriorityInsideRail = 2; @override void build(_) { @@ -45,9 +45,8 @@ class SpaceshipRail extends Forge2DBlueprint { class _SpaceshipRailRamp extends BodyComponent with InitialPosition, Layered { _SpaceshipRailRamp() : super( - priority: SpaceshipRail.ballPriorityWhenOnSpaceshipRail - 1, + priority: SpaceshipRail.ballPriorityInsideRail - 1, ) { - renderBody = false; layer = Layer.spaceshipExitRail; } @@ -139,6 +138,8 @@ class _SpaceshipRailRamp extends BodyComponent with InitialPosition, Layered { @override Future onLoad() async { await super.onLoad(); + renderBody = false; + await add(_SpaceshipRailRampSpriteComponent()); } } @@ -161,11 +162,7 @@ class _SpaceshipRailRampSpriteComponent extends SpriteComponent class _SpaceshipRailForeground extends SpriteComponent with HasGameRef { _SpaceshipRailForeground() - : super( - anchor: Anchor.center, - position: Vector2(-28.5, 19.7), - priority: SpaceshipRail.ballPriorityWhenOnSpaceshipRail + 1, - ); + : super(priority: SpaceshipRail.ballPriorityInsideRail + 1); @override Future onLoad() async { @@ -176,6 +173,8 @@ class _SpaceshipRailForeground extends SpriteComponent with HasGameRef { ); this.sprite = sprite; size = sprite.originalSize / 10; + anchor = Anchor.center; + position = Vector2(-28.5, 19.7); } } @@ -183,7 +182,7 @@ class _SpaceshipRailForeground extends SpriteComponent with HasGameRef { class _SpaceshipRailBase extends BodyComponent with InitialPosition, Layered { _SpaceshipRailBase({required this.radius}) : super( - priority: SpaceshipRail.ballPriorityWhenOnSpaceshipRail + 1, + priority: SpaceshipRail.ballPriorityInsideRail + 1, ) { renderBody = false; layer = Layer.board; @@ -213,9 +212,9 @@ class SpaceshipRailExit extends RampOpening { /// {@macro spaceship_rail_exit} SpaceshipRailExit() : super( - insideLayer: Layer.spaceshipExitRail, orientation: RampOrientation.down, - insidePriority: 3, + insideLayer: Layer.spaceshipExitRail, + insidePriority: SpaceshipRail.ballPriorityInsideRail, ) { renderBody = false; layer = Layer.spaceshipExitRail; @@ -224,10 +223,10 @@ class SpaceshipRailExit extends RampOpening { @override Shape get shape { return ArcShape( - center: Vector2(-28, -19), + center: Vector2(-29, -19), arcRadius: 2.5, angle: math.pi * 0.4, - rotation: -0.16, + rotation: 0.26, ); } } diff --git a/packages/pinball_components/lib/src/components/spaceship_ramp.dart b/packages/pinball_components/lib/src/components/spaceship_ramp.dart index 773b0441..452d101e 100644 --- a/packages/pinball_components/lib/src/components/spaceship_ramp.dart +++ b/packages/pinball_components/lib/src/components/spaceship_ramp.dart @@ -184,8 +184,6 @@ class _SpaceshipRampForegroundRailing extends BodyComponent @override Body createBody() { - renderBody = false; - final bodyDef = BodyDef() ..userData = this ..position = initialPosition; @@ -199,11 +197,13 @@ class _SpaceshipRampForegroundRailing extends BodyComponent @override Future onLoad() async { await super.onLoad(); - await add(_SpaceshipRampForegroundRalingSpriteComponent()); + renderBody = false; + + await add(_SpaceshipRampForegroundRailingSpriteComponent()); } } -class _SpaceshipRampForegroundRalingSpriteComponent extends SpriteComponent +class _SpaceshipRampForegroundRailingSpriteComponent extends SpriteComponent with HasGameRef { @override Future onLoad() async { @@ -221,13 +221,12 @@ class _SpaceshipRampForegroundRalingSpriteComponent extends SpriteComponent /// Represents the ground right base of the [SpaceshipRamp]. class _SpaceshipRampBase extends BodyComponent with InitialPosition, Layered { _SpaceshipRampBase() { + renderBody = false; layer = Layer.board; } @override Body createBody() { - renderBody = false; - const baseWidth = 6; final baseShape = BezierCurveShape( controlPoints: [ @@ -266,7 +265,9 @@ class _SpaceshipRampOpening extends RampOpening { orientation: RampOrientation.down, insidePriority: SpaceshipRamp.ballPriorityInsideRamp, outsidePriority: outsidePriority, - ); + ) { + renderBody = false; + } final double _rotation; @@ -274,7 +275,6 @@ class _SpaceshipRampOpening extends RampOpening { @override Shape get shape { - renderBody = false; return PolygonShape() ..setAsBox( _size.x, diff --git a/packages/pinball_components/sandbox/lib/main.dart b/packages/pinball_components/sandbox/lib/main.dart index b3b331a7..55a4dd88 100644 --- a/packages/pinball_components/sandbox/lib/main.dart +++ b/packages/pinball_components/sandbox/lib/main.dart @@ -25,5 +25,8 @@ void main() { addSparkyBumperStories(dashbook); addZoomStories(dashbook); addBoundariesStories(dashbook); + addSpaceshipRampStories(dashbook); + addSpaceshipRailStories(dashbook); + addLaunchRampStories(dashbook); runApp(dashbook); } diff --git a/packages/pinball_components/sandbox/lib/stories/ball/basic_ball_game.dart b/packages/pinball_components/sandbox/lib/stories/ball/basic_ball_game.dart index ee9fa88c..bfc7a9b0 100644 --- a/packages/pinball_components/sandbox/lib/stories/ball/basic_ball_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/ball/basic_ball_game.dart @@ -4,7 +4,11 @@ import 'package:pinball_components/pinball_components.dart'; import 'package:sandbox/common/common.dart'; class BasicBallGame extends BasicGame with TapDetector, Traceable { - BasicBallGame({required this.color}); + BasicBallGame({ + required this.color, + this.ballPriority = 0, + this.ballLayer = Layer.all, + }); static const info = ''' Shows how a Ball works. @@ -13,11 +17,16 @@ class BasicBallGame extends BasicGame with TapDetector, Traceable { '''; final Color color; + final int ballPriority; + final Layer ballLayer; @override void onTapUp(TapUpInfo info) { add( - Ball(baseColor: color)..initialPosition = info.eventPosition.game, + Ball(baseColor: color) + ..initialPosition = info.eventPosition.game + ..layer = ballLayer + ..priority = ballPriority, ); traceAllBodies(); } diff --git a/packages/pinball_components/sandbox/lib/stories/launch_ramp/launch_ramp_game.dart b/packages/pinball_components/sandbox/lib/stories/launch_ramp/launch_ramp_game.dart new file mode 100644 index 00000000..5258de86 --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/launch_ramp/launch_ramp_game.dart @@ -0,0 +1,36 @@ +import 'dart:async'; + +import 'package:flame/input.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:sandbox/stories/ball/basic_ball_game.dart'; + +class LaunchRampGame extends BasicBallGame { + LaunchRampGame() + : super( + color: Colors.blue, + ballPriority: LaunchRamp.ballPriorityInsideRamp, + ballLayer: Layer.launcher, + ); + + static const info = ''' + Shows how LaunchRamp are rendered. + + - Activate the "trace" parameter to overlay the body. + - Tap anywhere on the screen to spawn a ball into the game. +'''; + + @override + Future onLoad() async { + await super.onLoad(); + + camera + ..followVector2(Vector2(0, 0)) + ..zoom = 7.5; + + final launchRamp = LaunchRamp(); + unawaited(addFromBlueprint(launchRamp)); + + await traceAllBodies(); + } +} diff --git a/packages/pinball_components/sandbox/lib/stories/launch_ramp/stories.dart b/packages/pinball_components/sandbox/lib/stories/launch_ramp/stories.dart new file mode 100644 index 00000000..083a4584 --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/launch_ramp/stories.dart @@ -0,0 +1,15 @@ +import 'package:dashbook/dashbook.dart'; +import 'package:flame/game.dart'; +import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/launch_ramp/launch_ramp_game.dart'; + +void addLaunchRampStories(Dashbook dashbook) { + dashbook.storiesOf('LaunchRamp').add( + 'Basic', + (context) => GameWidget( + game: LaunchRampGame()..trace = context.boolProperty('Trace', true), + ), + codeLink: buildSourceLink('launch_ramp/basic.dart'), + info: LaunchRampGame.info, + ); +} diff --git a/packages/pinball_components/sandbox/lib/stories/spaceship_rail/spaceship_rail_game.dart b/packages/pinball_components/sandbox/lib/stories/spaceship_rail/spaceship_rail_game.dart new file mode 100644 index 00000000..cef04304 --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/spaceship_rail/spaceship_rail_game.dart @@ -0,0 +1,34 @@ +import 'dart:async'; + +import 'package:flame/input.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:sandbox/stories/ball/basic_ball_game.dart'; + +class SpaceshipRailGame extends BasicBallGame { + SpaceshipRailGame() + : super( + color: Colors.blue, + ballPriority: SpaceshipRail.ballPriorityInsideRail, + ballLayer: Layer.spaceshipExitRail, + ); + + static const info = ''' + Shows how SpaceshipRail are rendered. + + - Activate the "trace" parameter to overlay the body. + - Tap anywhere on the screen to spawn a ball into the game. +'''; + + @override + Future onLoad() async { + await super.onLoad(); + + camera.followVector2(Vector2(-30, -10)); + + final spaceshipRail = SpaceshipRail(); + unawaited(addFromBlueprint(spaceshipRail)); + + await traceAllBodies(); + } +} diff --git a/packages/pinball_components/sandbox/lib/stories/spaceship_rail/stories.dart b/packages/pinball_components/sandbox/lib/stories/spaceship_rail/stories.dart new file mode 100644 index 00000000..e69ed1db --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/spaceship_rail/stories.dart @@ -0,0 +1,16 @@ +import 'package:dashbook/dashbook.dart'; +import 'package:flame/game.dart'; +import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/spaceship_rail/spaceship_rail_game.dart'; + +void addSpaceshipRailStories(Dashbook dashbook) { + dashbook.storiesOf('SpaceshipRail').add( + 'Basic', + (context) => GameWidget( + game: SpaceshipRailGame() + ..trace = context.boolProperty('Trace', true), + ), + codeLink: buildSourceLink('spaceship_rail/basic.dart'), + info: SpaceshipRailGame.info, + ); +} diff --git a/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/spaceship_ramp_game.dart b/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/spaceship_ramp_game.dart new file mode 100644 index 00000000..e3850da3 --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/spaceship_ramp_game.dart @@ -0,0 +1,34 @@ +import 'dart:async'; + +import 'package:flame/input.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:sandbox/stories/ball/basic_ball_game.dart'; + +class SpaceshipRampGame extends BasicBallGame { + SpaceshipRampGame() + : super( + color: Colors.blue, + ballPriority: SpaceshipRamp.ballPriorityInsideRamp, + ballLayer: Layer.spaceshipEntranceRamp, + ); + + static const info = ''' + Shows how SpaceshipRamp are rendered. + + - Activate the "trace" parameter to overlay the body. + - Tap anywhere on the screen to spawn a ball into the game. +'''; + + @override + Future onLoad() async { + await super.onLoad(); + + camera.followVector2(Vector2(-10, -20)); + + final spaceshipRamp = SpaceshipRamp(); + unawaited(addFromBlueprint(spaceshipRamp)); + + await traceAllBodies(); + } +} diff --git a/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/stories.dart b/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/stories.dart new file mode 100644 index 00000000..f0aeadff --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/stories.dart @@ -0,0 +1,16 @@ +import 'package:dashbook/dashbook.dart'; +import 'package:flame/game.dart'; +import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/spaceship_ramp/spaceship_ramp_game.dart'; + +void addSpaceshipRampStories(Dashbook dashbook) { + dashbook.storiesOf('SpaceshipRamp').add( + 'Basic', + (context) => GameWidget( + game: SpaceshipRampGame() + ..trace = context.boolProperty('Trace', true), + ), + codeLink: buildSourceLink('spaceship_ramp/basic.dart'), + info: SpaceshipRampGame.info, + ); +} diff --git a/packages/pinball_components/sandbox/lib/stories/stories.dart b/packages/pinball_components/sandbox/lib/stories/stories.dart index 009f53ac..feea2532 100644 --- a/packages/pinball_components/sandbox/lib/stories/stories.dart +++ b/packages/pinball_components/sandbox/lib/stories/stories.dart @@ -5,8 +5,11 @@ export 'chrome_dino/stories.dart'; export 'effects/stories.dart'; export 'flipper/stories.dart'; export 'flutter_forest/stories.dart'; +export 'launch_ramp/stories.dart'; export 'layer/stories.dart'; export 'slingshot/stories.dart'; export 'spaceship/stories.dart'; +export 'spaceship_rail/stories.dart'; +export 'spaceship_ramp/stories.dart'; export 'sparky_bumper/stories.dart'; export 'zoom/stories.dart';