From c1a25df01a6cd3eddf00ed2e03a030f5e8408f4c Mon Sep 17 00:00:00 2001 From: Erick Zanardo Date: Wed, 9 Mar 2022 18:39:00 -0300 Subject: [PATCH] feat: adding placeholder art for the flippers --- assets/images/components/flipper.png | Bin 0 -> 8287 bytes lib/game/components/flipper.dart | 28 ++++++++++++++++++------- lib/game/game_assets.dart | 1 + test/game/components/anchor_test.dart | 3 +++ test/game/components/pathway_test.dart | 13 ++++++++++++ test/game/components/plunger_test.dart | 1 + test/game/components/wall_test.dart | 1 + 7 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 assets/images/components/flipper.png diff --git a/assets/images/components/flipper.png b/assets/images/components/flipper.png new file mode 100644 index 0000000000000000000000000000000000000000..f63974c482a57307fcd6bbcedd306710a10703ad GIT binary patch literal 8287 zcmX9^bzD>58z#r-5#ne@Hv<9b77!2-K}uRcLO`j}0;7?Xbc9l)OUcpQAl(Sc=Km^&l`fAKe*`6qAlHkJ2(Bg~q5}#8JNRWU$XKY-N{$t#4OI71oW-~iKnZcnq5dnU$4;Tbk%@#6?Ss9NK@j(vqhWdVO)Ql0Dzz z@5}tmMCl_&<69PxJz!;e+S6Yu)2vG}yB*v_p_M62b23pS)ykRVQgu{QnOrm5kFO!< z^dTsbn1+V?!o{$@(%~1~ZQKFU#I*0w*Ttpc#Mj!|nwKW}tirsNX=PlE6(byp6{IeF znUa!1Oh->|5(;{UIN^w?s(Ntx$$1Kl4S^rl+#Gvjj&PNX8|> z&3;rB1hYkatag>)eIidBZ?2y^vu0pHu%Y=QqIc+knUt zamr$7zHSjhgTl_Lp3Ke)mTG6!8_TG9hPhmp8XrhktLq|3ma9u`AziqL6E(2)!zYv! z4%8U4gK#)lS>Uj2;o1J+fSHTS0j^R+>jol@ zhoWim4>X=u)<=~7k!{RL2l_>>YUW8)w-tX!sS?c`RlQMtM3xJ1+X&J zxcCRpsE(i514MxX|0oVTC4zX0^aOChVRO(J0e^r0R$@&LeSH9VPr$}d`VFKiwR5%| z#ifnt<9wFU)$@tISFq*MO5AA{`cAdhm{j1qD@?#yQOK$KFJ{+j>?aD^`Fo5QnwMV| zeLiWrnVOkFFNS#Ca;>~?MiJZ(ejpfm9SOv~qW~!(ej!=~;j=geD-#peE_2m?w8VT~ zi2+=UrnP!zjeBON@XI#T35Wi1->cnolaJFwtd=;kip?<iF`nJk7%h=?ko`H4P5-!*eEDdN-DB6D9fXi3# zcd(AnE%ncZ@7GN8eBv*1HIkG9{%XJ~%q~58?y`)!dYdmm^truv{bQryq;Lb!4c^L)a&(j1b`tby_0(>`{a%}d6`+xFO5+?K!$gC zyoIrwCYOaK)sNVShj-AAxGcM-A&1~8@IA2j-9qimsxWWeZ5tS6V?-4S`XY%=edtJ% z){c;Ln=O>Tv!5Ot)7kxSEx!g76&DvlP6xAkU?1|o9IatIng8D zLQml8?PgyB+wSIg?g(-Ap9|~WSbeEDv%Q0ZR+sgjPxl7emnzehCa(%le;_3}Z;2F8VXb!&15whxH+yw+b2WC+ukh3= zwK!|I)3rRQn++RsSOLs&y@m8)M>y!)V87&!4y(Cp8>fNKJo(?F%cnrthO+J7ALzw8 zuoIbb^2ib8Lfz-F6s<1ymv%2&?`3^=%IX+uR{hxF5`&U1HScbov;vcd|3R>OfK+Bc zxNyqM?w<_Da!bur!C~3c0Qx60Taj3P)aCVSQHx)TvzjmKr!3CLx|7_}_t}cnZr)e6 zT6O}|s)gEq$JvRbJ0|tNsmnIQNPITom*N&+*P>xNl-54Ku&}dXd4bDm+R0!i3Ip%( zcbBXKWo1r}RNxARKn4FA&pl($>(ebi{l7nJ_dMnIc%s`)QbIcdvnp^5d-=^!v(N9` zpJhU@vH|KxVU`lI6E7ZCkP$vT@(@=P+Zs`0_U{U~>}0NfWQSsW{V08CkCBm4USK*i zk=D<|WI+Pb#f*U>p9f@3o`cm8Q_>%TZ5Ds`Z>`PkUlU^04+N3aP|3|yWxOG$Vizwx|S@(Lfnh}!;G zZYZ^)&IPbPf&^9|gCPNr@-7LfIDbRS33!-noew{7u;O*7V1-wV%3dJsl9eLVs3N

