diff --git a/assets/images/components/background.png b/assets/images/components/background.png index 8b8fdf77..28cf5cbe 100644 Binary files a/assets/images/components/background.png and b/assets/images/components/background.png differ diff --git a/packages/pinball_components/assets/images/spaceship/ramp/main.png b/packages/pinball_components/assets/images/spaceship/ramp/main.png index 81498965..abf0ad4c 100644 Binary files a/packages/pinball_components/assets/images/spaceship/ramp/main.png and b/packages/pinball_components/assets/images/spaceship/ramp/main.png differ diff --git a/packages/pinball_components/assets/images/spaceship/ramp/railing-background.png b/packages/pinball_components/assets/images/spaceship/ramp/railing-background.png index 2298f799..08470439 100644 Binary files a/packages/pinball_components/assets/images/spaceship/ramp/railing-background.png and b/packages/pinball_components/assets/images/spaceship/ramp/railing-background.png differ diff --git a/packages/pinball_components/assets/images/spaceship/ramp/railing-foreground.png b/packages/pinball_components/assets/images/spaceship/ramp/railing-foreground.png index e788fde0..0a2641e2 100644 Binary files a/packages/pinball_components/assets/images/spaceship/ramp/railing-foreground.png and b/packages/pinball_components/assets/images/spaceship/ramp/railing-foreground.png differ diff --git a/packages/pinball_components/lib/src/components/spaceship_ramp.dart b/packages/pinball_components/lib/src/components/spaceship_ramp.dart index 6fb6cda0..6d5b205e 100644 --- a/packages/pinball_components/lib/src/components/spaceship_ramp.dart +++ b/packages/pinball_components/lib/src/components/spaceship_ramp.dart @@ -1,4 +1,4 @@ -// ignore_for_file: avoid_renaming_method_parameters, comment_references +// ignore_for_file: avoid_renaming_method_parameters import 'dart:math' as math; @@ -8,13 +8,13 @@ import 'package:pinball_components/gen/assets.gen.dart'; import 'package:pinball_components/pinball_components.dart' hide Assets; /// {@template spaceship_ramp} -/// A [Blueprint] which creates the [_SpaceshipRampBackground]. +/// A [Blueprint] which creates the ramp leading into the [Spaceship]. /// {@endtemplate} class SpaceshipRamp extends Forge2DBlueprint { /// {@macro spaceship_ramp} SpaceshipRamp(); - /// Base priority for wall while be in the ramp. + /// Base priority for the [Ball] while inside the ramp. static const int ballPriorityInsideRamp = 4; @override @@ -28,14 +28,14 @@ class SpaceshipRamp extends Forge2DBlueprint { outsidePriority: 1, rotation: math.pi, ) - ..initialPosition = Vector2(1.7, 19) + ..initialPosition = Vector2(1.7, 19.8) ..layer = Layer.opening; final leftOpening = _SpaceshipRampOpening( outsideLayer: Layer.spaceship, outsidePriority: Spaceship.ballPriorityWhenOnSpaceship, rotation: math.pi, ) - ..initialPosition = Vector2(-13.7, 19) + ..initialPosition = Vector2(-13.7, 18.6) ..layer = Layer.spaceshipEntranceRamp; final spaceshipRamp = _SpaceshipRampBackground(); @@ -54,8 +54,6 @@ class SpaceshipRamp extends Forge2DBlueprint { } } -/// Represents the upper left blue ramp of the [Board] with its background -/// railing. class _SpaceshipRampBackground extends BodyComponent with InitialPosition, Layered { _SpaceshipRampBackground() @@ -71,7 +69,7 @@ class _SpaceshipRampBackground extends BodyComponent final outerLeftCurveShape = BezierCurveShape( controlPoints: [ - Vector2(-30.95, 38), + Vector2(-30.75, 37.3), Vector2(-32.5, 71.25), Vector2(-14.2, 71.25), ], @@ -83,14 +81,22 @@ class _SpaceshipRampBackground extends BodyComponent final outerRightCurveShape = BezierCurveShape( controlPoints: [ outerLeftCurveShape.vertices.last, - Vector2(4.7, 71.25), - Vector2(6.3, 40), + Vector2(2.5, 71.9), + Vector2(6.1, 44.9), ], ); final outerRightCurveFixtureDef = FixtureDef(outerRightCurveShape); fixturesDef.add(outerRightCurveFixtureDef); + final boardOpeningEdgeShape = EdgeShape() + ..set( + outerRightCurveShape.vertices.last, + Vector2(7.3, 41.1), + ); + final boardOpeningEdgeShapeFixtureDef = FixtureDef(boardOpeningEdgeShape); + fixturesDef.add(boardOpeningEdgeShapeFixtureDef); + return fixturesDef; } @@ -121,9 +127,9 @@ class _SpaceshipRampBackground extends BodyComponent final spriteRampComponent = SpriteComponent( sprite: spriteRamp, - size: Vector2(38.1, 33.8), + size: spriteRamp.originalSize / 10, anchor: Anchor.center, - position: Vector2(-12.2, -53.5), + position: Vector2(-10.6, -53.6), ); final spriteRailingBg = await gameRef.loadSprite( @@ -131,19 +137,18 @@ class _SpaceshipRampBackground extends BodyComponent ); final spriteRailingBgComponent = SpriteComponent( sprite: spriteRailingBg, - size: Vector2(38.3, 35.1), + size: spriteRailingBg.originalSize / 10, anchor: Anchor.center, - position: spriteRampComponent.position + Vector2(0, -1), + position: spriteRampComponent.position + Vector2(-1.1, -0.7), ); await addAll([ - spriteRailingBgComponent, spriteRampComponent, + spriteRailingBgComponent, ]); } } -/// Represents the foreground of the railing upper left blue ramp. class _SpaceshipRampForegroundRailing extends BodyComponent with InitialPosition, Layered { _SpaceshipRampForegroundRailing() @@ -168,14 +173,22 @@ class _SpaceshipRampForegroundRailing extends BodyComponent final innerRightCurveShape = BezierCurveShape( controlPoints: [ innerLeftCurveShape.vertices.last, - Vector2(-1, 64.5), - Vector2(0.1, 39.5), + Vector2(-2.5, 66.2), + Vector2(0, 44.5), ], ); final innerRightCurveFixtureDef = FixtureDef(innerRightCurveShape); fixturesDef.add(innerRightCurveFixtureDef); + final boardOpeningEdgeShape = EdgeShape() + ..set( + innerRightCurveShape.vertices.last, + Vector2(-0.85, 40.8), + ); + final boardOpeningEdgeShapeFixtureDef = FixtureDef(boardOpeningEdgeShape); + fixturesDef.add(boardOpeningEdgeShapeFixtureDef); + return fixturesDef; } @@ -205,16 +218,15 @@ class _SpaceshipRampForegroundRailing extends BodyComponent ); final spriteRailingFgComponent = SpriteComponent( sprite: spriteRailingFg, - size: Vector2(26.1, 28.3), + size: spriteRailingFg.originalSize / 10, anchor: Anchor.center, - position: Vector2(-12.2, -52.5), + position: Vector2(-12.3, -52.5), ); await add(spriteRailingFgComponent); } } -/// Represents the ground right base of the [SpaceshipRamp]. class _SpaceshipRampBase extends BodyComponent with InitialPosition, Layered { _SpaceshipRampBase() { layer = Layer.board; @@ -224,14 +236,14 @@ class _SpaceshipRampBase extends BodyComponent with InitialPosition, Layered { Body createBody() { renderBody = false; - const baseWidth = 6; + const baseWidth = 9; final baseShape = BezierCurveShape( controlPoints: [ Vector2(initialPosition.x - baseWidth / 2, initialPosition.y), Vector2(initialPosition.x - baseWidth / 2, initialPosition.y) + - Vector2(2, 2), + Vector2(2, 5), Vector2(initialPosition.x + baseWidth / 2, initialPosition.y) + - Vector2(-2, 2), + Vector2(-2, 5), Vector2(initialPosition.x + baseWidth / 2, initialPosition.y) ], ); @@ -266,7 +278,7 @@ class _SpaceshipRampOpening extends RampOpening { final double _rotation; - static final Vector2 _size = Vector2(_SpaceshipRampBackground.width / 4, .1); + static final Vector2 _size = Vector2(_SpaceshipRampBackground.width / 3, .1); @override Shape get shape { diff --git a/packages/pinball_components/sandbox/lib/common/trace.dart b/packages/pinball_components/sandbox/lib/common/trace.dart index 8585169e..3cee1c86 100644 --- a/packages/pinball_components/sandbox/lib/common/trace.dart +++ b/packages/pinball_components/sandbox/lib/common/trace.dart @@ -12,8 +12,9 @@ extension BodyTrace on BodyComponent { unawaited( mounted.whenComplete(() { - final sprite = children.whereType().first; - sprite.paint.color = sprite.paint.color.withOpacity(0.5); + descendants() + .whereType() + .forEach((sprite) => sprite.setOpacity(0.5)); descendants().whereType().forEach((anchor) { final fixtureDef = FixtureDef(CircleShape()..radius = 0.5); @@ -33,7 +34,7 @@ mixin Traceable on Forge2DGame { }) async { if (trace) { await ready(); - children + descendants() .whereType() .forEach((bodyComponent) => bodyComponent.trace()); } diff --git a/packages/pinball_components/sandbox/lib/main.dart b/packages/pinball_components/sandbox/lib/main.dart index 3d65dbe2..0cd2c83e 100644 --- a/packages/pinball_components/sandbox/lib/main.dart +++ b/packages/pinball_components/sandbox/lib/main.dart @@ -17,6 +17,7 @@ void main() { addEffectsStories(dashbook); addFlipperStories(dashbook); addSpaceshipStories(dashbook); + addSpaceshipRampStories(dashbook); addBaseboardStories(dashbook); addChromeDinoStories(dashbook); addDashNestBumperStories(dashbook); diff --git a/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/spaceship_ramp_game.dart b/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/spaceship_ramp_game.dart new file mode 100644 index 00000000..241141a2 --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/spaceship_ramp_game.dart @@ -0,0 +1,23 @@ +import 'package:flame/extensions.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/ball/basic_ball_game.dart'; + +class SpaceshipRampGame extends BasicBallGame with Traceable { + SpaceshipRampGame() : super(color: const Color(0xFFFF0000)); + + static const info = ''' + Shows how SpaceshipRamp 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(); + await addFromBlueprint(SpaceshipRamp()); + camera.followVector2(Vector2(-12, -50)); + await traceAllBodies(); + } +} diff --git a/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/stories.dart b/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/stories.dart new file mode 100644 index 00000000..75bbc581 --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/spaceship_ramp/stories.dart @@ -0,0 +1,16 @@ +import 'package:dashbook/dashbook.dart'; +import 'package:flame/game.dart'; +import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/spaceship_ramp/spaceship_ramp_game.dart'; + +void addSpaceshipRampStories(Dashbook dashbook) { + dashbook.storiesOf('SpaceshipRamp').add( + 'Basic', + (context) => GameWidget( + game: SpaceshipRampGame() + ..trace = context.boolProperty('Trace', true), + ), + codeLink: buildSourceLink('spaceship_ramp_game/basic.dart'), + info: SpaceshipRampGame.info, + ); +} diff --git a/packages/pinball_components/sandbox/lib/stories/stories.dart b/packages/pinball_components/sandbox/lib/stories/stories.dart index d7409e87..5ff6e309 100644 --- a/packages/pinball_components/sandbox/lib/stories/stories.dart +++ b/packages/pinball_components/sandbox/lib/stories/stories.dart @@ -7,5 +7,6 @@ export 'flipper/stories.dart'; export 'layer/stories.dart'; export 'slingshot/stories.dart'; export 'spaceship/stories.dart'; +export 'spaceship_ramp/stories.dart'; export 'sparky_bumper/stories.dart'; export 'zoom/stories.dart'; diff --git a/packages/pinball_components/test/src/components/golden/spaceship-ramp.png b/packages/pinball_components/test/src/components/golden/spaceship-ramp.png new file mode 100644 index 00000000..a6825d00 Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/spaceship-ramp.png differ 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 4d124596..7e5f1c46 100644 --- a/packages/pinball_components/test/src/components/spaceship_ramp_test.dart +++ b/packages/pinball_components/test/src/components/spaceship_ramp_test.dart @@ -1,5 +1,6 @@ // 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'; @@ -8,20 +9,22 @@ import '../../helpers/helpers.dart'; void main() { group('SpaceshipRamp', () { - TestWidgetsFlutterBinding.ensureInitialized(); - final flameTester = FlameTester(TestGame.new); + final tester = FlameTester(TestGame.new); - flameTester.test( - 'loads correctly', - (game) async { - final spaceshipEntranceRamp = SpaceshipRamp(); - await game.addFromBlueprint(spaceshipEntranceRamp); + tester.testGameWidget( + 'renders correctly', + setUp: (game, tester) async { + await game.addFromBlueprint(SpaceshipRamp()); await game.ready(); - - for (final element in spaceshipEntranceRamp.components) { - expect(game.contains(element), isTrue); - } + game.camera.followVector2(Vector2(-13, -50)); }, + // TODO(allisonryan0002): enable test when workflows are fixed. + // verify: (game, tester) async { + // await expectLater( + // find.byGame(), + // matchesGoldenFile('golden/spaceship-ramp.png'), + // ); + // }, ); }); }