diff --git a/lib/game/components/android_acres.dart b/lib/game/components/android_acres.dart index 8b5fe718..da8e4949 100644 --- a/lib/game/components/android_acres.dart +++ b/lib/game/components/android_acres.dart @@ -6,8 +6,8 @@ import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// {@template android_acres} -/// Area positioned on the left side of the board containing the [Spaceship], -/// [SpaceshipRamp], [SpaceshipRail], and [AndroidBumper]s. +/// Area positioned on the left side of the board containing the +/// [AndroidSpaceship], [SpaceshipRamp], [SpaceshipRail], and [AndroidBumper]s. /// {@endtemplate} class AndroidAcres extends Blueprint { /// {@macro android_acres} @@ -32,7 +32,7 @@ class AndroidAcres extends Blueprint { ], blueprints: [ SpaceshipRamp(), - Spaceship(position: Vector2(-26.5, -28.5)), + AndroidSpaceship(position: Vector2(-26.5, -28.5)), SpaceshipRail(), ], ); diff --git a/lib/game/components/bottom_group.dart b/lib/game/components/bottom_group.dart index 5d0cf97e..921a8e58 100644 --- a/lib/game/components/bottom_group.dart +++ b/lib/game/components/bottom_group.dart @@ -16,6 +16,7 @@ class BottomGroup extends Component { _BottomGroupSide(side: BoardSide.right), _BottomGroupSide(side: BoardSide.left), ], + priority: RenderPriority.bottomGroup, ); } @@ -28,8 +29,7 @@ class _BottomGroupSide extends Component { /// {@macro bottom_group_side} _BottomGroupSide({ required BoardSide side, - }) : _side = side, - super(priority: RenderPriority.bottomGroup); + }) : _side = side; final BoardSide _side; diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index a8c3c82e..ab7a6169 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -50,41 +50,42 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.boundary.bottom.keyName), images.load(components.Assets.images.boundary.outer.keyName), images.load(components.Assets.images.boundary.outerBottom.keyName), - images.load(components.Assets.images.spaceship.saucer.keyName), - images.load(components.Assets.images.spaceship.bridge.keyName), - images.load(components.Assets.images.spaceship.ramp.boardOpening.keyName), + images.load(components.Assets.images.android.spaceship.saucer.keyName), + images + .load(components.Assets.images.android.spaceship.animatronic.keyName), + images.load(components.Assets.images.android.spaceship.lightBeam.keyName), + images.load(components.Assets.images.android.ramp.boardOpening.keyName), images.load( - components.Assets.images.spaceship.ramp.railingForeground.keyName, + components.Assets.images.android.ramp.railingForeground.keyName, ), images.load( - components.Assets.images.spaceship.ramp.railingBackground.keyName, + components.Assets.images.android.ramp.railingBackground.keyName, ), - images.load(components.Assets.images.spaceship.ramp.main.keyName), - images - .load(components.Assets.images.spaceship.ramp.arrow.inactive.keyName), + images.load(components.Assets.images.android.ramp.main.keyName), + images.load(components.Assets.images.android.ramp.arrow.inactive.keyName), images.load( - components.Assets.images.spaceship.ramp.arrow.active1.keyName, + components.Assets.images.android.ramp.arrow.active1.keyName, ), images.load( - components.Assets.images.spaceship.ramp.arrow.active2.keyName, + components.Assets.images.android.ramp.arrow.active2.keyName, ), images.load( - components.Assets.images.spaceship.ramp.arrow.active3.keyName, + components.Assets.images.android.ramp.arrow.active3.keyName, ), images.load( - components.Assets.images.spaceship.ramp.arrow.active4.keyName, + components.Assets.images.android.ramp.arrow.active4.keyName, ), images.load( - components.Assets.images.spaceship.ramp.arrow.active5.keyName, + components.Assets.images.android.ramp.arrow.active5.keyName, ), - images.load(components.Assets.images.spaceship.rail.main.keyName), - images.load(components.Assets.images.spaceship.rail.exit.keyName), - images.load(components.Assets.images.androidBumper.a.lit.keyName), - images.load(components.Assets.images.androidBumper.a.dimmed.keyName), - images.load(components.Assets.images.androidBumper.b.lit.keyName), - images.load(components.Assets.images.androidBumper.b.dimmed.keyName), - images.load(components.Assets.images.androidBumper.cow.lit.keyName), - images.load(components.Assets.images.androidBumper.cow.dimmed.keyName), + images.load(components.Assets.images.android.rail.main.keyName), + images.load(components.Assets.images.android.rail.exit.keyName), + images.load(components.Assets.images.android.bumper.a.lit.keyName), + images.load(components.Assets.images.android.bumper.a.dimmed.keyName), + images.load(components.Assets.images.android.bumper.b.lit.keyName), + images.load(components.Assets.images.android.bumper.b.dimmed.keyName), + images.load(components.Assets.images.android.bumper.cow.lit.keyName), + images.load(components.Assets.images.android.bumper.cow.dimmed.keyName), images.load(components.Assets.images.sparky.computer.top.keyName), images.load(components.Assets.images.sparky.computer.base.keyName), images.load(components.Assets.images.sparky.animatronic.keyName), diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 262a3e29..6933e649 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -49,7 +49,6 @@ class PinballGame extends Forge2DGame await add(Drain()); await add(BottomGroup()); unawaited(addFromBlueprint(Boundaries())); - unawaited(addFromBlueprint(LaunchRamp())); final launcher = Launcher(); unawaited(addFromBlueprint(launcher)); @@ -68,7 +67,7 @@ class PinballGame extends Forge2DGame ), ); - controller.attachTo(launcher.components.whereType().first); + controller.attachTo(launcher.components.whereType().single); await super.onLoad(); } diff --git a/packages/pinball_components/assets/images/android_bumper/a/dimmed.png b/packages/pinball_components/assets/images/android/bumper/a/dimmed.png similarity index 100% rename from packages/pinball_components/assets/images/android_bumper/a/dimmed.png rename to packages/pinball_components/assets/images/android/bumper/a/dimmed.png diff --git a/packages/pinball_components/assets/images/android_bumper/a/lit.png b/packages/pinball_components/assets/images/android/bumper/a/lit.png similarity index 100% rename from packages/pinball_components/assets/images/android_bumper/a/lit.png rename to packages/pinball_components/assets/images/android/bumper/a/lit.png diff --git a/packages/pinball_components/assets/images/android_bumper/b/dimmed.png b/packages/pinball_components/assets/images/android/bumper/b/dimmed.png similarity index 100% rename from packages/pinball_components/assets/images/android_bumper/b/dimmed.png rename to packages/pinball_components/assets/images/android/bumper/b/dimmed.png diff --git a/packages/pinball_components/assets/images/android_bumper/b/lit.png b/packages/pinball_components/assets/images/android/bumper/b/lit.png similarity index 100% rename from packages/pinball_components/assets/images/android_bumper/b/lit.png rename to packages/pinball_components/assets/images/android/bumper/b/lit.png diff --git a/packages/pinball_components/assets/images/android_bumper/cow/dimmed.png b/packages/pinball_components/assets/images/android/bumper/cow/dimmed.png similarity index 100% rename from packages/pinball_components/assets/images/android_bumper/cow/dimmed.png rename to packages/pinball_components/assets/images/android/bumper/cow/dimmed.png diff --git a/packages/pinball_components/assets/images/android_bumper/cow/lit.png b/packages/pinball_components/assets/images/android/bumper/cow/lit.png similarity index 100% rename from packages/pinball_components/assets/images/android_bumper/cow/lit.png rename to packages/pinball_components/assets/images/android/bumper/cow/lit.png diff --git a/packages/pinball_components/assets/images/spaceship/rail/exit.png b/packages/pinball_components/assets/images/android/rail/exit.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/rail/exit.png rename to packages/pinball_components/assets/images/android/rail/exit.png diff --git a/packages/pinball_components/assets/images/spaceship/rail/main.png b/packages/pinball_components/assets/images/android/rail/main.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/rail/main.png rename to packages/pinball_components/assets/images/android/rail/main.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/arrow/active1.png b/packages/pinball_components/assets/images/android/ramp/arrow/active1.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/arrow/active1.png rename to packages/pinball_components/assets/images/android/ramp/arrow/active1.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/arrow/active2.png b/packages/pinball_components/assets/images/android/ramp/arrow/active2.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/arrow/active2.png rename to packages/pinball_components/assets/images/android/ramp/arrow/active2.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/arrow/active3.png b/packages/pinball_components/assets/images/android/ramp/arrow/active3.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/arrow/active3.png rename to packages/pinball_components/assets/images/android/ramp/arrow/active3.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/arrow/active4.png b/packages/pinball_components/assets/images/android/ramp/arrow/active4.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/arrow/active4.png rename to packages/pinball_components/assets/images/android/ramp/arrow/active4.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/arrow/active5.png b/packages/pinball_components/assets/images/android/ramp/arrow/active5.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/arrow/active5.png rename to packages/pinball_components/assets/images/android/ramp/arrow/active5.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/arrow/inactive.png b/packages/pinball_components/assets/images/android/ramp/arrow/inactive.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/arrow/inactive.png rename to packages/pinball_components/assets/images/android/ramp/arrow/inactive.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/board-opening.png b/packages/pinball_components/assets/images/android/ramp/board-opening.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/board-opening.png rename to packages/pinball_components/assets/images/android/ramp/board-opening.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/main.png b/packages/pinball_components/assets/images/android/ramp/main.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/main.png rename to packages/pinball_components/assets/images/android/ramp/main.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/railing-background.png b/packages/pinball_components/assets/images/android/ramp/railing-background.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/railing-background.png rename to packages/pinball_components/assets/images/android/ramp/railing-background.png diff --git a/packages/pinball_components/assets/images/spaceship/ramp/railing-foreground.png b/packages/pinball_components/assets/images/android/ramp/railing-foreground.png similarity index 100% rename from packages/pinball_components/assets/images/spaceship/ramp/railing-foreground.png rename to packages/pinball_components/assets/images/android/ramp/railing-foreground.png diff --git a/packages/pinball_components/assets/images/android/spaceship/animatronic.png b/packages/pinball_components/assets/images/android/spaceship/animatronic.png new file mode 100644 index 00000000..d4b165f3 Binary files /dev/null and b/packages/pinball_components/assets/images/android/spaceship/animatronic.png differ diff --git a/packages/pinball_components/assets/images/android/spaceship/light-beam.png b/packages/pinball_components/assets/images/android/spaceship/light-beam.png new file mode 100644 index 00000000..eb33725d Binary files /dev/null and b/packages/pinball_components/assets/images/android/spaceship/light-beam.png differ diff --git a/packages/pinball_components/assets/images/android/spaceship/saucer.png b/packages/pinball_components/assets/images/android/spaceship/saucer.png new file mode 100644 index 00000000..6c77525a Binary files /dev/null and b/packages/pinball_components/assets/images/android/spaceship/saucer.png differ diff --git a/packages/pinball_components/assets/images/spaceship/bridge.png b/packages/pinball_components/assets/images/spaceship/bridge.png deleted file mode 100644 index 6ebb143e..00000000 Binary files a/packages/pinball_components/assets/images/spaceship/bridge.png and /dev/null differ diff --git a/packages/pinball_components/assets/images/spaceship/saucer.png b/packages/pinball_components/assets/images/spaceship/saucer.png deleted file mode 100644 index 4cd65522..00000000 Binary files a/packages/pinball_components/assets/images/spaceship/saucer.png and /dev/null differ diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index be244edb..3c7b2454 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -10,8 +10,7 @@ import 'package:flutter/widgets.dart'; class $AssetsImagesGen { const $AssetsImagesGen(); - $AssetsImagesAndroidBumperGen get androidBumper => - const $AssetsImagesAndroidBumperGen(); + $AssetsImagesAndroidGen get android => const $AssetsImagesAndroidGen(); $AssetsImagesBackboardGen get backboard => const $AssetsImagesBackboardGen(); $AssetsImagesBallGen get ball => const $AssetsImagesBallGen(); $AssetsImagesBaseboardGen get baseboard => const $AssetsImagesBaseboardGen(); @@ -29,19 +28,18 @@ class $AssetsImagesGen { $AssetsImagesPlungerGen get plunger => const $AssetsImagesPlungerGen(); $AssetsImagesSignpostGen get signpost => const $AssetsImagesSignpostGen(); $AssetsImagesSlingshotGen get slingshot => const $AssetsImagesSlingshotGen(); - $AssetsImagesSpaceshipGen get spaceship => const $AssetsImagesSpaceshipGen(); $AssetsImagesSparkyGen get sparky => const $AssetsImagesSparkyGen(); } -class $AssetsImagesAndroidBumperGen { - const $AssetsImagesAndroidBumperGen(); +class $AssetsImagesAndroidGen { + const $AssetsImagesAndroidGen(); - $AssetsImagesAndroidBumperAGen get a => - const $AssetsImagesAndroidBumperAGen(); - $AssetsImagesAndroidBumperBGen get b => - const $AssetsImagesAndroidBumperBGen(); - $AssetsImagesAndroidBumperCowGen get cow => - const $AssetsImagesAndroidBumperCowGen(); + $AssetsImagesAndroidBumperGen get bumper => + const $AssetsImagesAndroidBumperGen(); + $AssetsImagesAndroidRailGen get rail => const $AssetsImagesAndroidRailGen(); + $AssetsImagesAndroidRampGen get ramp => const $AssetsImagesAndroidRampGen(); + $AssetsImagesAndroidSpaceshipGen get spaceship => + const $AssetsImagesAndroidSpaceshipGen(); } class $AssetsImagesBackboardGen { @@ -246,23 +244,6 @@ class $AssetsImagesSlingshotGen { const AssetGenImage('assets/images/slingshot/upper.png'); } -class $AssetsImagesSpaceshipGen { - const $AssetsImagesSpaceshipGen(); - - /// File path: assets/images/spaceship/bridge.png - AssetGenImage get bridge => - const AssetGenImage('assets/images/spaceship/bridge.png'); - - $AssetsImagesSpaceshipRailGen get rail => - const $AssetsImagesSpaceshipRailGen(); - $AssetsImagesSpaceshipRampGen get ramp => - const $AssetsImagesSpaceshipRampGen(); - - /// File path: assets/images/spaceship/saucer.png - AssetGenImage get saucer => - const AssetGenImage('assets/images/spaceship/saucer.png'); -} - class $AssetsImagesSparkyGen { const $AssetsImagesSparkyGen(); @@ -276,40 +257,66 @@ class $AssetsImagesSparkyGen { const $AssetsImagesSparkyComputerGen(); } -class $AssetsImagesAndroidBumperAGen { - const $AssetsImagesAndroidBumperAGen(); +class $AssetsImagesAndroidBumperGen { + const $AssetsImagesAndroidBumperGen(); - /// File path: assets/images/android_bumper/a/dimmed.png - AssetGenImage get dimmed => - const AssetGenImage('assets/images/android_bumper/a/dimmed.png'); + $AssetsImagesAndroidBumperAGen get a => + const $AssetsImagesAndroidBumperAGen(); + $AssetsImagesAndroidBumperBGen get b => + const $AssetsImagesAndroidBumperBGen(); + $AssetsImagesAndroidBumperCowGen get cow => + const $AssetsImagesAndroidBumperCowGen(); +} - /// File path: assets/images/android_bumper/a/lit.png - AssetGenImage get lit => - const AssetGenImage('assets/images/android_bumper/a/lit.png'); +class $AssetsImagesAndroidRailGen { + const $AssetsImagesAndroidRailGen(); + + /// File path: assets/images/android/rail/exit.png + AssetGenImage get exit => + const AssetGenImage('assets/images/android/rail/exit.png'); + + /// File path: assets/images/android/rail/main.png + AssetGenImage get main => + const AssetGenImage('assets/images/android/rail/main.png'); } -class $AssetsImagesAndroidBumperBGen { - const $AssetsImagesAndroidBumperBGen(); +class $AssetsImagesAndroidRampGen { + const $AssetsImagesAndroidRampGen(); - /// File path: assets/images/android_bumper/b/dimmed.png - AssetGenImage get dimmed => - const AssetGenImage('assets/images/android_bumper/b/dimmed.png'); + $AssetsImagesAndroidRampArrowGen get arrow => + const $AssetsImagesAndroidRampArrowGen(); - /// File path: assets/images/android_bumper/b/lit.png - AssetGenImage get lit => - const AssetGenImage('assets/images/android_bumper/b/lit.png'); + /// File path: assets/images/android/ramp/board-opening.png + AssetGenImage get boardOpening => + const AssetGenImage('assets/images/android/ramp/board-opening.png'); + + /// File path: assets/images/android/ramp/main.png + AssetGenImage get main => + const AssetGenImage('assets/images/android/ramp/main.png'); + + /// File path: assets/images/android/ramp/railing-background.png + AssetGenImage get railingBackground => + const AssetGenImage('assets/images/android/ramp/railing-background.png'); + + /// File path: assets/images/android/ramp/railing-foreground.png + AssetGenImage get railingForeground => + const AssetGenImage('assets/images/android/ramp/railing-foreground.png'); } -class $AssetsImagesAndroidBumperCowGen { - const $AssetsImagesAndroidBumperCowGen(); +class $AssetsImagesAndroidSpaceshipGen { + const $AssetsImagesAndroidSpaceshipGen(); - /// File path: assets/images/android_bumper/cow/dimmed.png - AssetGenImage get dimmed => - const AssetGenImage('assets/images/android_bumper/cow/dimmed.png'); + /// File path: assets/images/android/spaceship/animatronic.png + AssetGenImage get animatronic => + const AssetGenImage('assets/images/android/spaceship/animatronic.png'); - /// File path: assets/images/android_bumper/cow/lit.png - AssetGenImage get lit => - const AssetGenImage('assets/images/android_bumper/cow/lit.png'); + /// File path: assets/images/android/spaceship/light-beam.png + AssetGenImage get lightBeam => + const AssetGenImage('assets/images/android/spaceship/light-beam.png'); + + /// File path: assets/images/android/spaceship/saucer.png + AssetGenImage get saucer => + const AssetGenImage('assets/images/android/spaceship/saucer.png'); } class $AssetsImagesDashBumperGen { @@ -393,41 +400,6 @@ class $AssetsImagesMultiplierX6Gen { const AssetGenImage('assets/images/multiplier/x6/lit.png'); } -class $AssetsImagesSpaceshipRailGen { - const $AssetsImagesSpaceshipRailGen(); - - /// File path: assets/images/spaceship/rail/exit.png - AssetGenImage get exit => - const AssetGenImage('assets/images/spaceship/rail/exit.png'); - - /// File path: assets/images/spaceship/rail/main.png - AssetGenImage get main => - const AssetGenImage('assets/images/spaceship/rail/main.png'); -} - -class $AssetsImagesSpaceshipRampGen { - const $AssetsImagesSpaceshipRampGen(); - - $AssetsImagesSpaceshipRampArrowGen get arrow => - const $AssetsImagesSpaceshipRampArrowGen(); - - /// File path: assets/images/spaceship/ramp/board-opening.png - AssetGenImage get boardOpening => - const AssetGenImage('assets/images/spaceship/ramp/board-opening.png'); - - /// File path: assets/images/spaceship/ramp/main.png - AssetGenImage get main => - const AssetGenImage('assets/images/spaceship/ramp/main.png'); - - /// File path: assets/images/spaceship/ramp/railing-background.png - AssetGenImage get railingBackground => const AssetGenImage( - 'assets/images/spaceship/ramp/railing-background.png'); - - /// File path: assets/images/spaceship/ramp/railing-foreground.png - AssetGenImage get railingForeground => const AssetGenImage( - 'assets/images/spaceship/ramp/railing-foreground.png'); -} - class $AssetsImagesSparkyBumperGen { const $AssetsImagesSparkyBumperGen(); @@ -448,6 +420,70 @@ class $AssetsImagesSparkyComputerGen { const AssetGenImage('assets/images/sparky/computer/top.png'); } +class $AssetsImagesAndroidBumperAGen { + const $AssetsImagesAndroidBumperAGen(); + + /// File path: assets/images/android/bumper/a/dimmed.png + AssetGenImage get dimmed => + const AssetGenImage('assets/images/android/bumper/a/dimmed.png'); + + /// File path: assets/images/android/bumper/a/lit.png + AssetGenImage get lit => + const AssetGenImage('assets/images/android/bumper/a/lit.png'); +} + +class $AssetsImagesAndroidBumperBGen { + const $AssetsImagesAndroidBumperBGen(); + + /// File path: assets/images/android/bumper/b/dimmed.png + AssetGenImage get dimmed => + const AssetGenImage('assets/images/android/bumper/b/dimmed.png'); + + /// File path: assets/images/android/bumper/b/lit.png + AssetGenImage get lit => + const AssetGenImage('assets/images/android/bumper/b/lit.png'); +} + +class $AssetsImagesAndroidBumperCowGen { + const $AssetsImagesAndroidBumperCowGen(); + + /// File path: assets/images/android/bumper/cow/dimmed.png + AssetGenImage get dimmed => + const AssetGenImage('assets/images/android/bumper/cow/dimmed.png'); + + /// File path: assets/images/android/bumper/cow/lit.png + AssetGenImage get lit => + const AssetGenImage('assets/images/android/bumper/cow/lit.png'); +} + +class $AssetsImagesAndroidRampArrowGen { + const $AssetsImagesAndroidRampArrowGen(); + + /// File path: assets/images/android/ramp/arrow/active1.png + AssetGenImage get active1 => + const AssetGenImage('assets/images/android/ramp/arrow/active1.png'); + + /// File path: assets/images/android/ramp/arrow/active2.png + AssetGenImage get active2 => + const AssetGenImage('assets/images/android/ramp/arrow/active2.png'); + + /// File path: assets/images/android/ramp/arrow/active3.png + AssetGenImage get active3 => + const AssetGenImage('assets/images/android/ramp/arrow/active3.png'); + + /// File path: assets/images/android/ramp/arrow/active4.png + AssetGenImage get active4 => + const AssetGenImage('assets/images/android/ramp/arrow/active4.png'); + + /// File path: assets/images/android/ramp/arrow/active5.png + AssetGenImage get active5 => + const AssetGenImage('assets/images/android/ramp/arrow/active5.png'); + + /// File path: assets/images/android/ramp/arrow/inactive.png + AssetGenImage get inactive => + const AssetGenImage('assets/images/android/ramp/arrow/inactive.png'); +} + class $AssetsImagesDashBumperAGen { const $AssetsImagesDashBumperAGen(); @@ -484,34 +520,6 @@ class $AssetsImagesDashBumperMainGen { const AssetGenImage('assets/images/dash/bumper/main/inactive.png'); } -class $AssetsImagesSpaceshipRampArrowGen { - const $AssetsImagesSpaceshipRampArrowGen(); - - /// File path: assets/images/spaceship/ramp/arrow/active1.png - AssetGenImage get active1 => - const AssetGenImage('assets/images/spaceship/ramp/arrow/active1.png'); - - /// File path: assets/images/spaceship/ramp/arrow/active2.png - AssetGenImage get active2 => - const AssetGenImage('assets/images/spaceship/ramp/arrow/active2.png'); - - /// File path: assets/images/spaceship/ramp/arrow/active3.png - AssetGenImage get active3 => - const AssetGenImage('assets/images/spaceship/ramp/arrow/active3.png'); - - /// File path: assets/images/spaceship/ramp/arrow/active4.png - AssetGenImage get active4 => - const AssetGenImage('assets/images/spaceship/ramp/arrow/active4.png'); - - /// File path: assets/images/spaceship/ramp/arrow/active5.png - AssetGenImage get active5 => - const AssetGenImage('assets/images/spaceship/ramp/arrow/active5.png'); - - /// File path: assets/images/spaceship/ramp/arrow/inactive.png - AssetGenImage get inactive => - const AssetGenImage('assets/images/spaceship/ramp/arrow/inactive.png'); -} - class $AssetsImagesSparkyBumperAGen { const $AssetsImagesSparkyBumperAGen(); diff --git a/packages/pinball_components/lib/src/components/android_bumper/android_bumper.dart b/packages/pinball_components/lib/src/components/android_bumper/android_bumper.dart index 4cefc28d..e1a3857e 100644 --- a/packages/pinball_components/lib/src/components/android_bumper/android_bumper.dart +++ b/packages/pinball_components/lib/src/components/android_bumper/android_bumper.dart @@ -10,7 +10,7 @@ import 'package:pinball_flame/pinball_flame.dart'; export 'cubit/android_bumper_cubit.dart'; /// {@template android_bumper} -/// Bumper for area under the [Spaceship]. +/// Bumper for area under the [AndroidSpaceship]. /// {@endtemplate} class AndroidBumper extends BodyComponent with InitialPosition { /// {@macro android_bumper} @@ -46,8 +46,8 @@ class AndroidBumper extends BodyComponent with InitialPosition { }) : this._( majorRadius: 3.52, minorRadius: 2.97, - litAssetPath: Assets.images.androidBumper.a.lit.keyName, - dimmedAssetPath: Assets.images.androidBumper.a.dimmed.keyName, + litAssetPath: Assets.images.android.bumper.a.lit.keyName, + dimmedAssetPath: Assets.images.android.bumper.a.dimmed.keyName, spritePosition: Vector2(0, -0.1), bloc: AndroidBumperCubit(), children: children, @@ -59,8 +59,8 @@ class AndroidBumper extends BodyComponent with InitialPosition { }) : this._( majorRadius: 3.19, minorRadius: 2.79, - litAssetPath: Assets.images.androidBumper.b.lit.keyName, - dimmedAssetPath: Assets.images.androidBumper.b.dimmed.keyName, + litAssetPath: Assets.images.android.bumper.b.lit.keyName, + dimmedAssetPath: Assets.images.android.bumper.b.dimmed.keyName, spritePosition: Vector2(0, -0.1), bloc: AndroidBumperCubit(), children: children, @@ -72,8 +72,8 @@ class AndroidBumper extends BodyComponent with InitialPosition { }) : this._( majorRadius: 3.4, minorRadius: 2.9, - litAssetPath: Assets.images.androidBumper.cow.lit.keyName, - dimmedAssetPath: Assets.images.androidBumper.cow.dimmed.keyName, + litAssetPath: Assets.images.android.bumper.cow.lit.keyName, + dimmedAssetPath: Assets.images.android.bumper.cow.dimmed.keyName, spritePosition: Vector2(0, -0.68), bloc: AndroidBumperCubit(), children: children, diff --git a/packages/pinball_components/lib/src/components/android_spaceship.dart b/packages/pinball_components/lib/src/components/android_spaceship.dart new file mode 100644 index 00000000..1dcf6780 --- /dev/null +++ b/packages/pinball_components/lib/src/components/android_spaceship.dart @@ -0,0 +1,209 @@ +// ignore_for_file: public_member_api_docs + +import 'dart:async'; +import 'dart:math' as math; + +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_components/gen/assets.gen.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; +import 'package:pinball_flame/pinball_flame.dart'; + +class AndroidSpaceship extends Blueprint { + AndroidSpaceship({required Vector2 position}) + : super( + components: [ + _SpaceshipSaucer()..initialPosition = position, + _SpaceshipSaucerSpriteAnimationComponent()..position = position, + _LightBeamSpriteComponent()..position = position + Vector2(2.5, 5), + _AndroidHead()..initialPosition = position + Vector2(0.5, 0.25), + _SpaceshipHole( + outsideLayer: Layer.spaceshipExitRail, + outsidePriority: RenderPriority.ballOnSpaceshipRail, + )..initialPosition = position - Vector2(5.3, -5.4), + _SpaceshipHole( + outsideLayer: Layer.board, + outsidePriority: RenderPriority.ballOnBoard, + )..initialPosition = position - Vector2(-7.5, -1.1), + ], + ); +} + +class _SpaceshipSaucer extends BodyComponent with InitialPosition, Layered { + _SpaceshipSaucer() : super(renderBody: false) { + layer = Layer.spaceship; + } + + @override + Body createBody() { + final shape = _SpaceshipSaucerShape(); + final bodyDef = BodyDef( + position: initialPosition, + userData: this, + angle: -1.7, + ); + + return world.createBody(bodyDef)..createFixtureFromShape(shape); + } +} + +class _SpaceshipSaucerShape extends ChainShape { + _SpaceshipSaucerShape() { + const minorRadius = 9.75; + const majorRadius = 11.9; + + createChain( + [ + for (var angle = 0.2618; angle <= 6.0214; angle += math.pi / 180) + Vector2( + minorRadius * math.cos(angle), + majorRadius * math.sin(angle), + ), + ], + ); + } +} + +class _SpaceshipSaucerSpriteAnimationComponent extends SpriteAnimationComponent + with HasGameRef { + _SpaceshipSaucerSpriteAnimationComponent() + : super( + anchor: Anchor.center, + priority: RenderPriority.spaceshipSaucer, + ); + + @override + Future onLoad() async { + await super.onLoad(); + + final spriteSheet = gameRef.images.fromCache( + Assets.images.android.spaceship.saucer.keyName, + ); + + const amountPerRow = 5; + const amountPerColumn = 3; + final textureSize = Vector2( + spriteSheet.width / amountPerRow, + spriteSheet.height / amountPerColumn, + ); + size = textureSize / 10; + + animation = SpriteAnimation.fromFrameData( + spriteSheet, + SpriteAnimationData.sequenced( + amount: amountPerRow * amountPerColumn, + amountPerRow: amountPerRow, + stepTime: 1 / 24, + textureSize: textureSize, + ), + ); + } +} + +// TODO(allisonryan0002): add pulsing behavior. +class _LightBeamSpriteComponent extends SpriteComponent with HasGameRef { + _LightBeamSpriteComponent() + : super( + anchor: Anchor.center, + priority: RenderPriority.spaceshipLightBeam, + ); + + @override + Future onLoad() async { + await super.onLoad(); + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.android.spaceship.lightBeam.keyName, + ), + ); + this.sprite = sprite; + size = sprite.originalSize / 10; + } +} + +class _AndroidHead extends BodyComponent with InitialPosition, Layered { + _AndroidHead() + : super( + priority: RenderPriority.androidHead, + children: [_AndroidHeadSpriteAnimationComponent()], + renderBody: false, + ) { + layer = Layer.spaceship; + } + + @override + Body createBody() { + final shape = EllipseShape( + center: Vector2.zero(), + majorRadius: 3.1, + minorRadius: 2, + )..rotate(1.4); + // TODO(allisonryan0002): use bumping behavior. + final fixtureDef = FixtureDef( + shape, + restitution: 0.1, + ); + final bodyDef = BodyDef(position: initialPosition); + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } +} + +class _AndroidHeadSpriteAnimationComponent extends SpriteAnimationComponent + with HasGameRef { + _AndroidHeadSpriteAnimationComponent() + : super( + anchor: Anchor.center, + position: Vector2(-0.24, -2.6), + ); + + @override + Future onLoad() async { + await super.onLoad(); + + final spriteSheet = gameRef.images.fromCache( + Assets.images.android.spaceship.animatronic.keyName, + ); + + const amountPerRow = 18; + const amountPerColumn = 4; + final textureSize = Vector2( + spriteSheet.width / amountPerRow, + spriteSheet.height / amountPerColumn, + ); + size = textureSize / 10; + + animation = SpriteAnimation.fromFrameData( + spriteSheet, + SpriteAnimationData.sequenced( + amount: amountPerRow * amountPerColumn, + amountPerRow: amountPerRow, + stepTime: 1 / 24, + textureSize: textureSize, + ), + ); + } +} + +class _SpaceshipHole extends LayerSensor { + _SpaceshipHole({required Layer outsideLayer, required int outsidePriority}) + : super( + insideLayer: Layer.spaceship, + outsideLayer: outsideLayer, + orientation: LayerEntranceOrientation.down, + insidePriority: RenderPriority.ballOnSpaceship, + outsidePriority: outsidePriority, + ) { + layer = Layer.spaceship; + } + + @override + Shape get shape { + return ArcShape( + center: Vector2(0, -3.2), + arcRadius: 5, + angle: 1, + rotation: -2, + ); + } +} diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index f16aa0a6..2f0e4031 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -1,4 +1,5 @@ export 'android_bumper/android_bumper.dart'; +export 'android_spaceship.dart'; export 'backboard/backboard.dart'; export 'ball.dart'; export 'baseboard.dart'; @@ -27,7 +28,6 @@ export 'score_text.dart'; export 'shapes/shapes.dart'; export 'signpost.dart'; export 'slingshot.dart'; -export 'spaceship.dart'; export 'spaceship_rail.dart'; export 'spaceship_ramp.dart'; export 'sparky_animatronic.dart'; diff --git a/packages/pinball_components/lib/src/components/render_priority.dart b/packages/pinball_components/lib/src/components/render_priority.dart index c63b2b31..3e7d5a29 100644 --- a/packages/pinball_components/lib/src/components/render_priority.dart +++ b/packages/pinball_components/lib/src/components/render_priority.dart @@ -20,7 +20,7 @@ abstract class RenderPriority { static const int ballOnSpaceshipRamp = _above + spaceshipRampBackgroundRailing; - /// Render priority for the [Ball] while it's on the [Spaceship]. + /// Render priority for the [Ball] while it's on the [AndroidSpaceship]. static const int ballOnSpaceship = _above + spaceshipSaucer; /// Render priority for the [Ball] while it's on the [SpaceshipRail]. @@ -91,7 +91,7 @@ abstract class RenderPriority { static const int spaceshipSaucer = _above + ballOnSpaceshipRail; - static const int spaceshipSaucerWall = _above + spaceshipSaucer; + static const int spaceshipLightBeam = _below + spaceshipSaucer; static const int androidHead = _above + spaceshipSaucer; diff --git a/packages/pinball_components/lib/src/components/spaceship.dart b/packages/pinball_components/lib/src/components/spaceship.dart deleted file mode 100644 index a52df81d..00000000 --- a/packages/pinball_components/lib/src/components/spaceship.dart +++ /dev/null @@ -1,246 +0,0 @@ -import 'dart:async'; -import 'dart:math'; - -import 'package:flame/components.dart'; -import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:pinball_components/gen/assets.gen.dart'; -import 'package:pinball_components/pinball_components.dart' hide Assets; -import 'package:pinball_flame/pinball_flame.dart'; - -/// {@template spaceship} -/// A [Blueprint] which creates the spaceship feature. -/// {@endtemplate} -class Spaceship extends Blueprint { - /// {@macro spaceship} - Spaceship({required Vector2 position}) - : super( - components: [ - SpaceshipSaucer()..initialPosition = position, - _SpaceshipEntrance()..initialPosition = position, - AndroidHead()..initialPosition = position, - _SpaceshipHole( - outsideLayer: Layer.spaceshipExitRail, - outsidePriority: RenderPriority.ballOnSpaceshipRail, - )..initialPosition = position - Vector2(5.2, -4.8), - _SpaceshipHole( - outsideLayer: Layer.board, - outsidePriority: RenderPriority.ballOnBoard, - )..initialPosition = position - Vector2(-7.2, -0.8), - SpaceshipWall()..initialPosition = position, - ], - ); - - /// Total size of the spaceship. - static final size = Vector2(25, 19); -} - -/// {@template spaceship_saucer} -/// A [BodyComponent] for the base, or the saucer of the spaceship -/// {@endtemplate} -class SpaceshipSaucer extends BodyComponent with InitialPosition, Layered { - /// {@macro spaceship_saucer} - SpaceshipSaucer() - : super( - priority: RenderPriority.spaceshipSaucer, - renderBody: false, - children: [ - _SpaceshipSaucerSpriteComponent(), - ], - ) { - layer = Layer.spaceship; - } - - @override - Body createBody() { - final shape = CircleShape()..radius = 3; - final fixtureDef = FixtureDef( - shape, - isSensor: true, - ); - final bodyDef = BodyDef( - position: initialPosition, - userData: this, - ); - - return world.createBody(bodyDef)..createFixture(fixtureDef); - } -} - -class _SpaceshipSaucerSpriteComponent extends SpriteComponent with HasGameRef { - _SpaceshipSaucerSpriteComponent() - : super( - anchor: Anchor.center, - // TODO(alestiago): Refactor to use sprite orignial size instead. - size: Spaceship.size, - ); - - @override - Future onLoad() async { - await super.onLoad(); - - // TODO(alestiago): Use cached sprite. - sprite = await gameRef.loadSprite( - Assets.images.spaceship.saucer.keyName, - ); - } -} - -/// {@template spaceship_bridge} -/// A [BodyComponent] that provides both the collision and the rotation -/// animation for the bridge. -/// {@endtemplate} -class AndroidHead extends BodyComponent with InitialPosition, Layered { - /// {@macro spaceship_bridge} - AndroidHead() - : super( - priority: RenderPriority.androidHead, - children: [_AndroidHeadSpriteAnimation()], - renderBody: false, - ) { - layer = Layer.spaceship; - } - - @override - Body createBody() { - final circleShape = CircleShape()..radius = 2; - - final bodyDef = BodyDef( - position: initialPosition, - userData: this, - ); - - return world.createBody(bodyDef) - ..createFixture( - FixtureDef(circleShape)..restitution = 0.4, - ); - } -} - -class _AndroidHeadSpriteAnimation extends SpriteAnimationComponent - with HasGameRef { - @override - Future onLoad() async { - await super.onLoad(); - - final image = await gameRef.images.load( - Assets.images.spaceship.bridge.keyName, - ); - size = Vector2(8.2, 10); - position = Vector2(0, -2); - anchor = Anchor.center; - - final data = SpriteAnimationData.sequenced( - amount: 72, - amountPerRow: 24, - stepTime: 0.05, - textureSize: size * 10, - ); - animation = SpriteAnimation.fromFrameData(image, data); - } -} - -class _SpaceshipEntrance extends LayerSensor { - _SpaceshipEntrance() - : super( - insideLayer: Layer.spaceship, - orientation: LayerEntranceOrientation.up, - insidePriority: RenderPriority.ballOnSpaceship, - ) { - layer = Layer.spaceship; - } - - @override - Shape get shape { - final radius = Spaceship.size.y / 2; - return PolygonShape() - ..setAsEdge( - Vector2( - radius * cos(20 * pi / 180), - radius * sin(20 * pi / 180), - )..rotate(90 * pi / 180), - Vector2( - radius * cos(340 * pi / 180), - radius * sin(340 * pi / 180), - )..rotate(90 * pi / 180), - ); - } -} - -class _SpaceshipHole extends LayerSensor { - _SpaceshipHole({required Layer outsideLayer, required int outsidePriority}) - : super( - insideLayer: Layer.spaceship, - outsideLayer: outsideLayer, - orientation: LayerEntranceOrientation.down, - insidePriority: RenderPriority.ballOnSpaceship, - outsidePriority: outsidePriority, - ) { - layer = Layer.spaceship; - } - - @override - Shape get shape { - return ArcShape( - center: Vector2(0, -3.2), - arcRadius: 5, - angle: 1, - rotation: -2, - ); - } -} - -/// {@template spaceship_wall_shape} -/// The [ChainShape] that defines the shape of the [SpaceshipWall]. -/// {@endtemplate} -class _SpaceshipWallShape extends ChainShape { - /// {@macro spaceship_wall_shape} - _SpaceshipWallShape() { - final minorRadius = (Spaceship.size.y - 2) / 2; - final majorRadius = (Spaceship.size.x - 2) / 2; - - createChain( - [ - // TODO(alestiago): Try converting this logic to radian. - for (var angle = 20; angle <= 340; angle++) - Vector2( - minorRadius * cos(angle * pi / 180), - majorRadius * sin(angle * pi / 180), - ), - ], - ); - } -} - -/// {@template spaceship_wall} -/// A [BodyComponent] that provides the collision for the wall -/// surrounding the spaceship. -/// -/// It has a small opening to allow the [Ball] to get inside the spaceship -/// saucer. -/// -/// It also contains the [SpriteComponent] for the lower wall -/// {@endtemplate} -class SpaceshipWall extends BodyComponent with InitialPosition, Layered { - /// {@macro spaceship_wall} - SpaceshipWall() - : super( - priority: RenderPriority.spaceshipSaucerWall, - renderBody: false, - ) { - layer = Layer.spaceship; - } - - @override - Body createBody() { - final shape = _SpaceshipWallShape(); - final fixtureDef = FixtureDef(shape); - - final bodyDef = BodyDef( - position: initialPosition, - userData: this, - angle: -1.7, - ); - - return world.createBody(bodyDef)..createFixture(fixtureDef); - } -} diff --git a/packages/pinball_components/lib/src/components/spaceship_rail.dart b/packages/pinball_components/lib/src/components/spaceship_rail.dart index 91540c62..df9fc16c 100644 --- a/packages/pinball_components/lib/src/components/spaceship_rail.dart +++ b/packages/pinball_components/lib/src/components/spaceship_rail.dart @@ -6,7 +6,7 @@ import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// {@template spaceship_rail} -/// A [Blueprint] for the rail exiting the [Spaceship]. +/// A [Blueprint] for the rail exiting the [AndroidSpaceship]. /// {@endtemplate} class SpaceshipRail extends Blueprint { /// {@macro spaceship_rail} @@ -116,7 +116,7 @@ class _SpaceshipRailSpriteComponent extends SpriteComponent with HasGameRef { final sprite = Sprite( gameRef.images.fromCache( - Assets.images.spaceship.rail.main.keyName, + Assets.images.android.rail.main.keyName, ), ); this.sprite = sprite; @@ -139,7 +139,7 @@ class _SpaceshipRailExitSpriteComponent extends SpriteComponent final sprite = Sprite( gameRef.images.fromCache( - Assets.images.spaceship.rail.exit.keyName, + Assets.images.android.rail.exit.keyName, ), ); this.sprite = sprite; diff --git a/packages/pinball_components/lib/src/components/spaceship_ramp.dart b/packages/pinball_components/lib/src/components/spaceship_ramp.dart index c9a1d574..6a034daa 100644 --- a/packages/pinball_components/lib/src/components/spaceship_ramp.dart +++ b/packages/pinball_components/lib/src/components/spaceship_ramp.dart @@ -8,7 +8,7 @@ import 'package:pinball_components/pinball_components.dart' hide Assets; import 'package:pinball_flame/pinball_flame.dart'; /// {@template spaceship_ramp} -/// A [Blueprint] which creates the ramp leading into the [Spaceship]. +/// A [Blueprint] which creates the ramp leading into the [AndroidSpaceship]. /// {@endtemplate} class SpaceshipRamp extends Blueprint { /// {@macro spaceship_ramp} @@ -73,17 +73,17 @@ extension on SpaceshipRampArrowSpriteState { String get path { switch (this) { case SpaceshipRampArrowSpriteState.inactive: - return Assets.images.spaceship.ramp.arrow.inactive.keyName; + return Assets.images.android.ramp.arrow.inactive.keyName; case SpaceshipRampArrowSpriteState.active1: - return Assets.images.spaceship.ramp.arrow.active1.keyName; + return Assets.images.android.ramp.arrow.active1.keyName; case SpaceshipRampArrowSpriteState.active2: - return Assets.images.spaceship.ramp.arrow.active2.keyName; + return Assets.images.android.ramp.arrow.active2.keyName; case SpaceshipRampArrowSpriteState.active3: - return Assets.images.spaceship.ramp.arrow.active3.keyName; + return Assets.images.android.ramp.arrow.active3.keyName; case SpaceshipRampArrowSpriteState.active4: - return Assets.images.spaceship.ramp.arrow.active4.keyName; + return Assets.images.android.ramp.arrow.active4.keyName; case SpaceshipRampArrowSpriteState.active5: - return Assets.images.spaceship.ramp.arrow.active5.keyName; + return Assets.images.android.ramp.arrow.active5.keyName; } } @@ -161,7 +161,7 @@ class _SpaceshipRampBackgroundRailingSpriteComponent extends SpriteComponent await super.onLoad(); final sprite = Sprite( gameRef.images.fromCache( - Assets.images.spaceship.ramp.railingBackground.keyName, + Assets.images.android.ramp.railingBackground.keyName, ), ); this.sprite = sprite; @@ -182,7 +182,7 @@ class _SpaceshipRampBackgroundRampSpriteComponent extends SpriteComponent await super.onLoad(); final sprite = Sprite( gameRef.images.fromCache( - Assets.images.spaceship.ramp.main.keyName, + Assets.images.android.ramp.main.keyName, ), ); this.sprite = sprite; @@ -234,7 +234,7 @@ class _SpaceshipRampBoardOpeningSpriteComponent extends SpriteComponent await super.onLoad(); final sprite = Sprite( gameRef.images.fromCache( - Assets.images.spaceship.ramp.boardOpening.keyName, + Assets.images.android.ramp.boardOpening.keyName, ), ); this.sprite = sprite; @@ -304,7 +304,7 @@ class _SpaceshipRampForegroundRailingSpriteComponent extends SpriteComponent await super.onLoad(); final sprite = Sprite( gameRef.images.fromCache( - Assets.images.spaceship.ramp.railingForeground.keyName, + Assets.images.android.ramp.railingForeground.keyName, ), ); this.sprite = sprite; diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index 37f9bd63..0769f484 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -45,7 +45,6 @@ flutter: - asset: fonts/PixeloidMono-1G8ae.ttf assets: - - assets/images/ - assets/images/ball/ - assets/images/baseboard/ - assets/images/boundary/ @@ -57,16 +56,16 @@ flutter: - assets/images/dash/bumper/a/ - assets/images/dash/bumper/b/ - assets/images/dash/bumper/main/ - - assets/images/spaceship/ - - assets/images/spaceship/rail/ - - assets/images/spaceship/ramp/ - - assets/images/spaceship/ramp/arrow/ + - assets/images/android/spaceship/ + - assets/images/android/rail/ + - assets/images/android/ramp/ + - assets/images/android/ramp/arrow/ + - assets/images/android/bumper/a/ + - assets/images/android/bumper/b/ + - assets/images/android/bumper/cow/ - assets/images/kicker/ - assets/images/plunger/ - assets/images/slingshot/ - - assets/images/android_bumper/a/ - - assets/images/android_bumper/b/ - - assets/images/android_bumper/cow/ - assets/images/sparky/ - assets/images/sparky/computer/ - assets/images/sparky/bumper/a/ diff --git a/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_a_game.dart b/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_a_game.dart index 4dcd1cb8..32638c2d 100644 --- a/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_a_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_a_game.dart @@ -9,8 +9,8 @@ class AndroidBumperAGame extends BallGame { : super( color: const Color(0xFF0000FF), imagesFileNames: [ - Assets.images.androidBumper.a.lit.keyName, - Assets.images.androidBumper.a.dimmed.keyName, + Assets.images.android.bumper.a.lit.keyName, + Assets.images.android.bumper.a.dimmed.keyName, ], ); diff --git a/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_b_game.dart b/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_b_game.dart index e504fe1e..bfd4206c 100644 --- a/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_b_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_b_game.dart @@ -9,8 +9,8 @@ class AndroidBumperBGame extends BallGame { : super( color: const Color(0xFF0000FF), imagesFileNames: [ - Assets.images.androidBumper.b.lit.keyName, - Assets.images.androidBumper.b.dimmed.keyName, + Assets.images.android.bumper.b.lit.keyName, + Assets.images.android.bumper.b.dimmed.keyName, ], ); diff --git a/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_cow_game.dart b/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_cow_game.dart index 3b0aa828..ac1bc6fe 100644 --- a/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_cow_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/android_acres/android_bumper_cow_game.dart @@ -8,8 +8,8 @@ class AndroidBumperCowGame extends BallGame { AndroidBumperCowGame() : super( imagesFileNames: [ - Assets.images.androidBumper.cow.lit.keyName, - Assets.images.androidBumper.cow.dimmed.keyName, + Assets.images.android.bumper.cow.lit.keyName, + Assets.images.android.bumper.cow.dimmed.keyName, ], ); diff --git a/packages/pinball_components/sandbox/lib/stories/android_acres/android_spaceship_game.dart b/packages/pinball_components/sandbox/lib/stories/android_acres/android_spaceship_game.dart new file mode 100644 index 00000000..076b2d2b --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/android_acres/android_spaceship_game.dart @@ -0,0 +1,38 @@ +import 'dart:async'; + +import 'package:flame/input.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; +import 'package:sandbox/stories/ball/basic_ball_game.dart'; + +class AndroidSpaceshipGame extends BallGame { + AndroidSpaceshipGame() + : super( + ballPriority: RenderPriority.ballOnSpaceship, + ballLayer: Layer.spaceship, + imagesFileNames: [ + Assets.images.android.spaceship.saucer.keyName, + Assets.images.android.spaceship.animatronic.keyName, + Assets.images.android.spaceship.lightBeam.keyName, + ], + ); + + static const description = ''' + Shows how the AndroidSpaceship is 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.zero()); + await addFromBlueprint( + AndroidSpaceship(position: Vector2.zero()), + ); + + await traceAllBodies(); + } +} diff --git a/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_game.dart b/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_game.dart deleted file mode 100644 index ad897dd4..00000000 --- a/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_game.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'dart:async'; - -import 'package:flame/input.dart'; -import 'package:flutter/material.dart'; -import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_flame/pinball_flame.dart'; -import 'package:sandbox/common/common.dart'; - -class SpaceshipGame extends AssetsGame with TapDetector { - static const description = ''' - Shows how a Spaceship works. - - - Tap anywhere on the screen to spawn a Ball into the game. -'''; - - @override - Future onLoad() async { - await super.onLoad(); - - camera.followVector2(Vector2.zero()); - await addFromBlueprint( - Spaceship(position: Vector2.zero()), - ); - await ready(); - } - - @override - void onTapUp(TapUpInfo info) { - add( - Ball(baseColor: Colors.blue) - ..initialPosition = info.eventPosition.game - ..layer = Layer.spaceshipEntranceRamp, - ); - } -} diff --git a/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_rail_game.dart b/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_rail_game.dart index 4bd067fa..87bac14d 100644 --- a/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_rail_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_rail_game.dart @@ -13,8 +13,8 @@ class SpaceshipRailGame extends BallGame { ballPriority: RenderPriority.ballOnSpaceshipRail, ballLayer: Layer.spaceshipExitRail, imagesFileNames: [ - Assets.images.spaceship.rail.main.keyName, - Assets.images.spaceship.rail.exit.keyName, + Assets.images.android.rail.main.keyName, + Assets.images.android.rail.exit.keyName, ], ); diff --git a/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_ramp_game.dart b/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_ramp_game.dart index 1817f40a..43944a37 100644 --- a/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_ramp_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/android_acres/spaceship_ramp_game.dart @@ -14,16 +14,16 @@ class SpaceshipRampGame extends BallGame with KeyboardEvents { ballPriority: RenderPriority.ballOnSpaceshipRamp, ballLayer: Layer.spaceshipEntranceRamp, imagesFileNames: [ - Assets.images.spaceship.ramp.railingBackground.keyName, - Assets.images.spaceship.ramp.main.keyName, - Assets.images.spaceship.ramp.boardOpening.keyName, - Assets.images.spaceship.ramp.railingForeground.keyName, - Assets.images.spaceship.ramp.arrow.inactive.keyName, - Assets.images.spaceship.ramp.arrow.active1.keyName, - Assets.images.spaceship.ramp.arrow.active2.keyName, - Assets.images.spaceship.ramp.arrow.active3.keyName, - Assets.images.spaceship.ramp.arrow.active4.keyName, - Assets.images.spaceship.ramp.arrow.active5.keyName, + Assets.images.android.ramp.railingBackground.keyName, + Assets.images.android.ramp.main.keyName, + Assets.images.android.ramp.boardOpening.keyName, + Assets.images.android.ramp.railingForeground.keyName, + Assets.images.android.ramp.arrow.inactive.keyName, + Assets.images.android.ramp.arrow.active1.keyName, + Assets.images.android.ramp.arrow.active2.keyName, + Assets.images.android.ramp.arrow.active3.keyName, + Assets.images.android.ramp.arrow.active4.keyName, + Assets.images.android.ramp.arrow.active5.keyName, ], ); diff --git a/packages/pinball_components/sandbox/lib/stories/android_acres/stories.dart b/packages/pinball_components/sandbox/lib/stories/android_acres/stories.dart index d8f84671..ec4a783e 100644 --- a/packages/pinball_components/sandbox/lib/stories/android_acres/stories.dart +++ b/packages/pinball_components/sandbox/lib/stories/android_acres/stories.dart @@ -3,7 +3,7 @@ import 'package:sandbox/common/common.dart'; import 'package:sandbox/stories/android_acres/android_bumper_a_game.dart'; import 'package:sandbox/stories/android_acres/android_bumper_b_game.dart'; import 'package:sandbox/stories/android_acres/android_bumper_cow_game.dart'; -import 'package:sandbox/stories/android_acres/spaceship_game.dart'; +import 'package:sandbox/stories/android_acres/android_spaceship_game.dart'; import 'package:sandbox/stories/android_acres/spaceship_rail_game.dart'; import 'package:sandbox/stories/android_acres/spaceship_ramp_game.dart'; @@ -25,9 +25,9 @@ void addAndroidAcresStories(Dashbook dashbook) { gameBuilder: (_) => AndroidBumperCowGame(), ) ..addGame( - title: 'Spaceship', - description: SpaceshipGame.description, - gameBuilder: (_) => SpaceshipGame(), + title: 'Android Spaceship', + description: AndroidSpaceshipGame.description, + gameBuilder: (_) => AndroidSpaceshipGame(), ) ..addGame( title: 'Spaceship Rail', diff --git a/packages/pinball_components/test/src/components/android_bumper/android_bumper_test.dart b/packages/pinball_components/test/src/components/android_bumper/android_bumper_test.dart index 831330c0..a5256b79 100644 --- a/packages/pinball_components/test/src/components/android_bumper/android_bumper_test.dart +++ b/packages/pinball_components/test/src/components/android_bumper/android_bumper_test.dart @@ -13,12 +13,12 @@ import '../../../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); final assets = [ - Assets.images.androidBumper.a.lit.keyName, - Assets.images.androidBumper.a.dimmed.keyName, - Assets.images.androidBumper.b.lit.keyName, - Assets.images.androidBumper.b.dimmed.keyName, - Assets.images.androidBumper.cow.lit.keyName, - Assets.images.androidBumper.cow.dimmed.keyName, + Assets.images.android.bumper.a.lit.keyName, + Assets.images.android.bumper.a.dimmed.keyName, + Assets.images.android.bumper.b.lit.keyName, + Assets.images.android.bumper.b.dimmed.keyName, + Assets.images.android.bumper.cow.lit.keyName, + Assets.images.android.bumper.cow.dimmed.keyName, ]; final flameTester = FlameTester(() => TestGame(assets)); diff --git a/packages/pinball_components/test/src/components/android_spaceship_test.dart b/packages/pinball_components/test/src/components/android_spaceship_test.dart new file mode 100644 index 00000000..92219a64 --- /dev/null +++ b/packages/pinball_components/test/src/components/android_spaceship_test.dart @@ -0,0 +1,66 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame/components.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + group('AndroidSpaceship', () { + group('Spaceship', () { + final assets = [ + Assets.images.android.spaceship.saucer.keyName, + Assets.images.android.spaceship.animatronic.keyName, + Assets.images.android.spaceship.lightBeam.keyName, + ]; + final flameTester = FlameTester(() => TestGame(assets)); + + flameTester.test('loads correctly', (game) async { + await game.addFromBlueprint(AndroidSpaceship(position: Vector2.zero())); + await game.ready(); + }); + + flameTester.testGameWidget( + 'renders correctly', + setUp: (game, tester) async { + await game.images.loadAll(assets); + await game + .addFromBlueprint(AndroidSpaceship(position: Vector2.zero())); + game.camera.followVector2(Vector2.zero()); + await game.ready(); + await tester.pump(); + }, + verify: (game, tester) async { + final animationDuration = game + .descendants() + .whereType() + .last + .animation! + .totalDuration(); + + await expectLater( + find.byGame(), + matchesGoldenFile('golden/android_spaceship/start.png'), + ); + + game.update(animationDuration * 0.5); + await tester.pump(); + await expectLater( + find.byGame(), + matchesGoldenFile('golden/android_spaceship/middle.png'), + ); + + game.update(animationDuration * 0.5); + await tester.pump(); + await expectLater( + find.byGame(), + matchesGoldenFile('golden/android_spaceship/end.png'), + ); + }, + ); + }); + }); +} diff --git a/packages/pinball_components/test/src/components/golden/android_spaceship/end.png b/packages/pinball_components/test/src/components/golden/android_spaceship/end.png new file mode 100644 index 00000000..c2a0631a Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/android_spaceship/end.png differ diff --git a/packages/pinball_components/test/src/components/golden/android_spaceship/middle.png b/packages/pinball_components/test/src/components/golden/android_spaceship/middle.png new file mode 100644 index 00000000..c6651abd Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/android_spaceship/middle.png differ diff --git a/packages/pinball_components/test/src/components/golden/android_spaceship/start.png b/packages/pinball_components/test/src/components/golden/android_spaceship/start.png new file mode 100644 index 00000000..25e8863a Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/android_spaceship/start.png differ diff --git a/packages/pinball_components/test/src/components/golden/spaceship.png b/packages/pinball_components/test/src/components/golden/spaceship.png deleted file mode 100644 index d43db8c7..00000000 Binary files a/packages/pinball_components/test/src/components/golden/spaceship.png and /dev/null differ diff --git a/packages/pinball_components/test/src/components/spaceship_rail_test.dart b/packages/pinball_components/test/src/components/spaceship_rail_test.dart index bc5a7f75..a24b0a17 100644 --- a/packages/pinball_components/test/src/components/spaceship_rail_test.dart +++ b/packages/pinball_components/test/src/components/spaceship_rail_test.dart @@ -12,8 +12,8 @@ void main() { group('SpaceshipRail', () { TestWidgetsFlutterBinding.ensureInitialized(); final assets = [ - Assets.images.spaceship.rail.main.keyName, - Assets.images.spaceship.rail.exit.keyName, + Assets.images.android.rail.main.keyName, + Assets.images.android.rail.exit.keyName, ]; final flameTester = FlameTester(() => TestGame(assets)); diff --git a/packages/pinball_components/test/src/components/spaceship_ramp_test.dart b/packages/pinball_components/test/src/components/spaceship_ramp_test.dart index a65ba18b..1f5a231a 100644 --- a/packages/pinball_components/test/src/components/spaceship_ramp_test.dart +++ b/packages/pinball_components/test/src/components/spaceship_ramp_test.dart @@ -11,16 +11,16 @@ import '../../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); final assets = [ - Assets.images.spaceship.ramp.boardOpening.keyName, - Assets.images.spaceship.ramp.railingForeground.keyName, - Assets.images.spaceship.ramp.railingBackground.keyName, - Assets.images.spaceship.ramp.main.keyName, - Assets.images.spaceship.ramp.arrow.inactive.keyName, - Assets.images.spaceship.ramp.arrow.active1.keyName, - Assets.images.spaceship.ramp.arrow.active2.keyName, - Assets.images.spaceship.ramp.arrow.active3.keyName, - Assets.images.spaceship.ramp.arrow.active4.keyName, - Assets.images.spaceship.ramp.arrow.active5.keyName, + Assets.images.android.ramp.boardOpening.keyName, + Assets.images.android.ramp.railingForeground.keyName, + Assets.images.android.ramp.railingBackground.keyName, + Assets.images.android.ramp.main.keyName, + Assets.images.android.ramp.arrow.inactive.keyName, + Assets.images.android.ramp.arrow.active1.keyName, + Assets.images.android.ramp.arrow.active2.keyName, + Assets.images.android.ramp.arrow.active3.keyName, + Assets.images.android.ramp.arrow.active4.keyName, + Assets.images.android.ramp.arrow.active5.keyName, ]; final flameTester = FlameTester(() => TestGame(assets)); diff --git a/packages/pinball_components/test/src/components/spaceship_test.dart b/packages/pinball_components/test/src/components/spaceship_test.dart deleted file mode 100644 index c9a90746..00000000 --- a/packages/pinball_components/test/src/components/spaceship_test.dart +++ /dev/null @@ -1,56 +0,0 @@ -// ignore_for_file: cascade_invocations - -import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:flame_test/flame_test.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_flame/pinball_flame.dart'; - -import '../../helpers/helpers.dart'; - -void main() { - group('Spaceship', () { - late Filter filterData; - late Fixture fixture; - late Body body; - late Ball ball; - late Forge2DGame game; - - setUp(() { - filterData = MockFilter(); - - fixture = MockFixture(); - when(() => fixture.filterData).thenReturn(filterData); - - body = MockBody(); - when(() => body.fixtures).thenReturn([fixture]); - - game = MockGame(); - - ball = MockBall(); - when(() => ball.gameRef).thenReturn(game); - when(() => ball.body).thenReturn(body); - }); - - group('Spaceship', () { - final tester = FlameTester(TestGame.new); - - tester.testGameWidget( - 'renders correctly', - setUp: (game, tester) async { - final position = Vector2(30, -30); - await game.addFromBlueprint(Spaceship(position: position)); - game.camera.followVector2(position); - await game.ready(); - }, - verify: (game, tester) async { - await expectLater( - find.byGame(), - matchesGoldenFile('golden/spaceship.png'), - ); - }, - ); - }); - }); -} diff --git a/test/game/components/android_acres_test.dart b/test/game/components/android_acres_test.dart index 01ab5d7b..aef6a812 100644 --- a/test/game/components/android_acres_test.dart +++ b/test/game/components/android_acres_test.dart @@ -11,24 +11,27 @@ import '../../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); final assets = [ - Assets.images.spaceship.ramp.boardOpening.keyName, - Assets.images.spaceship.ramp.railingForeground.keyName, - Assets.images.spaceship.ramp.railingBackground.keyName, - Assets.images.spaceship.ramp.main.keyName, - Assets.images.spaceship.ramp.arrow.inactive.keyName, - Assets.images.spaceship.ramp.arrow.active1.keyName, - Assets.images.spaceship.ramp.arrow.active2.keyName, - Assets.images.spaceship.ramp.arrow.active3.keyName, - Assets.images.spaceship.ramp.arrow.active4.keyName, - Assets.images.spaceship.ramp.arrow.active5.keyName, - Assets.images.spaceship.rail.main.keyName, - Assets.images.spaceship.rail.exit.keyName, - Assets.images.androidBumper.a.lit.keyName, - Assets.images.androidBumper.a.dimmed.keyName, - Assets.images.androidBumper.b.lit.keyName, - Assets.images.androidBumper.b.dimmed.keyName, - Assets.images.androidBumper.cow.lit.keyName, - Assets.images.androidBumper.cow.dimmed.keyName, + Assets.images.android.spaceship.saucer.keyName, + Assets.images.android.spaceship.animatronic.keyName, + Assets.images.android.spaceship.lightBeam.keyName, + Assets.images.android.ramp.boardOpening.keyName, + Assets.images.android.ramp.railingForeground.keyName, + Assets.images.android.ramp.railingBackground.keyName, + Assets.images.android.ramp.main.keyName, + Assets.images.android.ramp.arrow.inactive.keyName, + Assets.images.android.ramp.arrow.active1.keyName, + Assets.images.android.ramp.arrow.active2.keyName, + Assets.images.android.ramp.arrow.active3.keyName, + Assets.images.android.ramp.arrow.active4.keyName, + Assets.images.android.ramp.arrow.active5.keyName, + Assets.images.android.rail.main.keyName, + Assets.images.android.rail.exit.keyName, + Assets.images.android.bumper.a.lit.keyName, + Assets.images.android.bumper.a.dimmed.keyName, + Assets.images.android.bumper.b.lit.keyName, + Assets.images.android.bumper.b.dimmed.keyName, + Assets.images.android.bumper.cow.lit.keyName, + Assets.images.android.bumper.cow.dimmed.keyName, ]; final flameTester = FlameTester( () => EmptyPinballTestGame(assets: assets), @@ -48,7 +51,7 @@ void main() { 'a Spaceship', (game) async { expect( - AndroidAcres().blueprints.whereType().single, + AndroidAcres().blueprints.whereType().single, isNotNull, ); }, diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index a7240286..3a531cac 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -15,12 +15,12 @@ import '../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); final assets = [ - Assets.images.androidBumper.a.lit.keyName, - Assets.images.androidBumper.a.dimmed.keyName, - Assets.images.androidBumper.b.lit.keyName, - Assets.images.androidBumper.b.dimmed.keyName, - Assets.images.androidBumper.cow.lit.keyName, - Assets.images.androidBumper.cow.dimmed.keyName, + Assets.images.android.bumper.a.lit.keyName, + Assets.images.android.bumper.a.dimmed.keyName, + Assets.images.android.bumper.b.lit.keyName, + Assets.images.android.bumper.b.dimmed.keyName, + Assets.images.android.bumper.cow.lit.keyName, + Assets.images.android.bumper.cow.dimmed.keyName, Assets.images.backboard.backboardScores.keyName, Assets.images.backboard.backboardGameOver.keyName, Assets.images.backboard.display.keyName, @@ -73,20 +73,21 @@ void main() { Assets.images.signpost.active3.keyName, Assets.images.slingshot.upper.keyName, Assets.images.slingshot.lower.keyName, - Assets.images.spaceship.saucer.keyName, - Assets.images.spaceship.bridge.keyName, - Assets.images.spaceship.ramp.boardOpening.keyName, - Assets.images.spaceship.ramp.railingForeground.keyName, - Assets.images.spaceship.ramp.railingBackground.keyName, - Assets.images.spaceship.ramp.main.keyName, - Assets.images.spaceship.ramp.arrow.inactive.keyName, - Assets.images.spaceship.ramp.arrow.active1.keyName, - Assets.images.spaceship.ramp.arrow.active2.keyName, - Assets.images.spaceship.ramp.arrow.active3.keyName, - Assets.images.spaceship.ramp.arrow.active4.keyName, - Assets.images.spaceship.ramp.arrow.active5.keyName, - Assets.images.spaceship.rail.main.keyName, - Assets.images.spaceship.rail.exit.keyName, + Assets.images.android.spaceship.saucer.keyName, + Assets.images.android.spaceship.animatronic.keyName, + Assets.images.android.spaceship.lightBeam.keyName, + Assets.images.android.ramp.boardOpening.keyName, + Assets.images.android.ramp.railingForeground.keyName, + Assets.images.android.ramp.railingBackground.keyName, + Assets.images.android.ramp.main.keyName, + Assets.images.android.ramp.arrow.inactive.keyName, + Assets.images.android.ramp.arrow.active1.keyName, + Assets.images.android.ramp.arrow.active2.keyName, + Assets.images.android.ramp.arrow.active3.keyName, + Assets.images.android.ramp.arrow.active4.keyName, + Assets.images.android.ramp.arrow.active5.keyName, + Assets.images.android.rail.main.keyName, + Assets.images.android.rail.exit.keyName, Assets.images.sparky.bumper.a.active.keyName, Assets.images.sparky.bumper.a.inactive.keyName, Assets.images.sparky.bumper.b.active.keyName,