From ae093d2c9cf271f3f78900f31524755a558d7eaf Mon Sep 17 00:00:00 2001 From: Robert Garrett Date: Wed, 17 Dec 2025 14:29:57 -0600 Subject: [PATCH] Add bullet/laser sound Firing the weapon now makes a sound. I've implemented this by spawning the playback component on the bullet rather than the gun. This seemed easier than figuring out how to reset a playback component that lives on the ship entity -- although thats probably better for memory access patterns. --- assets/laserSmall_001.ogg | Bin 0 -> 7448 bytes src/lib.rs | 2 ++ src/resources.rs | 11 +++++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 assets/laserSmall_001.ogg diff --git a/assets/laserSmall_001.ogg b/assets/laserSmall_001.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ffc89b9e7e2d816fd532e1a06f379a32ef1d4cef GIT binary patch literal 7448 zcmeG=cU05K*1u3gQ%XRpFCg8(GZ2s@wjCC8IMO$m$_4RQRBw_T-5|aObK=hYqi|=!z^L)Xxe3Yh-~Lq2 z@op@&6Ht(Xj|AyDMFt|nf_>fA86a(udb`kiyYzPHBQ>4EBZ7}aQmB-OC@n54G4PoY zTy0%k_u5k;A}Ddz0I=W5!NJne)n%{C;phl|WFRGi66q5~@kjc`A+3GFDK2plQ9;On z$iv}CS88-%Fj6x%HdZ%^+tr~)Mf(RI*7Z9at_9=Y*p`<0em58d2MeR|$S&H0Od{;+s|L8|QvQ9#1@&q}I3UZOql!I8RV@jsJ&`EEbqV)EK&LnYsw)y>O~v$3O+dAd zvgpgk5B`kb`nwXiYKI^kTCwY>VjqwOL1!e=;2?GHIMrbsh=MDTe_c+m+Y2~|a#28T z2o0{E>9Z~t8dz5LB7DE-1}8v3zc`O%Jz%{b#BO0NlvE-LMmkbl3p83Q^9t5A7&as~ z2Xv{`pWjuI|A0juvK3{qH+pfB1%fq|4*^VWsc=iToDZN2e#jE6oFsv{?hjatms=5_ zmy%te(bVd?vEHUxRQ^yn)PemQn2|D75ZWr_1$v+S3*QV1abbTp9~{t|&xCAuQ3CR0 zhJY_Zxk8z_J?f_|%o233R{8ey3@f|JGY1HA8tkZq^^+qZC{cXfihpm`O?ktL%d;5T z{hC+r=?$Q`P4(R&F>z=}}@z>3qG7K^F1SesCG(-?UtJDXsq#oq8Jpj4!P zrkQ};x|1a5MfPi50$%aG;#O4eODGM0SMR@5be2>Dby!cwMSm~Rm3S~F-2Hs?bW4)g zMD)z~$(ix=L)()7Y*>GI4g{Pgaos1gebdlAg=ZYig*FuYyXPE5^qf=dJEv;jpz81t zHMoj#dXE{FvUJ8cxJY{qOGl5$P+SbXMhqw;M9QNW%49ReqvfP~^QOaWxXsLX^mm@a zbrBV8#+*$S-`_o_L^I==QN|A2ELHa`^|;)?6jo(^@r%k*;Xip!5aUuF;}V^*M9rf9){<`v~JOf&qfffgm{unlG;yJ+?*CHxrv;76iBL zRP6FJeo8h;xzo#t+W^1@|7aP7gN zi*nGG9+;v7ucAFK@H}p@9f2GWut6zqU;?Fm7=x4Ai<7e482)E1V1#kz19fv5z-ZVN zHjLTi1-P{9TjDSvlKki8pYU=vfH{4~3x{#QxjOvkoc_DQe+quwgr4L<`}≶qFcWqb4J$iSbv1#QCAwBZz^A80UGTTy}72?@^Tfh{ZVyNP<#S zFrX_@ycAaB?$0?Azv>klx-0Re7da2tDVV=bm|SKx4J zMF8ap#sN@{^Opv(Dk?c3lHk?}A4Pj@qjO;#5M6kAEg%X{ddctFB@VAa2{NinwA8khg|pm2W^; zCigd`A6L97<47-{4X&Wn2Dmz^+%BTnpq}0?Os$<~CYMng3}1FdCRc6W@HH z7^eAb_KpgF|7!XB`{n<$H$e`qX>x;Phmv@4?uqI8)v86(83Nnn8zdpP5YW0A9sOK2 zJIl^a+B^-bsg{#VX4II|(QtP8C^-x*a~~^su{@j1&}x1L6a--4C}d9&Wp*|>Ri|0D zAWRu(Efm1~^zE7e3>+mCW!DN|^6V%W9$ai_je*tz)xQ1_*{`}uy(}$@3#)D# zQ^_Xibt7CrkCnKq`=hL1HF}B6l)UrHb{8E$913hZqlp>5k~>xyXwZ%ANz-CPUf+7+Q(mI}-anaF*KmBZH&W+1%;I+OGJ z9dR)+i_i~da1nr=8hdnOh9)-?wyXRD!OqSmtj~q7r^w(b%FR?If$e4!z`P{DVof+KLJPm4lEIGao!NLWNv>8>RXr>k7nUUCF)q)}uDek0KDiKo!Jkm!r@ zn%Wh-v@ZVS6HxDi37Z?&Xu7uVBHQ7O%zd%p4uBqSlHtcAv!NvxyyK)*nc4S`0d2Q3;Io0#IvEv#(p@Qw$- z^#)sygg6KWhi^PMxnnqd{U-`vq4xTGi2D_JVcrmW?TuODYV?4gh%4*nE4DHz6a_HOAJ!dMCrMtUpc`D2d1 z!n^n*4blsnqLXm?4y?umGC_1qzR6d~zM51LQfkPMf8)Y0qEO9AIyR%y+&Fn%nkn5% zb|zZZUGi9i!Bv9VOC;W{eWH+q)je^ZsR~=KY;_z+#%K>FiqJ!k&i!qzBX}~i`w}8L zq$&r+m_i+p(c8(U+bG8hp0&jn_M6@7FiUe!%g^`s4UpL(WFu-N=4M$9+_mGfbEpof zYsx>ktCPbHCe@ebx}n4nBN&~Uf)Jm)3TgX3EVYTe9Q#s{@RVdWL6~n6v2KD*VO*UQE@11{r zX2kvZu?v%5O%F#9MaKLS^jn0=su}v9Wx}EzBX^th@wN4aCtRESbnIYn+y&XA7t}uL z=T9=3d{60?rgQwO+Iu)BR4>M#m47D=E?|PZYLUl zu&o)D+1=3X-iZ2?+HmU0c!&1T75*Wt^sBbr<-b)F<;08}IKZD)O59a?Ye%5V&h$Vg zL4|!=BJwW}Gh$I~F5?qL{_(Lhp1E=#tSr2`e|bJId}v|%@VW3)Ifb{TqGvdq?6WU= zs|l}v-7Z3iSX?xv-ZE(UZR~Mu4Ccl*+9mQLl2*L6Jg$?K72dA=hewH`ap9o`p464!+aKfi%Y=}*MfU)X|jpf7AT}%d;wWZMpRE z^)s8!F#l52m8 zpBHjYkb67aYk?g@Oh%g*;hdIiZz{#bHn@sW^ZOQpGuv0s-(GTl@qSy?LIZms1B2J~ zFn|?X56<7PnS16I|1MJGf@}Ui4&#C>3*0_5XKPuZ7P&@*?Do9}3Z4gYt^VL^+1Wkz zwA-zVC5)tbvq)Ey1`SERd2mQm#kXdRUJ7?hr`MD)oEsVYE_`It>9iUS`B6y-(Q-$( zn}y{p6JN7>(`|lk`t{pTuOHH@P-5dghYEUHw8u$%BVKT>Oi!;GDqgTjmjBwz)bx65 zN`$rjYMbGy7D(N9MSpbaQSBI6xj*{cxg!DL(W^0+Zb{)LiXI$|c)}bo`ZRU&>zA&n z7tsOZpQ%zU#~J#}-ods>&ux1!h3DQqUaKz1?Uy@T`QX%r53J(0CoujWte?+k2~)!{c?dK*kCI1N$G}^`DkqWhd}=;X9s}~<>e_UDk|pXb3I8F2Gt#e zi937T4Uv~QzSFJBvSwo9vM{8QHx}L)@q|OPH;AH#ScWQ*EguC*zb6L0e*5W)TdWD}`5YYg@-uz!_;pgWd-p(mse^peh|Usz;SPIJd5|&+dlc$hN|KAx ziK10L2~%WZm4OPKR239O9_Dd#wM^|FZnD7Z{>B-t{A-TE&ECZ-gJ&TIUyLK$1`p<6 zi9K&;>Rx>1zJV_DU}(*nqsnoE2>pw#9&1&74tM4y?}mk3cw9=VyB9K@nrT}y9};lX zog&oIdG*W`t8IE!r)hqTYGP~6Yvo3RXMX&6DDGv>q37`?Vou~&g4F?U<^2 zR7!oH1b9q6PY02&`UaDwI_o+K=(=4U432?;PPGS;#E{Ju;JEf3 z9BPXwIFhej<+<=i`_REq>A zNtYX){D-Bycq@FMuPKiez098OHr|(<^lIh%!4Y)do7{dgJRaQpW@#>@G^M;ekp4p| z$w--0VrN~GghG|9q5IX4DgQh-#C}l)GqL(f7F$}O#+^Za?utTk61sdXs+_w@wFOcu z*OuqCHEOdCpPVP|KR?~wx20`ud5c8Icxu@4>*(t9k2youX7%03n@p1}8ZtQpW;=3; z1SigZ-2+*JnCK3>@bvKF)vxZgH4^Q#bnk64%7-ufT+DNuUQpi^-u8}kEUsq_#im0V zI=z`c*p^Nz>+IzbgzuF+UH1d2yc7C?^Cf;un@GTcDAC7+Ir2Y@jyaU{eW>da?89&fa~Ye)0$GKOc}%F3ya?8Ki*Bx3*h6%R2BqQrsp zpiamB0!^BV>Prd61iWJ@oNcf2|IGtGB%G@#GiZ&KP)l@QGTOnx6P{ z#FQ19J{JG+$x!n?kwdW_RxLE|yzSWFjN>*4)pi@GE&oe=My_ri)8tFLz{h~qZ&>nm zZ^zXYUWLbRQ9JD{`0^{I@e>5Bkr5qRzAF_=mypue*9ZDcGteeAsaRR^D^vxCI(v9D zO-##I+=_O=OSp)F)QS%=9K75pVFrbUOQ%_OmKqk=aMJhRc2S|IOazB}&6K{Iq6ELA z+U-Qu7OV(9B)o44JQnIJsg$nx+n4s1 z^bE5~ZkmvcJEL<%YFQ;%ry7r#9+QYQ#Gkl;Xm)GAs z>bVX2s`+K+lqA0HHBG~4ukg2)3w%;xduD|k$IS~~%p%pfQAWMHvlE0Fd=@yIp`l@g z@(06;^oz~SF~0T%qYoL;p%p|AQd46Gfqz(AzUX<^JA~bnW z$b9fn|B3Klr#{=)W@#{QAVrE^?fLBge%{y=raM!h!Q=mn>fLKMk;`9#IDcw cEiIaS`f}o~@r|4S#N=+Al((5%+>AQ(Kh-JN3;+NC literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs index f9c0c54..94b5b77 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -199,6 +199,8 @@ fn input_ship_shoot( MeshMaterial2d(game_assets.bullet().1), ship_pos.clone(), // clone ship transform Lifetime(Timer::from_seconds(BULLET_LIFETIME, TimerMode::Once)), + AudioPlayer::new(game_assets.laser_sound()), + PlaybackSettings::ONCE, // `Lifetime` already despawns the entity, so this doesn't need to )); } } diff --git a/src/resources.rs b/src/resources.rs index fa2cfa2..4620298 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -58,7 +58,7 @@ impl Default for WorldSize { pub struct GameAssets { meshes: [Handle; 5], materials: [Handle; 7], - sounds: [Handle; 1], + sounds: [Handle; 2], } impl GameAssets { @@ -101,6 +101,10 @@ impl GameAssets { pub fn wreck_sound(&self) -> Handle { self.sounds[0].clone() } + + pub fn laser_sound(&self) -> Handle { + self.sounds[1].clone() + } } impl FromWorld for GameAssets { @@ -129,7 +133,10 @@ impl FromWorld for GameAssets { world_materials.add(BULLET_COLOR), ]; let loader = world.resource_mut::(); - let sounds = [loader.load("explosionCrunch_004.ogg")]; + let sounds = [ + loader.load("explosionCrunch_004.ogg"), + loader.load("laserSmall_001.ogg") + ]; GameAssets { meshes, materials,