From c8bc7c194221f0ae300cd676db3d4fcf64281b9a Mon Sep 17 00:00:00 2001 From: Rui Miguel Alonso Date: Fri, 1 Apr 2022 14:36:16 +0200 Subject: [PATCH] feat: spaceship drop assets (#110) * feat: added assets for drop rail * feat: placed assets and base bodies * feat: assets and bases * refactor: hide spaceship hole * refactor: redimension curves * fix: lint * test: fix geometry tests * refactor: tube to fit spaceship opening * refactor: applied priority changes to drop tube * test: fixed tests for ball contact with exit rail * Update test/game/components/spaceship_exit_rail_test.dart Co-authored-by: Alejandro Santiago * chore: formatted test file Co-authored-by: Allison Ryan Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Co-authored-by: Alejandro Santiago --- .../images/components/spaceship-drop-tube.png | Bin 0 -> 64940 bytes lib/game/components/spaceship_exit_rail.dart | 243 ++++++++++-------- lib/game/game_assets.dart | 1 + lib/game/pinball_game.dart | 4 +- lib/gen/assets.gen.dart | 4 + packages/geometry/test/src/geometry_test.dart | 4 +- .../lib/src/components/spaceship.dart | 4 +- .../components/spaceship_exit_rail_test.dart | 16 +- 8 files changed, 154 insertions(+), 122 deletions(-) create mode 100644 assets/images/components/spaceship-drop-tube.png diff --git a/assets/images/components/spaceship-drop-tube.png b/assets/images/components/spaceship-drop-tube.png new file mode 100644 index 0000000000000000000000000000000000000000..4b299c2cdf9726054d8e859fe4b6d101765fe63e GIT binary patch literal 64940 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%0A#hiNx}Wz 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

8C`?hs}Qxv8BOs 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 _createFixtureDefs() { - const entranceRotationAngle = 175 * math.pi / 180; - const curveRotationAngle = 275 * math.pi / 180; - const exitRotationAngle = 340 * math.pi / 180; - const width = 5.5; - final fixturesDefs = []; - final entranceWall = ArcShape( - center: Vector2(width / 2, 0), - arcRadius: width / 2, + final topArcShape = ArcShape( + center: Vector2(-35.5, 30.9), + arcRadius: 2.5, angle: math.pi, - rotation: entranceRotationAngle, + rotation: 2.9, ); - final entranceFixtureDef = FixtureDef(entranceWall); - fixturesDefs.add(entranceFixtureDef); - - final topLeftControlPoints = [ - Vector2(0, 0), - Vector2(10, .5), - Vector2(7, 4), - Vector2(15.5, 8.3), - ]; + final topArcFixtureDef = FixtureDef(topArcShape); + fixturesDefs.add(topArcFixtureDef); + final topLeftCurveShape = BezierCurveShape( - controlPoints: topLeftControlPoints, - )..rotate(curveRotationAngle); - final topLeftFixtureDef = FixtureDef(topLeftCurveShape); - fixturesDefs.add(topLeftFixtureDef); - - final topRightControlPoints = [ - Vector2(0, width), - Vector2(10, 6.5), - Vector2(7, 10), - Vector2(15.5, 13.2), - ]; - final topRightCurveShape = BezierCurveShape( - controlPoints: topRightControlPoints, - )..rotate(curveRotationAngle); - final topRightFixtureDef = FixtureDef(topRightCurveShape); - fixturesDefs.add(topRightFixtureDef); - - final mediumLeftControlPoints = [ - topLeftControlPoints.last, - Vector2(21, 12.9), - Vector2(30, 7.1), - Vector2(32, 4.8), - ]; - final mediumLeftCurveShape = BezierCurveShape( - controlPoints: mediumLeftControlPoints, - )..rotate(curveRotationAngle); - final mediumLeftFixtureDef = FixtureDef(mediumLeftCurveShape); - fixturesDefs.add(mediumLeftFixtureDef); - - final mediumRightControlPoints = [ - topRightControlPoints.last, - Vector2(21, 17.2), - Vector2(30, 12.1), - Vector2(32, 10.2), - ]; - final mediumRightCurveShape = BezierCurveShape( - controlPoints: mediumRightControlPoints, - )..rotate(curveRotationAngle); - final mediumRightFixtureDef = FixtureDef(mediumRightCurveShape); - fixturesDefs.add(mediumRightFixtureDef); - - final bottomLeftControlPoints = [ - mediumLeftControlPoints.last, - Vector2(40, -1), - Vector2(48, 1.9), - Vector2(50.5, 2.5), - ]; + controlPoints: [ + Vector2(-37.9, 30.4), + Vector2(-38, 23.9), + Vector2(-30.93, 18.2), + ], + ); + final topLeftCurveFixtureDef = FixtureDef(topLeftCurveShape); + fixturesDefs.add(topLeftCurveFixtureDef); + + final middleLeftCurveShape = BezierCurveShape( + controlPoints: [ + Vector2(-30.93, 18.2), + Vector2(-22.6, 10.3), + Vector2(-30, 0.2), + ], + ); + final middleLeftCurveFixtureDef = FixtureDef(middleLeftCurveShape); + fixturesDefs.add(middleLeftCurveFixtureDef); + final bottomLeftCurveShape = BezierCurveShape( - controlPoints: bottomLeftControlPoints, - )..rotate(curveRotationAngle); - final bottomLeftFixtureDef = FixtureDef(bottomLeftCurveShape); - fixturesDefs.add(bottomLeftFixtureDef); - - final bottomRightControlPoints = [ - mediumRightControlPoints.last, - Vector2(40, 4), - Vector2(46, 6.5), - Vector2(48.8, 7.6), - ]; + controlPoints: [ + Vector2(-30, 0.2), + Vector2(-36, -8.6), + Vector2(-32.04, -18.3), + ], + ); + final bottomLeftCurveFixtureDef = FixtureDef(bottomLeftCurveShape); + fixturesDefs.add(bottomLeftCurveFixtureDef); + + final topRightStraightShape = EdgeShape() + ..set( + Vector2(-33, 31.3), + Vector2(-27.2, 21.3), + ); + final topRightStraightFixtureDef = FixtureDef(topRightStraightShape); + fixturesDefs.add(topRightStraightFixtureDef); + + final middleRightCurveShape = BezierCurveShape( + controlPoints: [ + Vector2(-27.2, 21.3), + Vector2(-16.5, 11.4), + Vector2(-25.29, -1.7), + ], + ); + final middleRightCurveFixtureDef = FixtureDef(middleRightCurveShape); + fixturesDefs.add(middleRightCurveFixtureDef); + final bottomRightCurveShape = BezierCurveShape( - controlPoints: bottomRightControlPoints, - )..rotate(curveRotationAngle); - final bottomRightFixtureDef = FixtureDef(bottomRightCurveShape); - fixturesDefs.add(bottomRightFixtureDef); - - final exitWall = ArcShape( - center: exitPoint, - arcRadius: width / 2, - angle: math.pi, - rotation: exitRotationAngle, + controlPoints: [ + Vector2(-25.29, -1.7), + Vector2(-29.91, -8.5), + Vector2(-26.8, -15.7), + ], ); - final exitFixtureDef = FixtureDef(exitWall); - fixturesDefs.add(exitFixtureDef); + final bottomRightCurveFixtureDef = FixtureDef(bottomRightCurveShape); + fixturesDefs.add(bottomRightCurveFixtureDef); return fixturesDefs; } @@ -159,6 +133,52 @@ class _SpaceshipExitRailRamp extends BodyComponent return body; } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprite(); + } + + Future _loadSprite() async { + final sprite = await gameRef.loadSprite( + Assets.images.components.spaceshipDropTube.path, + ); + final spriteComponent = SpriteComponent( + sprite: sprite, + size: Vector2(17.5, 55.7), + anchor: Anchor.center, + position: Vector2(-29.4, -5.7), + ); + + await add(spriteComponent); + } +} + +class _SpaceshipExitRailBase extends BodyComponent + with InitialPosition, Layered { + _SpaceshipExitRailBase({required this.radius}) + : super( + priority: SpaceshipExitRail.ballPriorityWhenOnSpaceshipExitRail + 1, + ) { + renderBody = false; + layer = Layer.board; + } + + final double radius; + + @override + Body createBody() { + final shape = CircleShape()..radius = radius; + + final fixtureDef = FixtureDef(shape); + + final bodyDef = BodyDef() + ..position = initialPosition + ..userData = this; + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } } /// {@template spaceship_exit_rail_end} @@ -172,12 +192,18 @@ class SpaceshipExitRailEnd extends RampOpening { insideLayer: Layer.spaceshipExitRail, orientation: RampOrientation.down, ) { + renderBody = false; layer = Layer.spaceshipExitRail; } @override Shape get shape { - return CircleShape()..radius = 1; + return ArcShape( + center: Vector2(-29, -17.8), + arcRadius: 2.5, + angle: math.pi * 0.8, + rotation: -0.16, + ); } } @@ -191,8 +217,7 @@ class SpaceshipExitRailEndBallContactCallback @override void begin(SpaceshipExitRailEnd exitRail, Ball ball, _) { ball - ..priority = 1 - ..gameRef.reorderChildren() + ..sendTo(exitRail.outsidePriority) ..layer = exitRail.outsideLayer; } } diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index cc8aac9c..e0d25592 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -22,6 +22,7 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.dashBumper.main.active.keyName), images.load(components.Assets.images.dashBumper.main.inactive.keyName), images.load(Assets.images.components.background.path), + images.load(Assets.images.components.spaceshipDropTube.path), ]); } } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index b5162053..0711e677 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -45,9 +45,7 @@ class PinballGame extends Forge2DGame ); unawaited( addFromBlueprint( - SpaceshipExitRail( - position: Vector2(-34.3, 23.8), - ), + SpaceshipExitRail(), ), ); diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 97be7f3e..2fe23925 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -20,6 +20,10 @@ class $AssetsImagesComponentsGen { /// File path: assets/images/components/background.png AssetGenImage get background => const AssetGenImage('assets/images/components/background.png'); + + /// File path: assets/images/components/spaceship-drop-tube.png + AssetGenImage get spaceshipDropTube => + const AssetGenImage('assets/images/components/spaceship-drop-tube.png'); } class Assets { diff --git a/packages/geometry/test/src/geometry_test.dart b/packages/geometry/test/src/geometry_test.dart index e702f043..eb5e8d74 100644 --- a/packages/geometry/test/src/geometry_test.dart +++ b/packages/geometry/test/src/geometry_test.dart @@ -114,9 +114,9 @@ void main() { Vector2(0, 0), Vector2(10, 10), ], - step: 0.001, + step: 0.02, ); - expect(points.length, 1000); + expect(points.length, 50); }); }); diff --git a/packages/pinball_components/lib/src/components/spaceship.dart b/packages/pinball_components/lib/src/components/spaceship.dart index 4d84eb68..59f1037a 100644 --- a/packages/pinball_components/lib/src/components/spaceship.dart +++ b/packages/pinball_components/lib/src/components/spaceship.dart @@ -195,8 +195,8 @@ class SpaceshipHole extends RampOpening { @override Shape get shape { return ArcShape( - center: Vector2(0, 4.2), - arcRadius: 6, + center: Vector2(0, 3.2), + arcRadius: 5, angle: 1, rotation: 60 * pi / 180, ); diff --git a/test/game/components/spaceship_exit_rail_test.dart b/test/game/components/spaceship_exit_rail_test.dart index 99afc808..edd81aab 100644 --- a/test/game/components/spaceship_exit_rail_test.dart +++ b/test/game/components/spaceship_exit_rail_test.dart @@ -31,29 +31,33 @@ void main() { when(() => fixture.filterData).thenReturn(filterData); }); + // TODO(alestiago): Make ContactCallback private and use `beginContact` + // instead. group('SpaceshipExitHoleBallContactCallback', () { - test('changes the ball priority on contact', () { + setUp(() { + when(() => ball.priority).thenReturn(1); when(() => exitRailEnd.outsideLayer).thenReturn(Layer.board); + when(() => exitRailEnd.outsidePriority).thenReturn(0); + }); + test('changes the ball priority on contact', () { SpaceshipExitRailEndBallContactCallback().begin( exitRailEnd, ball, MockContact(), ); - verify(() => ball.priority = 1).called(1); + verify(() => ball.sendTo(exitRailEnd.outsidePriority)).called(1); }); - test('reorders the game children', () { - when(() => exitRailEnd.outsideLayer).thenReturn(Layer.board); - + test('changes the ball layer on contact', () { SpaceshipExitRailEndBallContactCallback().begin( exitRailEnd, ball, MockContact(), ); - verify(game.reorderChildren).called(1); + verify(() => ball.layer = exitRailEnd.outsideLayer).called(1); }); }); });