From 21cc04facc8736202c2b6d3bc732067dc4df7048 Mon Sep 17 00:00:00 2001 From: Rui Miguel Alonso Date: Fri, 1 Apr 2022 18:03:09 +0200 Subject: [PATCH] feat: spaceship entrance ramp (#126) * feat: added spaceship entrance ramp assets * refactor: modified ramp to fit on curves * fix: fixed priorities and positions on ramp * refactor: placed jetpack ramp * fix: modified rampopening for priority changes * fix: launcher ramp ball priority * fix: fixed positions and priority * chore: removed unused import * refactor: priority on jetpack ramp * refactor: removed position and changed sprite load method --- .../components/spaceship_railing_bg.png | Bin 0 -> 22626 bytes .../components/spaceship_railing_fg.png | Bin 0 -> 16318 bytes assets/images/components/spaceship_ramp.png | Bin 0 -> 22068 bytes lib/game/components/jetpack_ramp.dart | 226 +++++++++++++++--- lib/game/components/launcher_ramp.dart | 1 + lib/game/components/spaceship_exit_rail.dart | 1 + lib/game/game_assets.dart | 3 + lib/game/pinball_game.dart | 4 +- lib/gen/assets.gen.dart | 12 + .../lib/src/components/spaceship.dart | 3 +- 10 files changed, 210 insertions(+), 40 deletions(-) create mode 100644 assets/images/components/spaceship_railing_bg.png create mode 100644 assets/images/components/spaceship_railing_fg.png create mode 100644 assets/images/components/spaceship_ramp.png diff --git a/assets/images/components/spaceship_railing_bg.png b/assets/images/components/spaceship_railing_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..2298f799d76571ceb07709190aa8fcebd0802fc9 GIT binary patch literal 22626 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 U^|-G1c59UGPpLFz9;K=MAM0VSB>(^b literal 0 HcmV?d00001 diff --git a/assets/images/components/spaceship_railing_fg.png b/assets/images/components/spaceship_railing_fg.png new file mode 100644 index 0000000000000000000000000000000000000000..e788fde04d26139fb820b62c7c42dadb7b3b7c4e GIT binary patch literal 16318 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 J@^u|T{tpDWDqa8p literal 0 HcmV?d00001 diff --git a/assets/images/components/spaceship_ramp.png b/assets/images/components/spaceship_ramp.png new file mode 100644 index 0000000000000000000000000000000000000000..814989652dce688b784a37362cb3be7f0b1d875e GIT binary patch literal 22068 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 YSB_5oFY;DrOY*-ri{nwYcE^!_0TnYBJpcdz literal 0 HcmV?d00001 diff --git a/lib/game/components/jetpack_ramp.dart b/lib/game/components/jetpack_ramp.dart index aa5a9dbd..34b00dd4 100644 --- a/lib/game/components/jetpack_ramp.dart +++ b/lib/game/components/jetpack_ramp.dart @@ -2,45 +2,52 @@ import 'dart:math' as math; -import 'package:flame/extensions.dart'; +import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; -import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball/gen/assets.gen.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; /// A [Blueprint] which creates the [JetpackRamp]. class Jetpack extends Forge2DBlueprint { + /// {@macro spaceship} + Jetpack(); + + static const int ballPriorityInsideRamp = 4; + @override void build(_) { - final position = Vector2( - BoardDimensions.bounds.left + 40.5, - BoardDimensions.bounds.top - 31.5, - ); - addAllContactCallback([ RampOpeningBallContactCallback<_JetpackRampOpening>(), ]); final rightOpening = _JetpackRampOpening( + // TODO(ruimiguel): set Board priority when defined. + outsidePriority: 1, rotation: math.pi, ) - ..initialPosition = position + Vector2(12.9, -20) + ..initialPosition = Vector2(1.7, 19) ..layer = Layer.opening; final leftOpening = _JetpackRampOpening( outsideLayer: Layer.spaceship, + outsidePriority: Spaceship.ballPriorityWhenOnSpaceship, rotation: math.pi, ) - ..initialPosition = position + Vector2(-2.5, -20) + ..initialPosition = Vector2(-13.7, 19) ..layer = Layer.jetpack; - final jetpackRamp = JetpackRamp() - ..initialPosition = position + Vector2(5, -20.2) - ..layer = Layer.jetpack; + final jetpackRamp = JetpackRamp(); + + final jetpackRampWallFg = _JetpackRampForegroundRailing(); + + final baseRight = _JetpackBase()..initialPosition = Vector2(1.7, 20); addAll([ rightOpening, leftOpening, + baseRight, jetpackRamp, + jetpackRampWallFg, ]); } } @@ -49,42 +56,129 @@ class Jetpack extends Forge2DBlueprint { /// Represents the upper left blue ramp of the [Board]. /// {@endtemplate} class JetpackRamp extends BodyComponent with InitialPosition, Layered { - JetpackRamp() : super(priority: 2) { + JetpackRamp() : super(priority: Jetpack.ballPriorityInsideRamp - 1) { layer = Layer.jetpack; - paint = Paint() - ..color = const Color.fromARGB(255, 8, 218, 241) - ..style = PaintingStyle.stroke; } - /// Radius of the external arc. - static const _externalRadius = 18.0; - /// Width between walls of the ramp. static const width = 5.0; List _createFixtureDefs() { final fixturesDef = []; - final externalCurveShape = ArcShape( - center: initialPosition, - arcRadius: _externalRadius, - angle: math.pi, - rotation: math.pi, + final outerLeftCurveShape = BezierCurveShape( + controlPoints: [ + Vector2(-30.95, 38), + Vector2(-32.5, 71.25), + Vector2(-14.2, 71.25), + ], + ); + + final outerLeftCurveFixtureDef = FixtureDef(outerLeftCurveShape); + fixturesDef.add(outerLeftCurveFixtureDef); + + final outerRightCurveShape = BezierCurveShape( + controlPoints: [ + outerLeftCurveShape.vertices.last, + Vector2(4.7, 71.25), + Vector2(6.3, 40), + ], + ); + + final outerRightCurveFixtureDef = FixtureDef(outerRightCurveShape); + fixturesDef.add(outerRightCurveFixtureDef); + + return fixturesDef; + } + + @override + Body createBody() { + renderBody = false; + + final bodyDef = BodyDef() + ..userData = this + ..position = initialPosition; + + final body = world.createBody(bodyDef); + _createFixtureDefs().forEach(body.createFixture); + + return body; + } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprites(); + } + + Future _loadSprites() async { + final spriteRamp = await gameRef.loadSprite( + Assets.images.components.spaceshipRamp.path, + ); + + final spriteRampComponent = SpriteComponent( + sprite: spriteRamp, + size: Vector2(38.1, 33.8), + anchor: Anchor.center, + position: Vector2(-12.2, -53.5), + ); + + final spriteRailingBg = await gameRef.loadSprite( + Assets.images.components.spaceshipRailingBg.path, + ); + final spriteRailingBgComponent = SpriteComponent( + sprite: spriteRailingBg, + size: Vector2(38.3, 35.1), + anchor: Anchor.center, + position: spriteRampComponent.position + Vector2(0, -1), ); - final externalFixtureDef = FixtureDef(externalCurveShape); - fixturesDef.add(externalFixtureDef); - final internalCurveShape = externalCurveShape.copyWith( - arcRadius: _externalRadius - width, + await addAll([ + spriteRailingBgComponent, + spriteRampComponent, + ]); + } +} + +class _JetpackRampForegroundRailing extends BodyComponent + with InitialPosition, Layered { + _JetpackRampForegroundRailing() + : super(priority: Jetpack.ballPriorityInsideRamp + 1) { + layer = Layer.jetpack; + } + + List _createFixtureDefs() { + final fixturesDef = []; + + final innerLeftCurveShape = BezierCurveShape( + controlPoints: [ + Vector2(-24.5, 38), + Vector2(-26.3, 64), + Vector2(-13.8, 64.5), + ], ); - final internalFixtureDef = FixtureDef(internalCurveShape); - fixturesDef.add(internalFixtureDef); + + final innerLeftCurveFixtureDef = FixtureDef(innerLeftCurveShape); + fixturesDef.add(innerLeftCurveFixtureDef); + + final innerRightCurveShape = BezierCurveShape( + controlPoints: [ + innerLeftCurveShape.vertices.last, + Vector2(-1, 64.5), + Vector2(0.1, 39.5), + ], + ); + + final innerRightCurveFixtureDef = FixtureDef(innerRightCurveShape); + fixturesDef.add(innerRightCurveFixtureDef); return fixturesDef; } @override Body createBody() { + renderBody = false; + final bodyDef = BodyDef() ..userData = this ..position = initialPosition; @@ -94,6 +188,56 @@ class JetpackRamp extends BodyComponent with InitialPosition, Layered { return body; } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprites(); + } + + Future _loadSprites() async { + final spriteRailingFg = await gameRef.loadSprite( + Assets.images.components.spaceshipRailingFg.path, + ); + final spriteRailingFgComponent = SpriteComponent( + sprite: spriteRailingFg, + size: Vector2(26.1, 28.3), + anchor: Anchor.center, + position: Vector2(-12.2, -52.5), + ); + + await add(spriteRailingFgComponent); + } +} + +class _JetpackBase extends BodyComponent with InitialPosition, Layered { + _JetpackBase() { + layer = Layer.board; + } + + @override + Body createBody() { + renderBody = false; + + const baseWidth = 6; + final baseShape = BezierCurveShape( + controlPoints: [ + Vector2(initialPosition.x - baseWidth / 2, initialPosition.y), + Vector2(initialPosition.x - baseWidth / 2, initialPosition.y) + + Vector2(2, 2), + Vector2(initialPosition.x + baseWidth / 2, initialPosition.y) + + Vector2(-2, 2), + Vector2(initialPosition.x + baseWidth / 2, initialPosition.y) + ], + ); + final fixtureDef = FixtureDef(baseShape); + + final bodyDef = BodyDef() + ..userData = this + ..position = initialPosition; + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } } /// {@template jetpack_ramp_opening} @@ -104,12 +248,15 @@ class _JetpackRampOpening extends RampOpening { /// {@macro jetpack_ramp_opening} _JetpackRampOpening({ Layer? outsideLayer, + int? outsidePriority, required double rotation, }) : _rotation = rotation, super( insideLayer: Layer.jetpack, outsideLayer: outsideLayer, orientation: RampOrientation.down, + insidePriority: Jetpack.ballPriorityInsideRamp, + outsidePriority: outsidePriority, ); final double _rotation; @@ -117,11 +264,14 @@ class _JetpackRampOpening extends RampOpening { static final Vector2 _size = Vector2(JetpackRamp.width / 4, .1); @override - Shape get shape => PolygonShape() - ..setAsBox( - _size.x, - _size.y, - initialPosition, - _rotation, - ); + Shape get shape { + renderBody = false; + return PolygonShape() + ..setAsBox( + _size.x, + _size.y, + initialPosition, + _rotation, + ); + } } diff --git a/lib/game/components/launcher_ramp.dart b/lib/game/components/launcher_ramp.dart index c05f8aa2..5c071f4f 100644 --- a/lib/game/components/launcher_ramp.dart +++ b/lib/game/components/launcher_ramp.dart @@ -124,6 +124,7 @@ class _LauncherRampOpening extends RampOpening { super( insideLayer: Layer.launcher, orientation: RampOrientation.down, + insidePriority: 3, ); final double _rotation; diff --git a/lib/game/components/spaceship_exit_rail.dart b/lib/game/components/spaceship_exit_rail.dart index fed97e0e..e4be9b31 100644 --- a/lib/game/components/spaceship_exit_rail.dart +++ b/lib/game/components/spaceship_exit_rail.dart @@ -191,6 +191,7 @@ class SpaceshipExitRailEnd extends RampOpening { : super( insideLayer: Layer.spaceshipExitRail, orientation: RampOrientation.down, + insidePriority: 3, ) { renderBody = false; layer = Layer.spaceshipExitRail; diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index e0d25592..dcb740a1 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -22,6 +22,9 @@ 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.spaceshipRamp.path), + images.load(Assets.images.components.spaceshipRailingBg.path), + images.load(Assets.images.components.spaceshipRailingFg.path), images.load(Assets.images.components.spaceshipDropTube.path), ]); } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 0711e677..095a5f53 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -92,7 +92,9 @@ class PinballGame extends Forge2DGame } Future _addPaths() async { - unawaited(addFromBlueprint(Jetpack())); + unawaited( + addFromBlueprint(Jetpack()), + ); unawaited(addFromBlueprint(Launcher())); } diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 2fe23925..7796df34 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -24,6 +24,18 @@ class $AssetsImagesComponentsGen { /// File path: assets/images/components/spaceship-drop-tube.png AssetGenImage get spaceshipDropTube => const AssetGenImage('assets/images/components/spaceship-drop-tube.png'); + + /// File path: assets/images/components/spaceship_railing_bg.png + AssetGenImage get spaceshipRailingBg => + const AssetGenImage('assets/images/components/spaceship_railing_bg.png'); + + /// File path: assets/images/components/spaceship_railing_fg.png + AssetGenImage get spaceshipRailingFg => + const AssetGenImage('assets/images/components/spaceship_railing_fg.png'); + + /// File path: assets/images/components/spaceship_ramp.png + AssetGenImage get spaceshipRamp => + const AssetGenImage('assets/images/components/spaceship_ramp.png'); } class Assets { diff --git a/packages/pinball_components/lib/src/components/spaceship.dart b/packages/pinball_components/lib/src/components/spaceship.dart index 59f1037a..588c0e33 100644 --- a/packages/pinball_components/lib/src/components/spaceship.dart +++ b/packages/pinball_components/lib/src/components/spaceship.dart @@ -185,8 +185,9 @@ class SpaceshipHole extends RampOpening { : super( insideLayer: Layer.spaceship, outsideLayer: outsideLayer, - outsidePriority: outsidePriority, orientation: RampOrientation.up, + insidePriority: 4, + outsidePriority: outsidePriority, ) { renderBody = false; layer = Layer.spaceship;