From 06c737ca3ced1da4ee1a5f9a66006c3cc470d358 Mon Sep 17 00:00:00 2001 From: Allison Ryan Date: Tue, 5 Apr 2022 15:25:29 -0500 Subject: [PATCH] feat: add slingshots --- lib/game/game_assets.dart | 4 + lib/game/pinball_game.dart | 1 + .../assets/images/slingshot/left_lower.png | Bin 0 -> 6458 bytes .../assets/images/slingshot/left_upper.png | Bin 0 -> 6061 bytes .../assets/images/slingshot/right_lower.png | Bin 0 -> 6542 bytes .../assets/images/slingshot/right_upper.png | Bin 0 -> 6002 bytes .../lib/gen/assets.gen.dart | 21 +++ .../lib/src/components/components.dart | 1 + .../lib/src/components/slingshot.dart | 131 ++++++++++++++++++ packages/pinball_components/pubspec.yaml | 1 + 10 files changed, 159 insertions(+) create mode 100644 packages/pinball_components/assets/images/slingshot/left_lower.png create mode 100644 packages/pinball_components/assets/images/slingshot/left_upper.png create mode 100644 packages/pinball_components/assets/images/slingshot/right_lower.png create mode 100644 packages/pinball_components/assets/images/slingshot/right_upper.png create mode 100644 packages/pinball_components/lib/src/components/slingshot.dart diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index 47175c32..050b2cd3 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -15,6 +15,10 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.baseboard.right.keyName), images.load(components.Assets.images.kicker.left.keyName), images.load(components.Assets.images.kicker.right.keyName), + images.load(components.Assets.images.slingshot.leftUpper.keyName), + images.load(components.Assets.images.slingshot.leftLower.keyName), + images.load(components.Assets.images.slingshot.rightUpper.keyName), + images.load(components.Assets.images.slingshot.rightLower.keyName), images.load(components.Assets.images.launchRamp.ramp.keyName), images.load( components.Assets.images.launchRamp.foregroundRailing.keyName, diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 1fa99b8c..660269fd 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -39,6 +39,7 @@ class PinballGame extends Forge2DGame unawaited(addFromBlueprint(LaunchRamp())); unawaited(_addPlunger()); unawaited(add(Board())); + unawaited(addFromBlueprint(Slingshots())); unawaited(addFromBlueprint(DinoWalls())); unawaited(_addBonusWord()); unawaited(addFromBlueprint(SpaceshipRamp())); diff --git a/packages/pinball_components/assets/images/slingshot/left_lower.png b/packages/pinball_components/assets/images/slingshot/left_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..b44b58fbca8025771379cb8ac421e789a896c9ee GIT binary patch literal 6458 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 OAs7vVn>A{7k^cjqC8WIo literal 0 HcmV?d00001 diff --git a/packages/pinball_components/assets/images/slingshot/right_lower.png b/packages/pinball_components/assets/images/slingshot/right_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..71a6a277828fd5d0f99dc5cae819e067e5d3df90 GIT binary patch literal 6542 zcmW+*2RzjO8$Vf>T}digiHi$AossNp&MKQicCr-_StlnHQD#vHQC1vTT}VgL87Z@i zOSUt!{*V9jGSA(8Ki}thKkw)Le#Dy?>9Dh$U_l@d?0UMIX7F7BJ`Ipe@b!$erXPGe z=&NfTfIzSw+5eMCm@aJr0eMl7@Z4wwyxZ=M~S;5 zax6oYHKGuO{}yB~&qmy6<`L}hv$MCiA4xS<*>pBAFes(WSNxp2by3T-ufNptjeS$t zrkU^~-N&TK%JLaSp_pxR`j;rYf5XW9{-49=2~>{Rk%rsX+}x-vNfZVIMkq!&=AI+3 zduAawOYC-cmb?x#6BARCfa-3uq+OkFo=us>-oLO-N$H+k<?;=3@z3=N{>bTnnA68FZ?!dQj-`?+p_lsdDz; z>Wuu}IJ4?ToU=?un#<59D$Uu|71!0>eMm3meo2WY8I$jEqBkh#PrdgJHr>Tc@<}`j z|I!52HyW|G!@0IF);#82`%~4=SE+}_%)z&jb-g2L?Dq=iJQHbngHGoZLqo%dX2qIU%xlnR@WO|*dJi}^;oF2Wa&txd zJ=0Kl4R~6L$RSg1J;j_aO)K9Fq$vH%}JV#9!-jJZ%$bZM$O#(xBrDjCC-Ksj?Db$ zGm6WbN+^8P&$;%nvkV9>F1VZVm1**yKY#9xcr$nSnQ${A#(fpw%KgK`!<&Cg-|RLF zKqRw2Cr=07-6UNLZ=1VyTONZk;fSN}_dGi3f4tR!i(4x)AN8s7foBa%^H?*I4{=4p zoKN`pZ@!IhZjd@%57TO-$GO3oho;;6hFH7K_Egt*^##{cuDx%H0IXqce*4>*Ntcw z>!&UcsUe>#*@)70QehLUdtqZucb^q`WQM#(Tu7qihD>Ep*@?*F5|;D3N44mLoF5eg z+B0K&*R6bR-Qv+n=5K@S9^#05lFkQ-#gcjG)`FFCd&1YM_Jp~R3<44@z6yNP3kzcs zB$?|nhc)i6#zGD|-v!#oiRf8a@?dx?yBi#AwY zSy@ru{GIwNKYg@9hw))Ps-&TzL5z>17S4muN3Wk(&s5F2-E4w_^vs-?4m=SZ9sRvI zLe)-kP+8y=>a#tGTzxdT#)h3+ONa|ucWYsEN2`cDeFu%OPIsyG8mdflL;f z+#O_u<_9$LeA9hGV$?vUbiNFthX(#SG!#ESKObs0D9r|Vm|-&Ij)hv;52_<09eD#S zEeDJ08ydFwS=DNP&V~OiE|NQ}31Te#S<24WTsBEDb)U8(3GYf^%^c^9qq9MIOrvM*(9g$p41MOeuM;i8U)R2is z^j=(~0Y^_AY`xh1!sgp4b>S}^qYBCuyB_&^jMgk>1I{i0X=SL6tZa-qI z6p6zzk%djnj~196to0uG@bM!(nll|?C+)*&>>#-&4=t+2T{;+n0kZO3UB z84Q-(qq?_EW9H-s%nM84h2dg>_Bw8EMMuxWp)pw7)rS;?Iy*^)93z06UdqEx=ZD>{ zkBo}`la-Avo<94k1mE7S9Yb`iO4AU2q(-pQzI2IRA&J=6$1S3#A;{(1?^)B=mT;^` z*^B69ZNkOi`19S(pA716fja={ILC*EqNZpb$EqPNmRPPt?f+zCq5>7!0Ux|f?wQ&O zeA>pwod5p)Lodc~1vg%;uC2M=hCg~=Q~0^Z4=1hSD=ZVfytf)o6_|D6jd6}%4Y%h0 z*@+x3j&SDj^7Qol*Dl|*lxTwD{uXrV{Q2__U5@9Yq6$4Aac|MAsr?@*e!-2SS{3cm zYkOSEj*o`{=Sf#gZY$&93ir7gWgXe#k zczYYJ5$Npv`!n$sBApSEYC8jQ79T~Lj2fJY1x$4KDMailY3t}fA;VMz6crW6X`8-( z`_9_c2OfkPf5Fx4Jdc>DsI-CtvWOgCSSX5&x)-LBT;JUxOeU2UAm1fmR}WsL_H* zUxMAZ0tY;Dzk~9s-_yjr|MOdaEUwT4enIgh@CpcY2<$F0za)F~_4iv3n#mq5GJe(` ze?;u-zyMBHgKUzP2tG+_=9!?f5s@m7Rr*EDYpsjRNN*DQ?$F6m!>pt z40&3!z^rwATyQje>*oFZ`vk%TX}0Trme6fm+f>!Pw)1XZvR_{jPm4S7XZ21a>q}LJ z19TXmZ&U6W+5i5FT!`4)3WjO@b!^Os@D>VIVO4!KO}|aw3@$j~+cLBIVP2ZR}YTsq!n}FA>vrN4h z_N;Cuy%YytT-wppPLXinc@1tYKvJ+0KMao|^1tR2*%FOhA zWMrf&We~w$+)zvZv<>XFL4H6~6o(#>(g9V48@7{fItpXmCX1f%pk=L?B>DZ&f^qQq7 zpoC%!u~_U`e7>(}Nr(haL+F0Kd;i6Bmx>UYE65c#PR`T($uIKq=;r3;{`~!`5fE@5 zx&y{pNeS@E9hnTi3lY29s_g9SJ926IiJvRcjM1&-X%d!Ae*zUPGlig$e=R8tyt&4C z+4lvCrNZj<-G$M{t%z-kz#etdrnfS^q~vdr>dv$=ob2o2n@ns(pm_H?@7-eXOPwzb|917)^=_8w~n^4vOLG8yq}+BGJbAnTxe37jh#RgqnAS61(ezh+>||##*f$?UMES5b!|EX`o$b0hiZw7TizK&@`Nj@rEK}KeIjER}~ngllsC5G#| zo|_{IZx;3|UX0@{dPXi(ldN{?)G3&Uh4-`|6<>#k?be|3mq>X&T~XTRZoIgm=7_!U z(U+%K?b7m5601MGYj;sn&cF1^Kz&2a?VM4@9lMiCz3lmb3bb% z#7N6J?btGlBPUOs7{C!Hys>1I{opyDrL7%cMGNgog`}I_-rg!ffBQm*yyR$Vm5!pR zov-(A5`R>}0zFrPZT<9^AtYA^#l7rSHM9+2AN%ZDb*yq|);mpnpJIw(trG^+PI@>|z@=mo@$8k_x#dhbi#?5VV4 zb>baK7bP=K|&j zfoT|Xvi$NMxhQ(x)fVwO=68HzM_W8k%QRiK&^p5UtVjXP0IaNNSYAKrMQ znR?_?Wm2JsY*x4H!tCtu!F%@ZZT%HTN zg%;$mUlDL6yzLdtiJK<`1onKryu4O=f=;aW3kDGEBzf7Gb-&Mc z1PY71Tx4`A)g@#o+tif1b7ochdc}89EZLoGz^$cTVYN?yA#V-}jVmMpQwA+G@9kCq zBV3hJ13s9B$hmlX{&i_-X+zKO2YssO-7@&O8DJZ?6ueEG{3whiS9iNotkY!&%IzD* z7S=Cz^MB(m&@VVF{OEq$YoyQ>6n6=UO1q7Vi<8vC(}U464R$13%H@k1dt>%?H0ZAZCnEyq-8 zQ4w>V2@(b{nxtWF9&n#1D=#mfb0J_#Q{`EY)XC?LyzPAuQ(%)ioGQM5t5hdfn;*jt zt2~nmo*yPeI?IG?85`m~B3iDk&wg=JUGMe@r;SBSN?hA~0^0pXey{suYREvgQAW=F z9_l3+!orV`Fn+su&AA!*lf~4K#rvr_9l!A`n_f3X1k}b4$iS_0=XOP z&|oG{`V%%_(C3_I$Xv4!>J* z#6wEZYZdwh!aGBBf4*HVzVh!OTm0ogLj6F0YQ*^?KUrrV7ohM!M^+XP%()7VFDfJLtt6KS3GLBI63t;XV z-W;h9B7s%m940pHn!WQ|{o7ya^M0xQIlPt6k2}Nct%Z4I|zzt}GFcRSoY=RSbE-MAw%q^#16_*FQK|+XOnjH_XqP z@(bKJUi(EaHcRfN&4~n8=I7$#p!7;g-Z@pEs%vW-t_DxU(#LR#rs=m*X{`(Ew(>8{ ziq!^#K-;z%u*EnyJ2Rk3PLrS0A{bPqj4}{s@s+~^6TZG_`ix@6x!XC@9xE~zUM$aC z+xzDWAU}7v=Y5qZ5ta%z;6dIco|F%dq=tC6j-5le@-&SNWM_DR>q%espy4uOV9LV2 zK!J~=zP7e@kV<1rpUa;jfCBjg8Y5Y1GGfZksa5)j zQyk3VX)N=D(x32NcayAbcya2#=RLw4?m-jZ`SUgJQh-4e(NK=HW2CTnoFeOo5L@y=1J#lcR2EU~Atj3w6_9we3w-7$xMGxl)vkM#ytZ#T~9H+jA3Dx-% z*sRkhmV#e9r*=BO?&QXjarvm_OLQ1mNR3Bxs?^;9SQac~wEcJ;01l?j39Q)%%F=#A z@h96>TtY??C)9Lwm|+o7ey!OXn?84|LH2@NT;b)*mj|$ztY7{FuWo^ZLYnE5f9ccW z3o8D=tT0yHSs}C5GIl?GnvoGHqW2WYpo5}*{rZcvZ(?F%aGdd54d*yK-)V#81c?Eg zB#Q+da`og7P;Q_=EwZz!5`7iek|@$DDpwW5HWnkWqN%Bzj1RdqfY-u7vxO2_2Qs>X zC3q50+$;}84#L4DEX!jAk)iisVH*8~$}QhY@kg9)TqHvjAAJfkPB{5B!e&EMaDS-yF*+b7-gv0N5=uRFI< z(UB-Ya1{>z{)aJGB4z1$Ss6QjGBfo{&ZRsPt3Jz2!=mzX4tOSXrRS~VxQdi7v$N=O zJAxDTg>`ycSJ#986cz7On4r2;suMDQVDn5+z%1h}AF!>lwkB}ysp0&JibE>TIDt(j ze4*q{US4eVl_V$`??1b+N{>H1|dZE=VlKCzy6FF747ne`d zArY|}d2jbC`+ueKkUmpCIM3uBn)J!F>S=DSwt+!{EK-)#0z}{krcLX#JWV@eR>$1j zS?2h@#?CMlJ{;II&aZNQJ8KMy6e zjr$XTh6n@s$qydz?aui`Y|X^}>pDHuoeh3sVam2{c(W~g;ivlN45`X^|k@Na~kNu=v%fk9;F66#T91JQA zl}}hVOJqVoGqkt2KQtZ3!7Z(c(X8%620)PVk=ckLFh1Y}bpH?w=mmnw6 zrCb9Q+ux6{5v^{VEzATjO)xqD(rq<4AN6Z{lco?b#RiB1K?A$RqMcbc)h#J8qiltW z>Vv_~Gus)4qO<{9pGM%~!P+ZM7z5afh;4_fLMEXrlK>GKdG}81B!RPp71;BpCVsF{ z787za?of6VUbn#PIf?~F>Yw>}97q@Ow9ot(VIjAp?V0RV#e=YTZB_AWu68Uuv>!ys zZcI%cip8J6w_iVSvl$u3VJ&;5v|o#L##NLF(J+z(uJX$lqrjk`yr!m6KI-u}P63te z{x{*Pr3Gfifn#T4bb{c;qDg!g{C}reUJYq;T{Bu2{|TN38vIph=_OdC0B?img;c`) zK#z^29A=>Nu007KAmSeBGI-a9nx5@+tr{A<7O}IcDjyT#TvSj{FbRfUM;5kQ*MixI zZ~6C%ElM?0L}1liR^)=gp2j&2(;`YrN>n#Hjl=y_8`mmM;qzaOLIC;F(L!1~`~vL< z<8V0KzJzBISkLpw9IXel-3l>j<$s(86HTcz`)5%U)+#T(oV>PXm& zzk_g)=3Tkdcs03$V#=)rd+%H$s8I$4h#8QSHOX7ka~+4@!1^tDnNYAN^<|IlP_Tte UBvxtz{=tIK(=yU5*KmmXA3&?lwg3PC literal 0 HcmV?d00001 diff --git a/packages/pinball_components/assets/images/slingshot/right_upper.png b/packages/pinball_components/assets/images/slingshot/right_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b42ded4f2a513501042baaba58a1a7174ac402 GIT binary patch literal 6002 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 F{|64fsRRH3 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..6fe4d75f 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -29,6 +29,7 @@ class $AssetsImagesGen { $AssetsImagesKickerGen get kicker => const $AssetsImagesKickerGen(); $AssetsImagesLaunchRampGen get launchRamp => const $AssetsImagesLaunchRampGen(); + $AssetsImagesSlingshotGen get slingshot => const $AssetsImagesSlingshotGen(); $AssetsImagesSpaceshipGen get spaceship => const $AssetsImagesSpaceshipGen(); } @@ -125,6 +126,26 @@ class $AssetsImagesLaunchRampGen { const AssetGenImage('assets/images/launch_ramp/ramp.png'); } +class $AssetsImagesSlingshotGen { + const $AssetsImagesSlingshotGen(); + + /// File path: assets/images/slingshot/left_lower.png + AssetGenImage get leftLower => + const AssetGenImage('assets/images/slingshot/left_lower.png'); + + /// File path: assets/images/slingshot/left_upper.png + AssetGenImage get leftUpper => + const AssetGenImage('assets/images/slingshot/left_upper.png'); + + /// File path: assets/images/slingshot/right_lower.png + AssetGenImage get rightLower => + const AssetGenImage('assets/images/slingshot/right_lower.png'); + + /// File path: assets/images/slingshot/right_upper.png + AssetGenImage get rightUpper => + const AssetGenImage('assets/images/slingshot/right_upper.png'); +} + class $AssetsImagesSpaceshipGen { const $AssetsImagesSpaceshipGen(); diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index bf578ea7..1caf2aab 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -16,6 +16,7 @@ export 'launch_ramp.dart'; export 'layer.dart'; export 'ramp_opening.dart'; export 'shapes/shapes.dart'; +export 'slingshot.dart'; export 'spaceship.dart'; export 'spaceship_rail.dart'; export 'spaceship_ramp.dart'; diff --git a/packages/pinball_components/lib/src/components/slingshot.dart b/packages/pinball_components/lib/src/components/slingshot.dart new file mode 100644 index 00000000..52bcf318 --- /dev/null +++ b/packages/pinball_components/lib/src/components/slingshot.dart @@ -0,0 +1,131 @@ +// ignore_for_file: avoid_renaming_method_parameters + +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 slingshots} +/// A [Blueprint] which creates the left and right pairs of [Slingshot]s. +/// {@endtemplate} +class Slingshots extends Forge2DBlueprint { + @override + void build(_) { + final leftUpperSlingshot = Slingshot( + length: 5.66, + angle: -1.5 * (math.pi / 180), + spritePath: Assets.images.slingshot.leftUpper.keyName, + )..initialPosition = Vector2(-29, 1.5); + final leftLowerSlingshot = Slingshot( + length: 3.54, + angle: -29.1 * (math.pi / 180), + spritePath: Assets.images.slingshot.leftLower.keyName, + )..initialPosition = Vector2(-31, -6.2); + final rightUpperSlingshot = Slingshot( + length: 5.64, + angle: 1 * (math.pi / 180), + spritePath: Assets.images.slingshot.rightUpper.keyName, + )..initialPosition = Vector2(22.3, 1.58); + final rightLowerSlingshot = Slingshot( + length: 3.46, + angle: 26.8 * (math.pi / 180), + spritePath: Assets.images.slingshot.rightLower.keyName, + )..initialPosition = Vector2(24.7, -6.2); + + addAll([ + leftUpperSlingshot, + leftLowerSlingshot, + rightUpperSlingshot, + rightLowerSlingshot, + ]); + } +} + +/// {@template slingshot} +/// Elastic bumper that bounces the [Ball] off of its straight sides. +/// {@endtemplate} +class Slingshot extends BodyComponent with InitialPosition { + /// {@macro slingshot} + Slingshot({ + required double length, + required double angle, + required String spritePath, + }) : _length = length, + _angle = angle, + _spritePath = spritePath, + super(priority: 1); + + final double _length; + + final double _angle; + + final String _spritePath; + + List _createFixtureDefs() { + final fixturesDef = []; + const circleRadius = 1.55; + + final topCircleShape = CircleShape()..radius = circleRadius; + topCircleShape.position.setValues(0, _length / 2); + final topCircleFixtureDef = FixtureDef(topCircleShape); + fixturesDef.add(topCircleFixtureDef); + + final bottomCircleShape = CircleShape()..radius = circleRadius; + bottomCircleShape.position.setValues(0, -_length / 2); + final bottomCircleFixtureDef = FixtureDef(bottomCircleShape); + fixturesDef.add(bottomCircleFixtureDef); + + final leftEdgeShape = EdgeShape() + ..set( + Vector2(circleRadius, _length / 2), + Vector2(circleRadius, -_length / 2), + ); + final leftEdgeShapeFixtureDef = FixtureDef(leftEdgeShape)..restitution = 5; + fixturesDef.add(leftEdgeShapeFixtureDef); + + final righttEdgeShape = EdgeShape() + ..set( + Vector2(-circleRadius, _length / 2), + Vector2(-circleRadius, -_length / 2), + ); + final righttEdgeShapeFixtureDef = FixtureDef(righttEdgeShape) + ..restitution = 5; + fixturesDef.add(righttEdgeShapeFixtureDef); + + return fixturesDef; + } + + @override + Body createBody() { + final bodyDef = BodyDef() + ..userData = this + ..position = initialPosition + ..angle = _angle; + + final body = world.createBody(bodyDef); + _createFixtureDefs().forEach(body.createFixture); + + return body; + } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprite(); + renderBody = false; + } + + Future _loadSprite() async { + final sprite = await gameRef.loadSprite(_spritePath); + + await add( + SpriteComponent( + sprite: sprite, + size: sprite.originalSize / 10, + anchor: Anchor.center, + angle: _angle, + ), + ); + } +} diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index c7302d0d..68141623 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -39,6 +39,7 @@ flutter: - assets/images/spaceship/ramp/ - assets/images/chrome_dino/ - assets/images/kicker/ + - assets/images/slingshot/ flutter_gen: line_length: 80