diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index e19c607c..ccd11723 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -6,7 +6,6 @@ export 'flipper_controller.dart'; export 'flutter_forest.dart'; export 'jetpack_ramp.dart'; export 'kicker.dart'; -export 'launcher_ramp.dart'; export 'plunger.dart'; export 'score_points.dart'; export 'spaceship_exit_rail.dart'; diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index 7e49aa1d..6c7dab2d 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -15,6 +15,10 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.baseboard.right.keyName), images.load(components.Assets.images.spaceshipSaucer.keyName), images.load(components.Assets.images.spaceshipBridge.keyName), + images.load(components.Assets.images.launchRamp.ramp.keyName), + images.load( + components.Assets.images.launchRamp.foregroundRailing.keyName, + ), images.load(Assets.images.components.background.path), images.load(Assets.images.components.launchRamp.launchRamp.path), images.load(Assets.images.components.launchRamp.launchRailFG.path), diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index c2bbe8e0..b2e375de 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -35,7 +35,7 @@ class PinballGame extends Forge2DGame unawaited(add(Board())); unawaited(_addPlunger()); unawaited(_addBonusWord()); - unawaited(_addPaths()); + unawaited(_addRamps()); unawaited( addFromBlueprint( Spaceship( @@ -86,9 +86,9 @@ class PinballGame extends Forge2DGame ); } - Future _addPaths() async { + Future _addRamps() async { unawaited(addFromBlueprint(Jetpack())); - unawaited(addFromBlueprint(Launcher())); + unawaited(addFromBlueprint(LaunchRamp())); } void spawnBall() { diff --git a/assets/images/components/launch_ramp/launch-rail-FG.png b/packages/pinball_components/assets/images/launch_ramp/foreground-railing.png similarity index 100% rename from assets/images/components/launch_ramp/launch-rail-FG.png rename to packages/pinball_components/assets/images/launch_ramp/foreground-railing.png diff --git a/assets/images/components/launch_ramp/launch-ramp.png b/packages/pinball_components/assets/images/launch_ramp/ramp.png similarity index 100% rename from assets/images/components/launch_ramp/launch-ramp.png rename to packages/pinball_components/assets/images/launch_ramp/ramp.png diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index 27a54591..2ddd26d3 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -21,6 +21,9 @@ class $AssetsImagesGen { AssetGenImage get flutterSignPost => const AssetGenImage('assets/images/flutter_sign_post.png'); + $AssetsImagesLaunchRampGen get launchRamp => + const $AssetsImagesLaunchRampGen(); + /// File path: assets/images/spaceship_bridge.png AssetGenImage get spaceshipBridge => const AssetGenImage('assets/images/spaceship_bridge.png'); @@ -54,6 +57,18 @@ class $AssetsImagesFlipperGen { const AssetGenImage('assets/images/flipper/right.png'); } +class $AssetsImagesLaunchRampGen { + const $AssetsImagesLaunchRampGen(); + + /// File path: assets/images/launch_ramp/foreground-railing.png + AssetGenImage get foregroundRailing => + const AssetGenImage('assets/images/launch_ramp/foreground-railing.png'); + + /// File path: assets/images/launch_ramp/ramp.png + AssetGenImage get ramp => + const AssetGenImage('assets/images/launch_ramp/ramp.png'); +} + class Assets { Assets._(); diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index a475f91e..a0a0ab14 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -7,6 +7,7 @@ export 'flipper.dart'; export 'flutter_sign_post.dart'; export 'initial_position.dart'; export 'joint_anchor.dart'; +export 'launch_ramp.dart'; export 'layer.dart'; export 'ramp_opening.dart'; export 'shapes/shapes.dart'; diff --git a/lib/game/components/launcher_ramp.dart b/packages/pinball_components/lib/src/components/launch_ramp.dart similarity index 78% rename from lib/game/components/launcher_ramp.dart rename to packages/pinball_components/lib/src/components/launch_ramp.dart index c65b1727..600df4e1 100644 --- a/lib/game/components/launcher_ramp.dart +++ b/packages/pinball_components/lib/src/components/launch_ramp.dart @@ -4,44 +4,43 @@ import 'dart:math' as math; import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:pinball/gen/assets.gen.dart'; -import 'package:pinball_components/pinball_components.dart' hide Assets; +import 'package:pinball_components/pinball_components.dart'; -/// {@template launcher} -/// A [Blueprint] which creates the [LauncherRamp] and -/// [LauncherForegroundRailing]. +/// {@template launch_ramp} +/// A [Blueprint] which creates the [_LaunchRampBase] and +/// [_LaunchRampForegroundRailing]. /// {@endtemplate} -class Launcher extends Forge2DBlueprint { +class LaunchRamp extends Forge2DBlueprint { @override void build(_) { addAllContactCallback([ - RampOpeningBallContactCallback<_LauncherExit>(), + RampOpeningBallContactCallback<_LaunchRampExit>(), ]); - final launcherRamp = LauncherRamp()..layer = Layer.launcher; + final launchRampBase = _LaunchRampBase()..layer = Layer.launcher; - final launcherForegroundRailing = LauncherForegroundRailing() + final launchRampForegroundRailing = _LaunchRampForegroundRailing() ..layer = Layer.launcher; - final launcherExit = _LauncherExit(rotation: math.pi / 2) + final launchRampExit = _LaunchRampExit(rotation: math.pi / 2) ..initialPosition = Vector2(1.8, 34.2) ..layer = Layer.opening ..renderBody = false; addAll([ - launcherRamp, - launcherForegroundRailing, - launcherExit, + launchRampBase, + launchRampForegroundRailing, + launchRampExit, ]); } } -/// {@template launcher_ramp} +/// {@template launch_ramp_base} /// Ramp the [Ball] is launched from at the beginning of each ball life. /// {@endtemplate} -class LauncherRamp extends BodyComponent with InitialPosition, Layered { - /// {@macro launcher_ramp} - LauncherRamp() : super(priority: -1) { +class _LaunchRampBase extends BodyComponent with InitialPosition, Layered { + /// {@macro launch_ramp_base} + _LaunchRampBase() : super(priority: -1) { layer = Layer.launcher; } @@ -106,7 +105,7 @@ class LauncherRamp extends BodyComponent with InitialPosition, Layered { await super.onLoad(); final sprite = await gameRef.loadSprite( - Assets.images.components.launchRamp.launchRamp.path, + Assets.images.launchRamp.ramp.keyName, ); final spriteComponent = SpriteComponent( sprite: sprite, @@ -133,13 +132,13 @@ class LauncherRamp extends BodyComponent with InitialPosition, Layered { } } -/// {@template launcher_foreground_railing} -/// Foreground railing for the [LauncherRamp] to render in front of the [Ball]. +/// {@template launch_ramp_foreground_railing} +/// Foreground railing for the [_LaunchRampBase] to render in front of the [Ball]. /// {@endtemplate} -class LauncherForegroundRailing extends BodyComponent +class _LaunchRampForegroundRailing extends BodyComponent with InitialPosition, Layered { - /// {@macro launcher_foreground_railing} - LauncherForegroundRailing() : super(priority: 4) { + /// {@macro launch_ramp_foreground_railing} + _LaunchRampForegroundRailing() : super(priority: 4) { layer = Layer.launcher; } @@ -179,7 +178,7 @@ class LauncherForegroundRailing extends BodyComponent await super.onLoad(); final sprite = await gameRef.loadSprite( - Assets.images.components.launchRamp.launchRailFG.path, + Assets.images.launchRamp.foregroundRailing.keyName, ); final spriteComponent = SpriteComponent( sprite: sprite, @@ -207,13 +206,13 @@ class LauncherForegroundRailing extends BodyComponent } } -/// {@template launcher_exit} +/// {@template launch_ramp_exit} /// [RampOpening] with [Layer.launcher] to filter [Ball]s exiting the -/// [Launcher]. +/// [LaunchRamp]. /// {@endtemplate} -class _LauncherExit extends RampOpening { - /// {@macro launcher_exit} - _LauncherExit({ +class _LaunchRampExit extends RampOpening { + /// {@macro launch_ramp_exit} + _LaunchRampExit({ required double rotation, }) : _rotation = rotation, super( diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index c0eab284..ee832b67 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -28,6 +28,7 @@ flutter: - assets/images/ - assets/images/baseboard/ - assets/images/flipper/ + - assets/images/launch_ramp/ flutter_gen: line_length: 80 diff --git a/packages/pinball_components/test/src/components/golden/launch-ramp.png b/packages/pinball_components/test/src/components/golden/launch-ramp.png new file mode 100644 index 00000000..e872c533 Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/launch-ramp.png differ diff --git a/packages/pinball_components/test/src/components/launch_ramp_test.dart b/packages/pinball_components/test/src/components/launch_ramp_test.dart new file mode 100644 index 00000000..d34f697f --- /dev/null +++ b/packages/pinball_components/test/src/components/launch_ramp_test.dart @@ -0,0 +1,30 @@ +// 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:pinball_components/pinball_components.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + group('LaunchRamp', () { + final tester = FlameTester(TestGame.new); + + tester.testGameWidget( + 'renders correctly', + setUp: (game, tester) async { + await game.addFromBlueprint(LaunchRamp()); + await game.ready(); + game.camera.followVector2(Vector2.zero()); + game.camera.zoom = 4.1; + }, + verify: (game, tester) async { + await expectLater( + find.byGame(), + matchesGoldenFile('golden/launch-ramp.png'), + ); + }, + ); + }); +}