From 254c38d2a4b0e7d215c6ec1943903e6cad0a5c71 Mon Sep 17 00:00:00 2001 From: Rui Miguel Alonso Date: Wed, 6 Apr 2022 18:35:11 +0200 Subject: [PATCH] feat: add sparky bumpers (#150) * feat: added sparky bumpers * test: tests for sparky bumpers * feat: sandbox for sparky bumpers * chore: unused imports * refactor: removed Bumper and added TODO for future refactor * fix: fixed size and tracing * fix: fix tracing * fix: final ellipse sizes * refactor: different sized bumpers * Update packages/pinball_components/lib/src/components/sparky_bumper.dart Co-authored-by: Allison Ryan Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> --- .../assets/images/sparky_bumper/a/active.png | Bin 0 -> 3033 bytes .../images/sparky_bumper/a/inactive.png | Bin 0 -> 2896 bytes .../assets/images/sparky_bumper/b/active.png | Bin 0 -> 2983 bytes .../images/sparky_bumper/b/inactive.png | Bin 0 -> 2882 bytes .../assets/images/sparky_bumper/c/active.png | Bin 0 -> 3278 bytes .../images/sparky_bumper/c/inactive.png | Bin 0 -> 3138 bytes .../lib/gen/assets.gen.dart | 46 +++++++ .../lib/src/components/components.dart | 1 + .../lib/src/components/sparky_bumper.dart | 125 ++++++++++++++++++ packages/pinball_components/pubspec.yaml | 3 + .../pinball_components/sandbox/lib/main.dart | 1 + .../sparky_bumper/sparky_bumper_game.dart | 47 +++++++ .../lib/stories/sparky_bumper/stories.dart | 17 +++ .../sandbox/lib/stories/stories.dart | 1 + .../src/components/sparky_bumper_test.dart | 74 +++++++++++ 15 files changed, 315 insertions(+) create mode 100644 packages/pinball_components/assets/images/sparky_bumper/a/active.png create mode 100644 packages/pinball_components/assets/images/sparky_bumper/a/inactive.png create mode 100644 packages/pinball_components/assets/images/sparky_bumper/b/active.png create mode 100644 packages/pinball_components/assets/images/sparky_bumper/b/inactive.png create mode 100644 packages/pinball_components/assets/images/sparky_bumper/c/active.png create mode 100644 packages/pinball_components/assets/images/sparky_bumper/c/inactive.png create mode 100644 packages/pinball_components/lib/src/components/sparky_bumper.dart create mode 100644 packages/pinball_components/sandbox/lib/stories/sparky_bumper/sparky_bumper_game.dart create mode 100644 packages/pinball_components/sandbox/lib/stories/sparky_bumper/stories.dart create mode 100644 packages/pinball_components/test/src/components/sparky_bumper_test.dart diff --git a/packages/pinball_components/assets/images/sparky_bumper/a/active.png b/packages/pinball_components/assets/images/sparky_bumper/a/active.png new file mode 100644 index 0000000000000000000000000000000000000000..6e84d8efcd84fdd00d08fb7935b91176106c2940 GIT binary patch literal 3033 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 anA|#;+|oH9Y5NGS$Pg0oq+Pj<5BopX4_~hU literal 0 HcmV?d00001 diff --git a/packages/pinball_components/assets/images/sparky_bumper/b/active.png b/packages/pinball_components/assets/images/sparky_bumper/b/active.png new file mode 100644 index 0000000000000000000000000000000000000000..02371ce188a5c1b795349d7150bffa59e9b9f2f9 GIT binary patch literal 2983 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 cCTQSoO>o>6gY2)kv?9p3hNa0e@_5^^8f$< literal 0 HcmV?d00001 diff --git a/packages/pinball_components/assets/images/sparky_bumper/b/inactive.png b/packages/pinball_components/assets/images/sparky_bumper/b/inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..20b4f092735ec9294afd8aec57ff552bc64cbe63 GIT binary patch literal 2882 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 literal 0 HcmV?d00001 diff --git a/packages/pinball_components/assets/images/sparky_bumper/c/active.png b/packages/pinball_components/assets/images/sparky_bumper/c/active.png new file mode 100644 index 0000000000000000000000000000000000000000..857483757ab9e7058fd30e275543ac75b34320ea GIT binary patch literal 3278 zcmWlcc{r3`8^_1K%*0qjVn_&OEKwqits%@HTe2lfmJG(eXUUcbC2Pc_2^paX6V;Tl zljUdMvnBh^d*07=opb(quKPOYKF{~Qzb64>q<4l@fE5CPoI&5xHUX;^7}uE@!R+aq z)ejaH?^{;B5D1j(|APkdDwhuefkmRVHO*YdS93xzW)}IB=H1bdLtIYNShu~Fa>uz? zw{DFX*LHcib9gk$`(-&s!L;n#yA`|rzBl5T9hS=i?$kC9^Gnsk83Ucp)!FmMnXN-q5%%1}3s);4%b&cjg54pv!n*PhM<<#+u8P^nY}K3H6GaxyGMw-{Sy_RdK@ zJ6T&a?epi)*9*E9e6Ipu(TblM!^ZTB4Hvin3y7FohLF>k{CK2%#w+YiUKK&kG~dD=X~MtjGer9^wRzN)4c@@9epJ^AAayod~;#;AfCUx9~eILOmjYk_)*#Likf0ew> zY;d%Uwbz^p+AUsnBfBfZ)r6|5DlDOIasId~j6)=5c41+m`Cy4ynSTv8tqo4zWxN@i z4)#u&S^rp9SEqiw)fYiDDKmo#v3#^HuPp%(i9~4-arRIK%dHdNIyFRkK;=#P?zn$N zJV;O6p~kwrAz*EM6>J`=#&weJSY^2~mkfwd>L7CtUHESDm_R^_00rDL~0%=)+V6ZO`)d!R5QP9xU{< zH2Wfb{r&xB1_lPydve+B0MC(HPiQPkWM3ph4Bgw^-Hp-G(rOLxc_&E0u~wcK?n^Cl2n_cS7ataE4etkoaj#@mFawdWn@&fb$y;ZNilVljs?KLCkqt@5g|GF<< znEequxb&N7ahLdh!0+-Z2MXiXX{u)Hd0f`xD)Xr%8)T`jwzk&i;ZuVJYr*dwen`g!O9@e}HnNE-h|4EX`*$JVI(IA>d?>6AU8z?My?Ymc+SX9grMyFLwR<_OzNUfr! z(9IfaZe9z1DXAt|!8oe#>BH=oOB8MqjV4Wd?_L$VI`W1XC%eu*VMkqLlj?NVWVE zr1J{-Y`h$ClKc`n7pOXw^4+nDh@4*67860Eac|k--xZ&Vih6HI&X(bZwu6w|+y=$P z#S29}u3G|p>!07KT;Nz)qd}c)#ZLJ^4sU9kWguT!u=!$f(?EK59c%Mkke4|*n_9%p z1_A+5u#CQ*?YG5qzL}vjBGxUOgMPUf+k%uXspFT29jeFUj#*jKiWsUtP3Jh!@e40G`oLrkiu2M%mr67saA5*XJNY%l_10Lxa;jpcqzd*sY z`^lT<93UE!+^qY@;l|6x5d%ow{-az<%9llsZi2dT(ERj8jX2&w%)7_w^fvkW**YWQ zfr;H3_{Ml*P!5!Bafe~Z*7ZO$RnB06K_-B-EuMzGlP+aOGNQ_`B zQ9oc2Dz7vaR1NfAJNM|zdK@Uq5vDKfmg%*z+@4A!&w5<@RYx{v^x|AoT7(i2gX(m1 zB^($EJKb5&$Z?3%oQw=N782?;S#2DdcS?UWA7<|ZBZ-L?4NOx>DqG4&eA0G%{JgSd zPgW+Hn~yt`CqjLLgM$xb@nHt3e5sU~#>PgMz6&eWd5gy{m!3)r% zmIo{CP7jtVPgQT+IAn4$!Ye2cQtv0Ma%ZW;ebtLbq%(Ib77jp?ZfgYbd~o8ozr>i# zOa8#z?Mj0(DRfnNu#1xa?by@LIk|DsKA4v89K9}+X(#Rqv)FTp(@*YLv5uC!?4+h> zsdlr0*MZ+B?A;7gZez^~i;HI_cUDL0cDJ{;#}+jYN5Y*H4f`?ym5n?9xp%2Lt zfXApxp3&gY(9m9+bmftjp`l?IlCM7*mPaUM>O?6xX!XoNkwL57@nIMV$HGcjVsz+8 z1iDo67Pn^f9dhM>qizATp^7;_`eOH8Va-MMclMVgpYg{foB@O%ty6^8M(Q3-0Q=A% z5F|WzH%JA={HwFG(+gD7(8ZD$w(lw`!edI^PDrhqb^^ljA&#)3FwWpzMG~!-Q*78| zF^%`SB%d6MC>24X*H1@q(k3_~-~w3l*bll)%>$8qT@?h2oQGvdiAwbV literal 0 HcmV?d00001 diff --git a/packages/pinball_components/assets/images/sparky_bumper/c/inactive.png b/packages/pinball_components/assets/images/sparky_bumper/c/inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..b5b3584d466d2f870530e496fb687c2e49d2038f GIT binary patch literal 3138 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 literal 0 HcmV?d00001 diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index 154930bc..de59219e 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -30,6 +30,8 @@ class $AssetsImagesGen { $AssetsImagesLaunchRampGen get launchRamp => const $AssetsImagesLaunchRampGen(); $AssetsImagesSpaceshipGen get spaceship => const $AssetsImagesSpaceshipGen(); + $AssetsImagesSparkyBumperGen get sparkyBumper => + const $AssetsImagesSparkyBumperGen(); } class $AssetsImagesBaseboardGen { @@ -142,6 +144,14 @@ class $AssetsImagesSpaceshipGen { const AssetGenImage('assets/images/spaceship/saucer.png'); } +class $AssetsImagesSparkyBumperGen { + const $AssetsImagesSparkyBumperGen(); + + $AssetsImagesSparkyBumperAGen get a => const $AssetsImagesSparkyBumperAGen(); + $AssetsImagesSparkyBumperBGen get b => const $AssetsImagesSparkyBumperBGen(); + $AssetsImagesSparkyBumperCGen get c => const $AssetsImagesSparkyBumperCGen(); +} + class $AssetsImagesDashBumperAGen { const $AssetsImagesDashBumperAGen(); @@ -206,6 +216,42 @@ class $AssetsImagesSpaceshipRampGen { 'assets/images/spaceship/ramp/railing-foreground.png'); } +class $AssetsImagesSparkyBumperAGen { + const $AssetsImagesSparkyBumperAGen(); + + /// File path: assets/images/sparky_bumper/a/active.png + AssetGenImage get active => + const AssetGenImage('assets/images/sparky_bumper/a/active.png'); + + /// File path: assets/images/sparky_bumper/a/inactive.png + AssetGenImage get inactive => + const AssetGenImage('assets/images/sparky_bumper/a/inactive.png'); +} + +class $AssetsImagesSparkyBumperBGen { + const $AssetsImagesSparkyBumperBGen(); + + /// File path: assets/images/sparky_bumper/b/active.png + AssetGenImage get active => + const AssetGenImage('assets/images/sparky_bumper/b/active.png'); + + /// File path: assets/images/sparky_bumper/b/inactive.png + AssetGenImage get inactive => + const AssetGenImage('assets/images/sparky_bumper/b/inactive.png'); +} + +class $AssetsImagesSparkyBumperCGen { + const $AssetsImagesSparkyBumperCGen(); + + /// File path: assets/images/sparky_bumper/c/active.png + AssetGenImage get active => + const AssetGenImage('assets/images/sparky_bumper/c/active.png'); + + /// File path: assets/images/sparky_bumper/c/inactive.png + AssetGenImage get inactive => + const AssetGenImage('assets/images/sparky_bumper/c/inactive.png'); +} + class Assets { Assets._(); diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index bf578ea7..6b0c2ef5 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -19,3 +19,4 @@ export 'shapes/shapes.dart'; export 'spaceship.dart'; export 'spaceship_rail.dart'; export 'spaceship_ramp.dart'; +export 'sparky_bumper.dart'; diff --git a/packages/pinball_components/lib/src/components/sparky_bumper.dart b/packages/pinball_components/lib/src/components/sparky_bumper.dart new file mode 100644 index 00000000..e6a5f237 --- /dev/null +++ b/packages/pinball_components/lib/src/components/sparky_bumper.dart @@ -0,0 +1,125 @@ +import 'dart:math' as math; + +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_components/pinball_components.dart'; + +/// {@template sparky_bumper} +/// Bumper for Sparky area. +/// {@endtemplate} +// TODO(ruimiguel): refactor later to unify with DashBumpers. +class SparkyBumper extends BodyComponent with InitialPosition { + /// {@macro sparky_bumper} + SparkyBumper._({ + required double majorRadius, + required double minorRadius, + required String activeAssetPath, + required String inactiveAssetPath, + required SpriteComponent spriteComponent, + }) : _majorRadius = majorRadius, + _minorRadius = minorRadius, + _activeAssetPath = activeAssetPath, + _inactiveAssetPath = inactiveAssetPath, + _spriteComponent = spriteComponent; + + /// {@macro sparky_bumper} + SparkyBumper.a() + : this._( + majorRadius: 2.9, + minorRadius: 2.1, + activeAssetPath: Assets.images.sparkyBumper.a.active.keyName, + inactiveAssetPath: Assets.images.sparkyBumper.a.inactive.keyName, + spriteComponent: SpriteComponent( + anchor: Anchor.center, + position: Vector2(0, -0.25), + ), + ); + + /// {@macro sparky_bumper} + SparkyBumper.b() + : this._( + majorRadius: 2.85, + minorRadius: 2, + activeAssetPath: Assets.images.sparkyBumper.b.active.keyName, + inactiveAssetPath: Assets.images.sparkyBumper.b.inactive.keyName, + spriteComponent: SpriteComponent( + anchor: Anchor.center, + position: Vector2(0, -0.35), + ), + ); + + /// {@macro sparky_bumper} + SparkyBumper.c() + : this._( + majorRadius: 3, + minorRadius: 2.2, + activeAssetPath: Assets.images.sparkyBumper.c.active.keyName, + inactiveAssetPath: Assets.images.sparkyBumper.c.inactive.keyName, + spriteComponent: SpriteComponent( + anchor: Anchor.center, + position: Vector2(0, -0.4), + ), + ); + + final double _majorRadius; + final double _minorRadius; + final String _activeAssetPath; + late final Sprite _activeSprite; + final String _inactiveAssetPath; + late final Sprite _inactiveSprite; + final SpriteComponent _spriteComponent; + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprites(); + + // TODO(erickzanardo): Look into using onNewState instead. + // Currently doing: onNewState(gameRef.read()) will throw an + // `Exception: build context is not available yet` + deactivate(); + await add(_spriteComponent); + } + + @override + Body createBody() { + renderBody = false; + + final shape = EllipseShape( + center: Vector2.zero(), + majorRadius: _majorRadius, + minorRadius: _minorRadius, + )..rotate(math.pi / 1.9); + final fixtureDef = FixtureDef(shape) + ..friction = 0 + ..restitution = 4; + + final bodyDef = BodyDef() + ..position = initialPosition + ..userData = this; + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } + + Future _loadSprites() async { + // TODO(alestiago): I think ideally we would like to do: + // Sprite(path).load so we don't require to store the activeAssetPath and + // the inactive assetPath. + _inactiveSprite = await gameRef.loadSprite(_inactiveAssetPath); + _activeSprite = await gameRef.loadSprite(_activeAssetPath); + } + + /// Activates the [DashNestBumper]. + void activate() { + _spriteComponent + ..sprite = _activeSprite + ..size = _activeSprite.originalSize / 10; + } + + /// Deactivates the [DashNestBumper]. + void deactivate() { + _spriteComponent + ..sprite = _inactiveSprite + ..size = _inactiveSprite.originalSize / 10; + } +} diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index c7302d0d..312e01f3 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -39,6 +39,9 @@ flutter: - assets/images/spaceship/ramp/ - assets/images/chrome_dino/ - assets/images/kicker/ + - assets/images/sparky_bumper/a/ + - assets/images/sparky_bumper/b/ + - assets/images/sparky_bumper/c/ flutter_gen: line_length: 80 diff --git a/packages/pinball_components/sandbox/lib/main.dart b/packages/pinball_components/sandbox/lib/main.dart index 1801fa52..88b86da6 100644 --- a/packages/pinball_components/sandbox/lib/main.dart +++ b/packages/pinball_components/sandbox/lib/main.dart @@ -21,5 +21,6 @@ void main() { addChromeDinoStories(dashbook); addDashNestBumperStories(dashbook); addKickerStories(dashbook); + addSparkyBumperStories(dashbook); runApp(dashbook); } diff --git a/packages/pinball_components/sandbox/lib/stories/sparky_bumper/sparky_bumper_game.dart b/packages/pinball_components/sandbox/lib/stories/sparky_bumper/sparky_bumper_game.dart new file mode 100644 index 00000000..a0ad661a --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/sparky_bumper/sparky_bumper_game.dart @@ -0,0 +1,47 @@ +import 'dart:async'; + +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 SparkyBumperGame extends BasicBallGame { + SparkyBumperGame({ + required this.trace, + }) : super(color: const Color(0xFF0000FF)); + + static const info = ''' + Shows how a SparkyBumper is rendered. + + Activate the "trace" parameter to overlay the body. +'''; + + final bool trace; + + @override + Future onLoad() async { + await super.onLoad(); + + final center = screenToWorld(camera.viewport.canvasSize! / 2); + final sparkyBumperA = SparkyBumper.a() + ..initialPosition = Vector2(center.x - 20, center.y - 20) + ..priority = 1; + final sparkyBumperB = SparkyBumper.b() + ..initialPosition = Vector2(center.x - 10, center.y + 10) + ..priority = 1; + final sparkyBumperC = SparkyBumper.c() + ..initialPosition = Vector2(center.x + 20, center.y) + ..priority = 1; + await addAll([ + sparkyBumperA, + sparkyBumperB, + sparkyBumperC, + ]); + + if (trace) { + sparkyBumperA.trace(); + sparkyBumperB.trace(); + sparkyBumperC.trace(); + } + } +} diff --git a/packages/pinball_components/sandbox/lib/stories/sparky_bumper/stories.dart b/packages/pinball_components/sandbox/lib/stories/sparky_bumper/stories.dart new file mode 100644 index 00000000..d0933b67 --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/sparky_bumper/stories.dart @@ -0,0 +1,17 @@ +import 'package:dashbook/dashbook.dart'; +import 'package:flame/game.dart'; +import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/sparky_bumper/sparky_bumper_game.dart'; + +void addSparkyBumperStories(Dashbook dashbook) { + dashbook.storiesOf('Sparky Bumpers').add( + 'Basic', + (context) => GameWidget( + game: SparkyBumperGame( + trace: context.boolProperty('Trace', true), + ), + ), + codeLink: buildSourceLink('sparky_bumper/basic.dart'), + info: SparkyBumperGame.info, + ); +} diff --git a/packages/pinball_components/sandbox/lib/stories/stories.dart b/packages/pinball_components/sandbox/lib/stories/stories.dart index 108cca05..746d83d6 100644 --- a/packages/pinball_components/sandbox/lib/stories/stories.dart +++ b/packages/pinball_components/sandbox/lib/stories/stories.dart @@ -6,3 +6,4 @@ export 'effects/stories.dart'; export 'flipper/stories.dart'; export 'layer/stories.dart'; export 'spaceship/stories.dart'; +export 'sparky_bumper/stories.dart'; diff --git a/packages/pinball_components/test/src/components/sparky_bumper_test.dart b/packages/pinball_components/test/src/components/sparky_bumper_test.dart new file mode 100644 index 00000000..470c254b --- /dev/null +++ b/packages/pinball_components/test/src/components/sparky_bumper_test.dart @@ -0,0 +1,74 @@ +// 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() { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(TestGame.new); + + group('SparkyBumper', () { + flameTester.test('"a" loads correctly', (game) async { + final bumper = SparkyBumper.a(); + await game.ensureAdd(bumper); + + expect(game.contains(bumper), isTrue); + }); + + flameTester.test('"b" loads correctly', (game) async { + final bumper = SparkyBumper.b(); + await game.ensureAdd(bumper); + expect(game.contains(bumper), isTrue); + }); + + flameTester.test('"c" loads correctly', (game) async { + final bumper = SparkyBumper.c(); + await game.ensureAdd(bumper); + expect(game.contains(bumper), isTrue); + }); + + flameTester.test('activate returns normally', (game) async { + final bumper = SparkyBumper.a(); + await game.ensureAdd(bumper); + + expect(bumper.activate, returnsNormally); + }); + + flameTester.test('deactivate returns normally', (game) async { + final bumper = SparkyBumper.a(); + await game.ensureAdd(bumper); + + expect(bumper.deactivate, returnsNormally); + }); + + flameTester.test('changes sprite', (game) async { + final bumper = SparkyBumper.a(); + await game.ensureAdd(bumper); + + final spriteComponent = bumper.firstChild()!; + + final deactivatedSprite = spriteComponent.sprite; + bumper.activate(); + expect( + spriteComponent.sprite, + isNot(equals(deactivatedSprite)), + ); + + final activatedSprite = spriteComponent.sprite; + bumper.deactivate(); + expect( + spriteComponent.sprite, + isNot(equals(activatedSprite)), + ); + + expect( + activatedSprite, + isNot(equals(deactivatedSprite)), + ); + }); + }); +}