=5p 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 literal 0 HcmV?d00001 diff --git a/lib/game/components/flipper.dart b/lib/game/components/flipper.dart index bd071b93..509eab7a 100644 --- a/lib/game/components/flipper.dart +++ b/lib/game/components/flipper.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'dart:math' as math; +import 'package:flame/components.dart' show SpriteComponent; import 'package:flame/input.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:pinball/game/game.dart'; @@ -12,19 +12,15 @@ import 'package:pinball/game/game.dart'; /// /// [Flipper] can be controlled by the player in an arc motion. /// {@endtemplate flipper} -class Flipper extends BodyComponent with KeyboardHandler { +class Flipper extends PositionBodyComponent with KeyboardHandler { /// {@macro flipper} Flipper._({ required Vector2 position, required this.side, required List keys, }) : _position = position, - _keys = keys { - // TODO(alestiago): Use sprite instead of color when provided. - paint = Paint() - ..color = const Color(0xFF00FF00) - ..style = PaintingStyle.fill; - } + _keys = keys, + super(size: Vector2(width, height)); /// A left positioned [Flipper]. Flipper.left({ @@ -50,6 +46,8 @@ class Flipper extends BodyComponent with KeyboardHandler { ], ); + static const spritePath = 'components/flipper.png'; + /// The width of the [Flipper]. static const width = 12.0; @@ -75,6 +73,20 @@ class Flipper extends BodyComponent with KeyboardHandler { /// [onKeyEvent] method listens to when one of these keys is pressed. final List _keys; + @override + Future onLoad() async { + await super.onLoad(); + final sprite = await gameRef.loadSprite(spritePath); + positionComponent = SpriteComponent( + sprite: sprite, + size: Vector2(width, height), + ); + + if (side == BoardSide.right) { + positionComponent?.flipHorizontally(); + } + } + /// Applies downward linear velocity to the [Flipper], moving it to its /// resting position. void _moveDown() { diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index 964aeda1..778e2bc2 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -6,6 +6,7 @@ extension PinballGameAssetsX on PinballGame { Future preLoadAssets() async { await Future.wait([ images.load(Ball.spritePath), + images.load(Flipper.spritePath), ]); } } diff --git a/test/game/components/anchor_test.dart b/test/game/components/anchor_test.dart index 5cc37eca..a5aa7d2d 100644 --- a/test/game/components/anchor_test.dart +++ b/test/game/components/anchor_test.dart @@ -15,6 +15,7 @@ void main() { 'loads correctly', (game) async { final anchor = Anchor(position: Vector2.zero()); + await game.ready(); await game.ensureAdd(anchor); expect(game.contains(anchor), isTrue); @@ -25,6 +26,7 @@ void main() { flameTester.test( 'positions correctly', (game) async { + await game.ready(); final position = Vector2.all(10); final anchor = Anchor(position: position); await game.ensureAdd(anchor); @@ -37,6 +39,7 @@ void main() { flameTester.test( 'is static', (game) async { + await game.ready(); final anchor = Anchor(position: Vector2.zero()); await game.ensureAdd(anchor); diff --git a/test/game/components/pathway_test.dart b/test/game/components/pathway_test.dart index d3b82e96..036309b1 100644 --- a/test/game/components/pathway_test.dart +++ b/test/game/components/pathway_test.dart @@ -18,6 +18,7 @@ void main() { flameTester.test( 'has transparent color by default when no color is specified', (game) async { + await game.ready(); final pathway = Pathway.straight( position: Vector2.zero(), start: Vector2(10, 10), @@ -38,6 +39,7 @@ void main() { flameTester.test( 'has a color when is specified', (game) async { + await game.ready(); const defaultColor = Colors.blue; final pathway = Pathway.straight( @@ -59,6 +61,7 @@ void main() { flameTester.test( 'loads correctly', (game) async { + await game.ready(); final pathway = Pathway.straight( position: Vector2.zero(), start: Vector2(10, 10), @@ -75,6 +78,7 @@ void main() { flameTester.test( 'positions correctly', (game) async { + await game.ready(); final position = Vector2.all(10); final pathway = Pathway.straight( position: position, @@ -92,6 +96,7 @@ void main() { flameTester.test( 'is static', (game) async { + await game.ready(); final pathway = Pathway.straight( position: Vector2.zero(), start: Vector2(10, 10), @@ -109,6 +114,7 @@ void main() { flameTester.test( 'has only one ChainShape when singleWall is true', (game) async { + await game.ready(); final pathway = Pathway.straight( position: Vector2.zero(), start: Vector2(10, 10), @@ -128,6 +134,7 @@ void main() { flameTester.test( 'has two ChainShape when singleWall is false (default)', (game) async { + await game.ready(); final pathway = Pathway.straight( position: Vector2.zero(), start: Vector2(10, 10), @@ -150,6 +157,7 @@ void main() { flameTester.test( 'loads correctly', (game) async { + await game.ready(); final pathway = Pathway.arc( position: Vector2.zero(), width: width, @@ -166,6 +174,7 @@ void main() { flameTester.test( 'positions correctly', (game) async { + await game.ready(); final position = Vector2.all(10); final pathway = Pathway.arc( position: position, @@ -183,6 +192,7 @@ void main() { flameTester.test( 'is static', (game) async { + await game.ready(); final pathway = Pathway.arc( position: Vector2.zero(), width: width, @@ -208,6 +218,7 @@ void main() { flameTester.test( 'loads correctly', (game) async { + await game.ready(); final pathway = Pathway.bezierCurve( position: Vector2.zero(), controlPoints: controlPoints, @@ -223,6 +234,7 @@ void main() { flameTester.test( 'positions correctly', (game) async { + await game.ready(); final position = Vector2.all(10); final pathway = Pathway.bezierCurve( position: position, @@ -239,6 +251,7 @@ void main() { flameTester.test( 'is static', (game) async { + await game.ready(); final pathway = Pathway.bezierCurve( position: Vector2.zero(), controlPoints: controlPoints, diff --git a/test/game/components/plunger_test.dart b/test/game/components/plunger_test.dart index 67e215fd..835bbc65 100644 --- a/test/game/components/plunger_test.dart +++ b/test/game/components/plunger_test.dart @@ -16,6 +16,7 @@ void main() { flameTester.test( 'loads correctly', (game) async { + await game.ready(); final plunger = Plunger(position: Vector2.zero()); await game.ensureAdd(plunger); diff --git a/test/game/components/wall_test.dart b/test/game/components/wall_test.dart index 8151055e..7f3c1c9c 100644 --- a/test/game/components/wall_test.dart +++ b/test/game/components/wall_test.dart @@ -37,6 +37,7 @@ void main() { flameTester.test( 'loads correctly', (game) async { + await game.ready(); final wall = Wall( start: Vector2.zero(), end: Vector2(100, 0),