diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index e8c9fe81..993215b5 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -76,7 +76,7 @@ extension PinballGameAssetsX on PinballGame { components.Assets.images.spaceship.ramp.arrow.active5.keyName, ), images.load(components.Assets.images.spaceship.rail.main.keyName), - images.load(components.Assets.images.spaceship.rail.foreground.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), diff --git a/packages/pinball_components/assets/images/spaceship/rail/exit.png b/packages/pinball_components/assets/images/spaceship/rail/exit.png new file mode 100644 index 00000000..80a819d0 Binary files /dev/null and b/packages/pinball_components/assets/images/spaceship/rail/exit.png differ diff --git a/packages/pinball_components/assets/images/spaceship/rail/foreground.png b/packages/pinball_components/assets/images/spaceship/rail/foreground.png deleted file mode 100644 index 4d11e865..00000000 Binary files a/packages/pinball_components/assets/images/spaceship/rail/foreground.png and /dev/null differ diff --git a/packages/pinball_components/assets/images/spaceship/rail/main.png b/packages/pinball_components/assets/images/spaceship/rail/main.png index 4b299c2c..9291c784 100644 Binary files a/packages/pinball_components/assets/images/spaceship/rail/main.png and b/packages/pinball_components/assets/images/spaceship/rail/main.png differ diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index 0fea8e9d..72b3d5eb 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -307,9 +307,9 @@ class $AssetsImagesDashBumperGen { class $AssetsImagesSpaceshipRailGen { const $AssetsImagesSpaceshipRailGen(); - /// File path: assets/images/spaceship/rail/foreground.png - AssetGenImage get foreground => - const AssetGenImage('assets/images/spaceship/rail/foreground.png'); + /// 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 => diff --git a/packages/pinball_components/lib/src/components/render_priority.dart b/packages/pinball_components/lib/src/components/render_priority.dart index 8ef950ed..395ca49c 100644 --- a/packages/pinball_components/lib/src/components/render_priority.dart +++ b/packages/pinball_components/lib/src/components/render_priority.dart @@ -24,7 +24,7 @@ abstract class RenderPriority { static const int ballOnSpaceship = _above + spaceshipSaucer; /// Render priority for the [Ball] while it's on the [SpaceshipRail]. - static const int ballOnSpaceshipRail = _below + spaceshipSaucer; + static const int ballOnSpaceshipRail = _above + spaceshipRail; /// Render priority for the [Ball] while it's on the [LaunchRamp]. static const int ballOnLaunchRamp = _above + launchRamp; @@ -87,9 +87,9 @@ abstract class RenderPriority { static const int spaceshipRail = _above + bottomGroup; - static const int spaceshipRailForeground = _above + spaceshipRail; + static const int spaceshipRailExit = _above + ballOnSpaceshipRail; - static const int spaceshipSaucer = _above + spaceshipRail; + static const int spaceshipSaucer = _above + ballOnSpaceshipRail; static const int spaceshipSaucerWall = _above + spaceshipSaucer; diff --git a/packages/pinball_components/lib/src/components/spaceship_rail.dart b/packages/pinball_components/lib/src/components/spaceship_rail.dart index 3dfd2c1c..91540c62 100644 --- a/packages/pinball_components/lib/src/components/spaceship_rail.dart +++ b/packages/pinball_components/lib/src/components/spaceship_rail.dart @@ -2,88 +2,71 @@ 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_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// {@template spaceship_rail} -/// A [Blueprint] for the spaceship drop tube. +/// A [Blueprint] for the rail exiting the [Spaceship]. /// {@endtemplate} class SpaceshipRail extends Blueprint { /// {@macro spaceship_rail} SpaceshipRail() : super( components: [ - _SpaceshipRailRamp(), + _SpaceshipRail(), _SpaceshipRailExit(), - _SpaceshipRailBase(radius: 0.55) - ..initialPosition = Vector2(-26.15, -18.65), - _SpaceshipRailBase(radius: 0.8) - ..initialPosition = Vector2(-25.5, 12.9), - _SpaceshipRailForeground() + _SpaceshipRailExitSpriteComponent() ], ); } -class _SpaceshipRailRamp extends BodyComponent with Layered { - _SpaceshipRailRamp() +class _SpaceshipRail extends BodyComponent with Layered { + _SpaceshipRail() : super( priority: RenderPriority.spaceshipRail, + children: [_SpaceshipRailSpriteComponent()], renderBody: false, - children: [_SpaceshipRailRampSpriteComponent()], ) { layer = Layer.spaceshipExitRail; } List _createFixtureDefs() { - final fixturesDefs = []; - final topArcShape = ArcShape( - center: Vector2(-35.5, -30.9), + center: Vector2(-35.1, -30.9), arcRadius: 2.5, angle: math.pi, rotation: 0.2, ); - final topArcFixtureDef = FixtureDef(topArcShape); - fixturesDefs.add(topArcFixtureDef); final topLeftCurveShape = BezierCurveShape( controlPoints: [ - Vector2(-37.9, -30.4), - Vector2(-38, -23.9), + Vector2(-37.6, -30.4), + Vector2(-37.8, -23.9), Vector2(-30.93, -18.2), ], ); - final topLeftCurveFixtureDef = FixtureDef(topLeftCurveShape); - fixturesDefs.add(topLeftCurveFixtureDef); final middleLeftCurveShape = BezierCurveShape( controlPoints: [ topLeftCurveShape.vertices.last, Vector2(-22.6, -10.3), - Vector2(-30, -0.2), + Vector2(-29.5, -0.2), ], ); - final middleLeftCurveFixtureDef = FixtureDef(middleLeftCurveShape); - fixturesDefs.add(middleLeftCurveFixtureDef); final bottomLeftCurveShape = BezierCurveShape( controlPoints: [ middleLeftCurveShape.vertices.last, - Vector2(-36, 8.6), - Vector2(-32.04, 18.3), + Vector2(-35.6, 8.6), + Vector2(-31.3, 18.3), ], ); - final bottomLeftCurveFixtureDef = FixtureDef(bottomLeftCurveShape); - fixturesDefs.add(bottomLeftCurveFixtureDef); final topRightStraightShape = EdgeShape() ..set( - Vector2(-33, -31.3), Vector2(-27.2, -21.3), + Vector2(-33, -31.3), ); - final topRightStraightFixtureDef = FixtureDef(topRightStraightShape); - fixturesDefs.add(topRightStraightFixtureDef); final middleRightCurveShape = BezierCurveShape( controlPoints: [ @@ -92,8 +75,6 @@ class _SpaceshipRailRamp extends BodyComponent with Layered { Vector2(-25.29, 1.7), ], ); - final middleRightCurveFixtureDef = FixtureDef(middleRightCurveShape); - fixturesDefs.add(middleRightCurveFixtureDef); final bottomRightCurveShape = BezierCurveShape( controlPoints: [ @@ -102,10 +83,16 @@ class _SpaceshipRailRamp extends BodyComponent with Layered { Vector2(-26.8, 15.7), ], ); - final bottomRightCurveFixtureDef = FixtureDef(bottomRightCurveShape); - fixturesDefs.add(bottomRightCurveFixtureDef); - return fixturesDefs; + return [ + FixtureDef(topArcShape), + FixtureDef(topLeftCurveShape), + FixtureDef(middleLeftCurveShape), + FixtureDef(bottomLeftCurveShape), + FixtureDef(topRightStraightShape), + FixtureDef(middleRightCurveShape), + FixtureDef(bottomRightCurveShape), + ]; } @override @@ -116,55 +103,47 @@ class _SpaceshipRailRamp extends BodyComponent with Layered { } } -class _SpaceshipRailRampSpriteComponent extends SpriteComponent - with HasGameRef { +class _SpaceshipRailSpriteComponent extends SpriteComponent with HasGameRef { + _SpaceshipRailSpriteComponent() + : super( + anchor: Anchor.center, + position: Vector2(-29.4, -5.7), + ); + @override Future onLoad() async { await super.onLoad(); - final sprite = await gameRef.loadSprite( - Assets.images.spaceship.rail.main.keyName, + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.spaceship.rail.main.keyName, + ), ); this.sprite = sprite; size = sprite.originalSize / 10; - anchor = Anchor.center; - position = Vector2(-29.4, -5.7); } } -class _SpaceshipRailForeground extends SpriteComponent with HasGameRef { - _SpaceshipRailForeground() - : super(priority: RenderPriority.spaceshipRailForeground); +class _SpaceshipRailExitSpriteComponent extends SpriteComponent + with HasGameRef { + _SpaceshipRailExitSpriteComponent() + : super( + anchor: Anchor.center, + position: Vector2(-28, 19.4), + priority: RenderPriority.spaceshipRailExit, + ); @override Future onLoad() async { await super.onLoad(); - final sprite = await gameRef.loadSprite( - Assets.images.spaceship.rail.foreground.keyName, + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.spaceship.rail.exit.keyName, + ), ); this.sprite = sprite; size = sprite.originalSize / 10; - anchor = Anchor.center; - position = Vector2(-28.5, 19.7); - } -} - -/// Represents the ground bases of the [_SpaceshipRailRamp]. -class _SpaceshipRailBase extends BodyComponent with InitialPosition { - _SpaceshipRailBase({required this.radius}) : super(renderBody: false); - - final double radius; - - @override - Body createBody() { - final shape = CircleShape()..radius = radius; - final fixtureDef = FixtureDef(shape); - final bodyDef = BodyDef( - position: initialPosition, - ); - - return world.createBody(bodyDef)..createFixture(fixtureDef); } } 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 2a13fb5e..4bd067fa 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 @@ -12,6 +12,10 @@ class SpaceshipRailGame extends BallGame { color: Colors.blue, ballPriority: RenderPriority.ballOnSpaceshipRail, ballLayer: Layer.spaceshipExitRail, + imagesFileNames: [ + Assets.images.spaceship.rail.main.keyName, + Assets.images.spaceship.rail.exit.keyName, + ], ); static const description = ''' diff --git a/packages/pinball_components/test/src/components/golden/spaceship-rail.png b/packages/pinball_components/test/src/components/golden/spaceship-rail.png index d81f7dba..d8ce5fca 100644 Binary files a/packages/pinball_components/test/src/components/golden/spaceship-rail.png and b/packages/pinball_components/test/src/components/golden/spaceship-rail.png 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 d3242ff6..bc5a7f75 100644 --- a/packages/pinball_components/test/src/components/spaceship_rail_test.dart +++ b/packages/pinball_components/test/src/components/spaceship_rail_test.dart @@ -11,13 +11,19 @@ import '../../helpers/helpers.dart'; void main() { group('SpaceshipRail', () { TestWidgetsFlutterBinding.ensureInitialized(); - final flameTester = FlameTester(TestGame.new); + final assets = [ + Assets.images.spaceship.rail.main.keyName, + Assets.images.spaceship.rail.exit.keyName, + ]; + final flameTester = FlameTester(() => TestGame(assets)); flameTester.testGameWidget( 'renders correctly', setUp: (game, tester) async { + await game.images.loadAll(assets); await game.addFromBlueprint(SpaceshipRail()); await game.ready(); + await tester.pump(); game.camera.followVector2(Vector2.zero()); game.camera.zoom = 8; diff --git a/test/game/components/android_acres_test.dart b/test/game/components/android_acres_test.dart index 4b35d882..419524c6 100644 --- a/test/game/components/android_acres_test.dart +++ b/test/game/components/android_acres_test.dart @@ -21,6 +21,8 @@ void main() { 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, diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 3e90738d..65f24ea2 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -72,7 +72,7 @@ void main() { Assets.images.spaceship.ramp.arrow.active4.keyName, Assets.images.spaceship.ramp.arrow.active5.keyName, Assets.images.spaceship.rail.main.keyName, - Assets.images.spaceship.rail.foreground.keyName, + Assets.images.spaceship.rail.exit.keyName, Assets.images.sparky.bumper.a.active.keyName, Assets.images.sparky.bumper.a.inactive.keyName, Assets.images.sparky.bumper.b.active.keyName,