diff --git a/lib/game/components/spaceship_exit_rail.dart b/lib/game/components/spaceship_exit_rail.dart index a82eb91c..e83d3995 100644 --- a/lib/game/components/spaceship_exit_rail.dart +++ b/lib/game/components/spaceship_exit_rail.dart @@ -12,10 +12,7 @@ import 'package:pinball_components/pinball_components.dart' hide Assets; /// {@endtemplate} class SpaceshipExitRail extends Forge2DBlueprint { /// {@macro spaceship_exit_rail} - SpaceshipExitRail({required this.position}); - - /// The [position] where the elements will be created - final Vector2 position; + SpaceshipExitRail(); @override void build(_) { @@ -23,17 +20,16 @@ class SpaceshipExitRail extends Forge2DBlueprint { SpaceshipExitRailEndBallContactCallback(), ]); - final spaceshipExitRailRamp = _SpaceshipExitRailRamp() - ..initialPosition = position; - final exitRail = SpaceshipExitRailEnd() - ..initialPosition = position + _SpaceshipExitRailRamp.exitPoint; + final exitRailRamp = _SpaceshipExitRailRamp(); + final exitRailEnd = SpaceshipExitRailEnd(); final topBase = _SpaceshipExitRailBase(radius: 0.55) - ..initialPosition = position + Vector2(12, -11.5); + ..initialPosition = Vector2(-26.15, 18.65); final bottomBase = _SpaceshipExitRailBase(radius: 0.8) - ..initialPosition = position + Vector2(12.8, -43.5); + ..initialPosition = Vector2(-25.5, -12.9); + addAll([ - spaceshipExitRailRamp, - exitRail, + exitRailRamp, + exitRailEnd, topBase, bottomBase, ]); @@ -47,105 +43,77 @@ class _SpaceshipExitRailRamp extends BodyComponent layer = Layer.spaceshipExitRail; } - static final exitPoint = Vector2(9.2, -48.5); - List _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 topRightCurveShape = BezierCurveShape( + controlPoints: [ + Vector2(-33, 31.3), + Vector2(-33.2, 26.4), + Vector2(-27.2, 21.3), + ], + ); + final topRightCurveFixtureDef = FixtureDef(topRightCurveShape); + fixturesDefs.add(topRightCurveFixtureDef); + + 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; } @@ -165,10 +133,10 @@ class _SpaceshipExitRailRamp extends BodyComponent @override Future onLoad() async { await super.onLoad(); - await _loadBackground(); + await _loadSprite(); } - Future _loadBackground() async { + Future _loadSprite() async { final sprite = await gameRef.loadSprite( Assets.images.components.spaceshipDropTube.path, ); @@ -177,7 +145,7 @@ class _SpaceshipExitRailRamp extends BodyComponent size: Vector2(17.5, 55.7), anchor: Anchor.center, ) - ..position = Vector2(8.7, 24.5) + ..position = Vector2(-29.4, -5.7) ..priority = 2; await add(spriteComponent); @@ -187,6 +155,7 @@ class _SpaceshipExitRailRamp extends BodyComponent class _SpaceshipExitRailBase extends BodyComponent with InitialPosition, Layered { _SpaceshipExitRailBase({required this.radius}) : super(priority: 5) { + renderBody = false; layer = Layer.board; } @@ -200,8 +169,7 @@ class _SpaceshipExitRailBase extends BodyComponent final bodyDef = BodyDef() ..position = initialPosition - ..userData = this - ..type = BodyType.static; + ..userData = this; return world.createBody(bodyDef)..createFixture(fixtureDef); } @@ -224,7 +192,12 @@ class SpaceshipExitRailEnd extends RampOpening { @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, + ); } } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 9673b2d2..2cb851f8 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -55,9 +55,7 @@ class PinballGame extends Forge2DGame ); unawaited( addFromBlueprint( - SpaceshipExitRail( - position: Vector2(-34.3, 23.8), - ), + SpaceshipExitRail(), ), ); diff --git a/packages/geometry/lib/src/geometry.dart b/packages/geometry/lib/src/geometry.dart index 6975f8cb..edc176e7 100644 --- a/packages/geometry/lib/src/geometry.dart +++ b/packages/geometry/lib/src/geometry.dart @@ -82,7 +82,7 @@ List calculateEllipse({ /// For more information read: https://en.wikipedia.org/wiki/B%C3%A9zier_curve List calculateBezierCurve({ required List controlPoints, - double step = 0.001, + double step = 0.01, }) { assert( 0 <= step && step <= 1,