diff --git a/assets/images/components/plunger.png b/assets/images/components/plunger.png deleted file mode 100644 index f3cbdf0f..00000000 Binary files a/assets/images/components/plunger.png and /dev/null differ diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index 6a9d6a3d..058bfe20 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -8,6 +8,7 @@ export 'controlled_plunger.dart'; export 'controlled_sparky_computer.dart'; export 'flutter_forest.dart'; export 'game_flow_controller.dart'; +export 'launcher.dart'; export 'score_effect_controller.dart'; export 'score_points.dart'; export 'sparky_fire_zone.dart'; diff --git a/lib/game/components/launcher.dart b/lib/game/components/launcher.dart new file mode 100644 index 00000000..b9ec4a7f --- /dev/null +++ b/lib/game/components/launcher.dart @@ -0,0 +1,26 @@ +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball/game/components/components.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; + +/// {@template launcher} +/// A [Blueprint] which creates the [Plunger], [RocketSpriteComponent] and +/// [LaunchRamp]. +/// {@endtemplate} +class Launcher extends Forge2DBlueprint { + /// {@macro launcher} + Launcher(); + + /// [Plunger] to launch the [Ball] onto the board. + late final Plunger plunger; + + @override + void build(Forge2DGame gameRef) { + plunger = ControlledPlunger(compressionDistance: 12.3) + ..initialPosition = Vector2(40.1, -38); + + final _rocket = RocketSpriteComponent()..position = Vector2(43, 62); + + addAll([_rocket, plunger]); + addBlueprint(LaunchRamp()); + } +} diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index cce1e658..a181404f 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -49,6 +49,7 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.chromeDino.mouth.keyName), images.load(components.Assets.images.chromeDino.head.keyName), images.load(components.Assets.images.plunger.plunger.keyName), + images.load(components.Assets.images.plunger.rocket.keyName), images.load(components.Assets.images.sparky.computer.base.keyName), images.load(components.Assets.images.sparky.computer.top.keyName), images.load(components.Assets.images.sparky.bumper.a.active.keyName), diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 98083269..2f135139 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -45,13 +45,10 @@ class PinballGame extends Forge2DGame await _addGameBoundaries(); unawaited(addFromBlueprint(Boundaries())); - unawaited(addFromBlueprint(LaunchRamp())); unawaited(addFromBlueprint(ControlledSparkyComputer())); - final plunger = ControlledPlunger(compressionDistance: 29) - ..initialPosition = Vector2(38, -19); - await add(plunger); - + final launcher = Launcher(); + unawaited(addFromBlueprint(launcher)); unawaited(add(Board())); unawaited(add(AlienZone())); unawaited(add(SparkyFireZone())); @@ -72,7 +69,7 @@ class PinballGame extends Forge2DGame ), ); - controller.attachTo(plunger); + controller.attachTo(launcher.plunger); await super.onLoad(); } diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 90013646..97be7f3e 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -20,10 +20,6 @@ class $AssetsImagesComponentsGen { /// File path: assets/images/components/background.png AssetGenImage get background => const AssetGenImage('assets/images/components/background.png'); - - /// File path: assets/images/components/plunger.png - AssetGenImage get plunger => - const AssetGenImage('assets/images/components/plunger.png'); } class Assets { diff --git a/packages/pinball_components/assets/images/plunger/rocket.png b/packages/pinball_components/assets/images/plunger/rocket.png new file mode 100644 index 00000000..ee5eef5b Binary files /dev/null and b/packages/pinball_components/assets/images/plunger/rocket.png differ diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index 1a4c9861..0c895a56 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -187,6 +187,10 @@ class $AssetsImagesPlungerGen { /// File path: assets/images/plunger/plunger.png AssetGenImage get plunger => const AssetGenImage('assets/images/plunger/plunger.png'); + + /// File path: assets/images/plunger/rocket.png + AssetGenImage get rocket => + const AssetGenImage('assets/images/plunger/rocket.png'); } class $AssetsImagesSlingshotGen { diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index acb8a7c5..e719783f 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -21,6 +21,7 @@ export 'launch_ramp.dart'; export 'layer.dart'; export 'plunger.dart'; export 'ramp_opening.dart'; +export 'rocket.dart'; export 'score_text.dart'; export 'shapes/shapes.dart'; export 'slingshot.dart'; diff --git a/packages/pinball_components/lib/src/components/plunger.dart b/packages/pinball_components/lib/src/components/plunger.dart index 19a29300..eb5a945c 100644 --- a/packages/pinball_components/lib/src/components/plunger.dart +++ b/packages/pinball_components/lib/src/components/plunger.dart @@ -92,8 +92,8 @@ class _PlungerSpriteComponent extends SpriteComponent with HasGameRef { this.sprite = sprite; size = sprite.originalSize / 10; anchor = Anchor.center; - position = Vector2(2, 19); - angle = -0.033; + position = Vector2(1.5, 13.4); + angle = -0.008; } } diff --git a/packages/pinball_components/lib/src/components/rocket.dart b/packages/pinball_components/lib/src/components/rocket.dart new file mode 100644 index 00000000..ee22efca --- /dev/null +++ b/packages/pinball_components/lib/src/components/rocket.dart @@ -0,0 +1,24 @@ +import 'package:flame/components.dart'; +import 'package:pinball_components/gen/assets.gen.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; + +/// {@template rocket_sprite_component} +/// A [SpriteComponent] for the rocket over [Plunger]. +/// {@endtemplate} +class RocketSpriteComponent extends SpriteComponent with HasGameRef { + // TODO(ruimiguel): change this priority to be over launcher ramp and bottom + // wall. + /// {@macro rocket_sprite_component} + RocketSpriteComponent() : super(priority: 5); + + @override + Future onLoad() async { + await super.onLoad(); + final sprite = await gameRef.loadSprite( + Assets.images.plunger.rocket.keyName, + ); + this.sprite = sprite; + size = sprite.originalSize / 10; + anchor = Anchor.center; + } +} diff --git a/packages/pinball_components/test/src/components/golden/plunger/plunger.png b/packages/pinball_components/test/src/components/golden/plunger/plunger.png new file mode 100644 index 00000000..a33405f1 Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/plunger/plunger.png differ diff --git a/packages/pinball_components/test/src/components/golden/plunger/rocket.png b/packages/pinball_components/test/src/components/golden/plunger/rocket.png new file mode 100644 index 00000000..9511f3d5 Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/plunger/rocket.png differ diff --git a/packages/pinball_components/test/src/components/plunger_test.dart b/packages/pinball_components/test/src/components/plunger_test.dart index 8f8a26db..5695b0e9 100644 --- a/packages/pinball_components/test/src/components/plunger_test.dart +++ b/packages/pinball_components/test/src/components/plunger_test.dart @@ -26,13 +26,12 @@ void main() { game.camera.followVector2(Vector2.zero()); game.camera.zoom = 4.1; }, - // TODO(ruimiguel): enable test when workflows are fixed. - // verify: (game, tester) async { - // await expectLater( - // find.byGame(), - // matchesGoldenFile('golden/plunger.png'), - // ); - // }, + verify: (game, tester) async { + await expectLater( + find.byGame(), + matchesGoldenFile('golden/plunger/plunger.png'), + ); + }, ); flameTester.test( diff --git a/packages/pinball_components/test/src/components/rocket_test.dart b/packages/pinball_components/test/src/components/rocket_test.dart new file mode 100644 index 00000000..c6a92561 --- /dev/null +++ b/packages/pinball_components/test/src/components/rocket_test.dart @@ -0,0 +1,28 @@ +// 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 '../../helpers/helpers.dart'; + +void main() { + group('RocketSpriteComponent', () { + final tester = FlameTester(TestGame.new); + + tester.testGameWidget( + 'renders correctly', + setUp: (game, tester) async { + game.camera.followVector2(Vector2.zero()); + await game.ensureAdd(RocketSpriteComponent()); + }, + verify: (game, tester) async { + await expectLater( + find.byGame(), + matchesGoldenFile('golden/plunger/rocket.png'), + ); + }, + ); + }); +}