From e04c8d0bd4e44c9ea403ca82d08b3f1c5c5f21b7 Mon Sep 17 00:00:00 2001 From: Askou Date: Mon, 7 Jun 2021 11:22:45 +0200 Subject: [PATCH] add basic music manager --- CMakeLists.txt | 4 + assets/sounds/bomb_drop.ogg | Bin 0 -> 11489 bytes assets/sounds/death.ogg | Bin 0 -> 8715 bytes assets/sounds/new_death.ogg | Bin 0 -> 9601 bytes sources/Component/Music/MusicComponent.cpp | 75 +++++++++++++----- sources/Component/Music/MusicComponent.hpp | 45 ++++++++--- sources/Runner/Runner.cpp | 13 ++- .../System/Music/PlayerMusicManagerSystem.cpp | 26 ++++++ .../System/Music/PlayerMusicManagerSystem.hpp | 31 ++++++++ 9 files changed, 161 insertions(+), 33 deletions(-) create mode 100644 assets/sounds/bomb_drop.ogg create mode 100644 assets/sounds/death.ogg create mode 100644 assets/sounds/new_death.ogg create mode 100644 sources/System/Music/PlayerMusicManagerSystem.cpp create mode 100644 sources/System/Music/PlayerMusicManagerSystem.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 71343bba..19a5e613 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,6 +67,10 @@ set(SOURCES sources/Component/Collision/CollisionComponent.hpp sources/System/Collision/CollisionSystem.hpp sources/System/Collision/CollisionSystem.cpp + sources/Component/Music/MusicComponent.cpp + sources/Component/Music/MusicComponent.hpp + sources/System/Music/PlayerMusicManagerSystem.cpp + sources/System/Music/PlayerMusicManagerSystem.hpp ) add_executable(bomberman sources/main.cpp diff --git a/assets/sounds/bomb_drop.ogg b/assets/sounds/bomb_drop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..40288f0e3f734ea1d28d6ee72209ca0f17b7c2ed GIT binary patch literal 11489 zcmb_?by$?o*Y^zuphzev9nz^wFAXZO^n%19(h^H3iy$RPHzFmSOGqfOgtSU`cSwqg zbk}v`VmdH;FuYnYvx6Ekzp`J9=(7c~nDO#m18=V2om;leiaF3-f`(BU}Q zJD6CZumd;`3jp8@e1Jc==bx20YFNqtJXlE_um?3W?jV)Ma{lWXx^$uG2FRdn?DR}f zgjax%7jhqhm7oXz%T)FtryqMj*oprg~-UEW74U|UW1gWg96HBp#`LYn_p3<7540B{-bVkZdC zTvD{|hFVatg*&7{tyD#F81RBMW}yUMc34gAvdglOcHJB-_&4;f0HAfG6&U@<;MmF} zkkOw4tO95pS{ZYa9IkQZrg>lEYi00J=3B{%QWagv%?ua)$zIkgd!47OAEpc$(l#xs zy=vf&>V_^S{ZkQ~?}Gtci|kcOGZI;RtolHX?Dr0!s*7zg0AAoW0r^NW#bUCKVw$c# zX0=Ujja!0!{EsxXR33xRO9LGz^AV?)BTgQA@BQ>EJ@hL5^hf;+_WX<~{QoKY9y5E` za=vv293YJe8avOCahED%4w`Yv*S`Q4FvFUJf#BU;j(3@g+0U$ttP;yD^UG~JO1L{p z2+vsn9FPV3q**0o|Bv!aFV_73U8F5rIRRDh=mu zauAS53ACWZ!6NVYuq|4-Yg?K4uM@Ct2LNdZP16gSHqaVyo&g6z9hAffN@WBz1=b?} z`}5{JUcikoCO?a{_QL0XYkY1NFHkK-I{pK~iXpe77i|9R1s7GiN*{g zxX{sX7zg?SQJ_;9%-+ger920T|9gjajvNpb|90Fua}OzP-@i)F293r|7O?d3@o4f( zJl1-w<7BHB_j01b&tUZB%!tR#NSNUr|NkCX|3MA_g2wk8lhG!jkd`DLRat@y2meLR z3$m6-nzl%0r4nY9e(tVK0ktiGzFUtp1XMK14f@Dm4%{}^6fzhPG#_|uKICLRR&K6e z;h|Ul4`41}Gc)q?U&z5i4;D|s2$ z{u^>EgLB>o=L7~X2Zpl;#aaa=e5lH>X)pTq`Ttq|gB*DWX0U+BdE~(SFXS{pXdZxQ zD&bbyy4a&cA81g=M|b}1003xsOQ>|7M>OC(LvX<%IL~7(iT@ojAazJUWk3KlYzzQU z0>F6O7}@r&leXN-9Z z|3(3J+ZcSKWfdu--@+Bp0N@4Sfq&Q2d*71dNGAb+_ghpT1fSfLL=->Ikp%vM!sjiN zjRi#nV`o8=z+fPOZ<*PwTakbziwvfi=kpfMjz+7)tU1sWnlK(G68JSVNU-9-kmM$i1^sp>PA!gV_IS)exQv_8Z6!S2Hh{8e)g&01EA9ht`v4~&@`nD-M`h0RUI60;q zJ9(KF+zKmUUDymxo(FCa2`L}84udq)n07(YWTw^}&4Y+go^l$~0zv2Vo!J(S!Om5IlMf@p3NcigFmQv`%6Z^X+KItXpg;-i92g2vRSN}@2Rwco zZ~%q|Up{rqRv5r=4LqE$GBzji<8w4o_%<`3DSSvcn%<*G?xHDBM6%6b3)Y5hanSnS z#QKE<#=!v|%j&b>S#IQ${cR5L^Dnpz$l?MNzR@O~&}9bD2flCNq0nU-UpPFN1Re}o zPV!NQ!D8UbkR|MxbsiiBX+9szGY`d%k${>p;L)GtLn6z;ff)v69l_bq=uuHn7Mv2a zHv-fL@}begCcn=4SkQxr5Jq1(Opyg0YZ3whTOeOFA_Nkv1&8HB%%f4uFMfDw=OIf5T8hww5aOSNBH_c2 zL=np3F*<;OkYxs!wPHjo!xUJuZbQL1gY$8uqt)T8ELmCz4gmNKn)i2uEW3ai3-A^X zJiW5Wz)OvPG-!rqng=k@%BG=UOoL;~(Qt6f?@?ey1D+S)y$7@&jcF%nE>t*Z3vjFj zOIS`ay*Nz>0D$v3c=&$OFhhAqrh)Lp1@gdC0s=d?E0rGw$c>K{P=G9fi-zT0bfe)H zT@Ds3l@as~mMROv4%-Ed21~|v)1#wh@xfyPw45JkaCEd5f)foggQn8Hu&Z?;0IXle z1JZD*wdF-PsIGIL?-2)R0I@7{mC+P?Gx7y1aGey`b>2@WB%><12`GTKGD2|wcp$pY zV+*FpfsG1mq+ml0>->MZNN_FKE```R6$$ab=$aB@7mkDsBhIPFPRu`DBn(6xvQTh2 z8ie*R0@Zy5U=R=iyl6*1iGES+(=|$G zt)+hmoml6DLYHW;vPmdaF#O+K0;Ijd?k3&}y-beXBR=TrP~-FPe+$cuJ~wcTHWfO_ z=O#9y!34#E1|y%Ryc5d75d&_8$LS{61%tGp7|dMAJj`v=Fj_F11@kmhp;kfDfcpXC z6HJ1mAj@#V0}d<;xX~w|7)a>CEMpAa3z%LwjuS-uc}QTpW?1|>UJztk|3&ca#RB`Bpf1aS z1|{&$ozCd14*N^E31de`|5b&?;_@Gso7ljDi(Z7u#hv6r)p^9hVFVX^=a-e}o7hEO zNPq!|VZNtQYwD4jzAhd99iM$}@p^<{wReSMmS9`+uDR$n7A+YxqGxZK10u z%0+X7_Z)+_LBxH1ZyGMc2ErJDeDAF;`y(r>A7)c52$R7Y3l73$nD0k!^g9@=u<5pG zXuJ;`&Ix8vFdq&R$-;OrxAjAcmk>z2^eixgVgszG*5@q@S-41H`U$!`F2l}&88rzN z96`7d<&}X7FuPBXUC=-c4} z2EQb*ihvhz-NvHM{tsbu*{Yiv#JH)wq=}J?ad1e~Et!Zx^^h2&0PW{Kcf8IIH1Jyv zNg!wuR5(fWu*qtb77S`#yd2Hwom7^j)J7;BH2I{QQsgeSm0X%5cR91|FQx`(s^z7P zJbQB`bAFG}cO_?C^Q+j;dAW!sJ?5ir*KR$6&W4AC(Ih1OogN01ZAn^o1@9~TgK^WI zG5~mcjr3Dfcq5OEP~+Cg^aCFoC7Wv}GB?7V*?ZKe?#1Dv%Fp7(KL4E4yHZw5RYAgu zOSTsfw{>5R)1z>M4hol@r=+q3q&;D)!%eKk!zmfA7DZtc3wm6i48@jKXL*$8@l32C zzm*qG+ttnvC+4Mad~csw%{eLE`+4j+>AI|9;pqBu`D5Jpab$Ve?uviTGOov5^-}vS z38|5LstIM(7LYfNT${7y_E*Y>F;|v_Ma9UJRAt@w^zA6@M0+PiTW2+l#cQ9Nc3moi zpV2%cdR#}qusS$3a)+!{f_iYcx@$|mTGFoPqlIw(%S5NW^ft#&rIyJRe4E|*h_BC> zNO?(@R%(gGg+7+-5&QnqS)XIR9sRxMRJQhoU2gXAR;Q=Om;q077*O`qbK&{m%c9Ho zc?V8rEE--|zoeqoGq>NlGnL4MnfRarS(9fT%z@<8@zqe5SzQO3OHORIn&^sRU(4AP zj%A+6+=%Ufi+G#=d7W?+)YLJOQ?mubqk^5pj_4hQ5)^!=#Q|Iw;OT=JVc(@Ut@I73 z(%E?v=Br|SziOC5nIGF+iAhP(_TeT<2vc1W83=rq4-Jv3e(-sb`Y}d7q->wz;4t}i zz_8*WMo@dymHWQH(0xv|*a%&*?9*1G@gpP1{r(jj+9?PU^OV|itK6`bU$y=*85HkY zLa2$nb?rt?lC3Jf32wvm@e2#l>c(03cR|Pv6G?c)hUVOq+SW^bT+)ps@7KhJMdE42 zR7}ohPexnRsA=3cU!36#J6Bp*TRzBf(Ke1*ow4B7ed0{~K-K3gd@Re!;`YxmA>n65 zv14wfwkfadwIXMB9l`{qs#zQ@zN^`c(AibB(Y{-xcaFTiSbY??$ST@Z(yTd=SnrgV zU%FCG6JfFN-6^`Y?KIA^VhA;g%2sheDy-`#km!CHzec1TuK98-UwXQrddEumeYo&d zH~#&yiH*A2Wa3|Aj#dF{a7^-Au#h)Vv3o5&I+FDBjl~upf8gby(urvt4k)H3O&N7r0?Q&Jz;y1^Pvux7mfC z!Dr&}R@(hf&4#Zx2Wplw_9oJYu78q{mfp_jwj^Kz>exLtTSA~Jh7GvWq(IuG_EKtC zF$SHU=jGP*dB9g?E$J5#{QKL^_A=kA={${G#ch(@a!=LtdGoV%rQ$Ivo(~LJePR$P zJ?@9Eoa~U<$viH-!G*WT018Q*25Wje!^de%9nx2xe|dCV^~5szOJu}=WO7;-eR7}9 zj%fb#glF_zV>(XTDQ}Hm+|yT^Zmow@rS=INM47u*91+nCyo}2ybE?RVRiNUX!(^eU`QjkT;Ru5_OP`e{NfrnOW~UdwYe_Xp)nJTmvv~_ zW)$CBTb}(E9Ixal6q09A`QnwV)9cZDGP=@!tl*=Tmu{@`+|xrV<=VJpQg}o^=}es@ z#M9IIaouQ*{qylTzK@r@sKZ{=AkK^;b9{Z`dDulePEn#8~-z3sWa08i>P}`X!eTuBz$(CKQ`GmO3`HHqk zA&{u0P2BzwJv^9^r=%-~Vj5STLpLyv1y;9c+5fhJ5^){!i5I^L?!wY6iy-er<)V zl&=P)Z&qq{C6daNlBO6hxjy*hMEWHf1WzE0vhltu8fve zTP*CLJn(U?@Sm&G;$2@Z?0iXqvMEdLk`%Eh;XU3jDt@27gbcRz*g0KEl}b!?IL_^& zT^X+je$~gq{IjTQxykzDq{Sd-vuLIz-sx8#712OaYh*~>kL>d9*(YBfL*#Ac zHV%^$)S+d&d!)0;Q(r_@<{hWA$>Zc4_T58L#CmUKhi4AN7Z zluQGR%RUPnHgJ~nF41&My}K#Q$@uXL>vzFJGNO|$*B`3(6UimbNPN2P+RWh;Mt)bd zD#{Rn*Bv@%bb*c>@>OfxwiZ&tcqOrIP9>s8Va+LIoujH|cS85Pl^o|wSa^AD7vou+ zO9j5Qjg=H=_l84RUThP)Kk}?7cf9<9<CH6TS6jKfBZIQ)7KdQf9e551B6R0{uWRxrvP zkHER6D(7+L0iue^;HX}&I=?(@sj#4D!?Po%<{m$_*v&C>SCMNeq3wo-i9St8w@pFu zsbg5UX?sItBJ7u1j=ve{xJbldmGKIX7{RTzvsBM9!!!@SxQMBv=BoX!ofVjJ@p$pW z3M6X)DQ@Yki@UxCUOv54SLr7Id`nVRg%oQQCEgl5E_qrpoIm~b^jDwkh2N_s!r z5~Hs@>+;qa9BJF{A$GDQz>{KOYE%BHhPX6zZ>-&TrkJrPU|xC>_BZj`-;?`t1s}TIw6&|E z1~hggJGT2!M^Tv?+aZ#@Y^(Y{nI4pr;!BTE#umtknat7{Mn`1^I)JLU)c;qi?H|;~ zi8G?(81gUXG8}m~CG!ys3=F%+^mlD}i;>G}RdlL*NwvAmTA2~8l#qx9J6zF}8bq>c ztut}*G22JGeD#Eadvk0W2jRLB0nxja2m4%}AuB&lprm(UBZdYpg`eREwaRZ4X!-Ni zT4qhEDf5sObZ2i{@ymJ($I79cy)b)C2>(nKBKlyGO@XyyHNq^X+y@iPQ{y}UkA8BbBAp3;Ef z$*lyA=@k1izKS*5C^VBZf?%&JF+lV?V1%2iGve9K_h7>FtnB!0HLH;^{{fWkWMRCm zGV3N=+3n6oTjfiFVg{SGudK#dr}{2^8P6J3l~m~dFmfi8#BNY*EqFTjZLrN{qUGfB zuei$ncVBn;`F}AkEZ1hbNGl;bFIy?yOwD}cqW<}F9Ko&R<%-pksMiW+FHE;4YJNwZ z*srLfj_ahZRf(pyokS2(e9b5{u@S1vzw@WIT$&5onz z?WC+DEviXmb~6rdx%XWjQjM*+cf#(T@RW7@&i}+Me&tn&&Df~!>G9^M!>#K)^-q3q zzD~{We*I3R2>n@YuS<;eQImqbtr*wdh{)5HkARsk@x0yoX`ku?G09hM*}8otpKtEq zRun6rNvGJ5u5LVV5T|glHVhljU-sMy-M+Q7Urt_B7c*vTsV;pfrS|GsU|)nY`Ouxt z)YL$MtOUr$*W(qEZz0d0DZhZ;_AYR!i$+oJw1yl|*OM!f(aT-8Zmd@6543}>Z^n|Q z{F%&~@G^Qu@rv%x%7^SAzquP>@}Y;qr!8Fk&nE{y>Q^U0B)91g^=LllCHqJUz3tue zASvVgc~}FddtV;#Xm5S~qgrv!M#xnAYPQuC83rL0%`lslhNQRz=(9uEWCw|WAPfH> zFU8THhRW$j+7tO!pH?cT4t7}s*u^dbqYbW6MkDAIylk({7p}LWs7NX{mut~?PF|Gi z3zO5VA_s=gc^epenOpv9xF0JVv9JO~sa#xq9#vdw+ z3~Ai6Ptr7@-P<%^K%L>0PO|Jm^{SwUH!!?Q@Z(5U>$%l;8v1qCOUKS8n<3A+(~G9# z!sATP(8-1`)b?fWz0mdg8M!YiV(1tJOE}xT7O}`L_LuJ?cFYAg@Lc*AOB?mObN1Q_ zs}4+K?yn^83+*}GTMR2t9Lb!W`8^v(Gk93IULm!9ua`dJ1U5VoKyo61d@XEu{qe7| zw$mW~RxvNc8ty~=%CJ?u>vHCQwpuPPPC{tHwQh(^6oQQJkBjN5g zOSLo=%1p28u|+3jZ}Q3(sibvfJ$*jNVkG&HcH>f`zg)O}+@gQ>fWS92ZTnc|2rDse zV&pel|Jq^VEtenrlWQJjVH|3?o`-3jPob{)p3eui#e~1g%|94$-%ZYY_MBw0yJlj% z%D|4VD>J@os29#~`ZY)!7DdVQun)1mmpOLpCru3|DOa2xSC8U`Ee!Q|)k3p9L*C=m zW%!lz*)-|?x}UjBM+tAv*wf>JMuU5fI+&$V@@b{I@T5HZjdugTtE^>Q{d6P`jP;ZT zv+sRtnb`4>pFlrP(d=mpVzYW3e&d^+an9QyIUJsMruXg!Tj_%eoFK1fMPq(NC=Dft; zF*S_BzB{zpo8&vi3l>!z(&9;t^!KT~_~RV+$Fz#t+vco{g~s}9b|eEQ;)%Prv5xjL z2Hm)oUcR+)F;!@0!Xgd5aVO;F7>VG{VfR(4hgy*a9OJLn6W*tnlxO=L(REwxIz|WB z-(FA*xl27JXNI`ju72E;YWCw-Jg`+`IOr6E^h9rl#^M&E1C!wW{*Wr`Q~;YZ!xrKvVwfSc;0xQ4eoZ51dqy5 z2wZ=o*8xF)jJv+CwsS44RPU%!{7}he2w_kXA5BH{qE_Q8ib+`h%FcVQGYb3AwZafX zm4XjSH(i7B#)sk0`#1)h>l`vZM%2}~a4jT%sStE%{=m5bue~zlj}A$@7UL^XC}iT( zU9nxa(UY7o`087OlvZ3$&G4p6pNOc+%B%Z#_TF?&|B* z1@95&uS$l%?&J6Aa_wo@#&aDRjXD)UEo(A&2DVMUv%M7h&1c=n%^JlvAg+1U_AZ^5 zG+F8jMr%2^^YzsiL=kemoNnOUlsp;Yj(dzf8*QojAT$~p-JF`=xgUoO0wbWgL zXE*%Zie}XiOZweT%F^BJiF=#iU>sFM-u8h#_wer1!wqx44;s)aOYZHWponc@+E)7J ztWcgpN^)1PD+E#xibh;_R~cx7Pa;?uy$wFzTz>L7)~D2PqfVq>kF`(OMUm{@sF-3r zl5>jFo=ajT$RkoxT_SBqZX~C9S&{b(vFpQDVe5~lvm0NZyVE|A@4Q{(5N~*7ID1m$Q&olZn`cBRz& zRm~x~lm4=T%FssY6ERfb_70EX;fG5ufs>4u|;^9AfCw$^DU#$rJ6p z1h}x$Jf^E<;A0?4M+<)w?=w?;dkLk_79p9<2xne5Ud@uH zMS8y%+-}|5b7=W)lA)otbC~h7>?V8j;&vf>SUg(*y`#8)+1xd?5?TffIgL5vcHd<5 zx5hocRkNoYiGpRRm7Ow*oy`?4rlHY9r)SyhTYr9^(5o)(ZdCuCcV96O5cx3ue%j3| zN>6}&bs?ObZH$@Jqm5l$H@G4)AaU%YqW?Vvipu(G8d$UHbddhhENXWyDD_kV8*@kwo=wQQdF<`!B z-mPXl*ev`OyG{@9^?pJ4C%YU%J!n$fu!-2HSihr$g0aVMX}JZ~xKia0l}gr|74Ahyt!x0>|fZTz+0uHeu{p^m;5 zX1ewn#_+MU>EG)zw<&&^^YdqILCA;xHO+bg{PA3=zRR^&ix&gL?Bi--F9IG`nD8{j z+Y<$D(EPCC^C$NR z>+0~Lo8|Emx2C_{gfR^-Wj|08ggQR|&tVY0O=VO17Of9KJE9$1Yk|G|Hdd5cxE~=)chA=nb zK3Z}97lNYtxle_5-N!2NCdsLv+ZDIYNXJ$X{6Yd(QGYb0R_F3lmx&j7aqM{FW@0`z z@6f6|R$KiTUi@L^5v}CzB>+h3v?RLxs9}3Z2<=o{k6xV8jdNnKMUD&{Hn_*POz;1) z%Gdi*{JgWvCGPds=_^#in0>OTSZX+5dHf}NXszG%)&5}>w<)RQrqON@va!_R^31+1 zCd2yRjjnEOE0W9CdA I?7tTOALZ>wHvj+t literal 0 HcmV?d00001 diff --git a/assets/sounds/death.ogg b/assets/sounds/death.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b582260411308e548dab9598241f29bcd27c87c1 GIT binary patch literal 8715 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 VU~0oJ8HOJmApSM|fb*~Ee*pk@LG1tl literal 0 HcmV?d00001 diff --git a/sources/Component/Music/MusicComponent.cpp b/sources/Component/Music/MusicComponent.cpp index f31bfe16..48daf6c3 100644 --- a/sources/Component/Music/MusicComponent.cpp +++ b/sources/Component/Music/MusicComponent.cpp @@ -1,56 +1,93 @@ -/* -** EPITECH PROJECT, 2021 -** Bomberman -** File description: -** MusicComponent -*/ +// +// Created by Tom Augier on 05/06/2021 +// +#include #include "MusicComponent.hpp" - namespace BBM { - MusicComponent::MusicComponent(WAL::Entity &entity, std::string &path) + MusicComponent::MusicComponent(WAL::Entity &entity, \ +std::map &musicPath) : WAL::Component(entity), - _musicPath(path) - {} + _musicIndex(IDLE) + { + for (int i = 0; i < DEATH + 1; i++) { + if (musicPath.at(static_cast(i)).empty()) { + this->_isLoad[static_cast(i)] = false; + } else { + this->_isLoad[static_cast(i)] = true; + this->_musicList[static_cast(i)] = RAY::Audio::Music(musicPath.at(static_cast(i))); + } + } + } + + MusicComponent::MusicComponent(WAL::Entity &entity) + : Component(entity), + _musicList(), + _musicIndex() + {} WAL::Component *MusicComponent::clone(WAL::Entity &entity) const { return new MusicComponent(entity); } - void MusicComponent::loadMusic(void) - { - this->_music = RAY::Audio::Music(this->_musicPath); - this->_music.play(); + { + if (!this->_isLoad.at(this->_musicIndex)) + return; + if (!this->_musicList[this->_musicIndex].isPlaying()) { + std::cout << this->_musicIndex << std::endl; + this->_musicList[this->_musicIndex].play(); + } } void MusicComponent::unloadMusic(void) { - this->_music.stop(); + if (!this->_isLoad.at(this->_musicIndex)) + return; + if (!this->_musicList[this->_musicIndex].isPlaying()) + this->_musicList[this->_musicIndex].stop(); } void MusicComponent::pauseMusic(void) { - this->_music.pause(); + if (!this->_isLoad.at(this->_musicIndex)) + return; + this->_musicList[this->_musicIndex].pause(); } void MusicComponent::setVolume(float &volume) { - this->_music.setVolume(volume); + if (!this->_isLoad.at(this->_musicIndex)) + return; + if (volume >= 0) + this->_musicList[this->_musicIndex].setVolume(volume); } void MusicComponent::setPitch(float &pitch) { - this->_music.setPitch(pitch); + if (!this->_isLoad.at(this->_musicIndex)) + return; + this->_musicList[this->_musicIndex].setPitch(pitch); } bool MusicComponent::isPlaying(void) { - return (this->_music.isPlaying()); + if (!this->_isLoad.at(this->_musicIndex)) + return (false); + return (this->_musicList[this->_musicIndex].isPlaying()); } + void MusicComponent::setIndex(musicIndex index) + { + this->_musicIndex = index; + } + + MusicComponent::musicIndex MusicComponent::getIndex(void) + { + return (this->_musicIndex); + } } // namespace WAL diff --git a/sources/Component/Music/MusicComponent.hpp b/sources/Component/Music/MusicComponent.hpp index c15335ec..7cb48fed 100644 --- a/sources/Component/Music/MusicComponent.hpp +++ b/sources/Component/Music/MusicComponent.hpp @@ -1,28 +1,34 @@ // -// Created by Zoe Roux on 5/17/21. +// Created by Tom Augier on 05/06/2021 // #pragma once -#include "Models/Vector3.hpp" #include "Component/Component.hpp" -#include "Music.hpp" +#include +#include "Audio/Music.hpp" namespace BBM { //! @brief A basic Music component class MusicComponent : public WAL::Component { - private: - //! @brief music of this entity - RAY::Audio::Music _music; - //! @brief path to the music - std::string _musicPath; - //! @brief Create a new MusicComponent linked to a specific entity - explicit MusicComponent(WAL::Entity &entity); - public: + enum musicIndex { + IDLE, + JUMP, + BOMB, + MOVE, + HURT, + THROW, + DEATH, + }; + + void setIndex(musicIndex index); + + musicIndex getIndex(); + //! @brief load music void loadMusic(); @@ -41,15 +47,28 @@ namespace BBM //! @brief is music playing bool isPlaying(void); + //! @inherit WAL::Component *clone(WAL::Entity &entity) const override; //! @brief Create a new MusicComponent at a certain Music - MusicComponent(WAL::Entity &entity, std::string &musicPath); + MusicComponent(WAL::Entity &entity, std::map &musicPath); //! @brief A Music component is copy constructable MusicComponent(const MusicComponent &) = default; //! @brief A default destructor ~MusicComponent() override = default; //! @brief A Music component is not assignable MusicComponent &operator=(const MusicComponent &) = delete; + private: + //! @brief music of this entity + std::map _musicList; + + std::map _isLoad; + //! musicIndex + musicIndex _musicIndex; + //! @brief Create a new MusicComponent linked to a specific entity + explicit MusicComponent(WAL::Entity &entity); + + }; -} // namespace WAL \ No newline at end of file + +} // namespace BBM \ No newline at end of file diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index cd5b30e1..74b807e1 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -29,6 +29,7 @@ #include "Component/Animation/AnimationsComponent.hpp" #include "System/Animation/AnimationsSystem.hpp" #include "Map/Map.hpp" +#include "Component/Music/MusicComponent.hpp" namespace RAY2D = RAY::Drawables::Drawables2D; namespace RAY3D = RAY::Drawables::Drawables3D; @@ -64,6 +65,15 @@ namespace BBM std::shared_ptr loadGameScene() { auto scene = std::make_shared(); + std::map musicPath= { + {MusicComponent::IDLE, ""}, + {MusicComponent::JUMP, ""}, + {MusicComponent::BOMB, ""}, + {MusicComponent::MOVE, "assets/sounds/new_death.ogg"}, + {MusicComponent::HURT, ""}, + {MusicComponent::THROW, ""}, + {MusicComponent::DEATH, ""} + }; scene->addEntity("player") .addComponent() .addComponent("assets/player/player.iqm", std::make_pair(MAP_DIFFUSE, "assets/player/blue.png")) @@ -71,7 +81,8 @@ namespace BBM .addComponent() .addComponent(RAY::ModelAnimations("assets/player/player.iqm"), 1) .addComponent(2) - .addComponent(); + .addComponent() + .addComponent(musicPath); scene->addEntity("cube") .addComponent(-5, 0, -5) .addComponent(Vector3f(-5, 0, -5), Vector3f(3, 3, 3), RED) diff --git a/sources/System/Music/PlayerMusicManagerSystem.cpp b/sources/System/Music/PlayerMusicManagerSystem.cpp new file mode 100644 index 00000000..2d46b5ff --- /dev/null +++ b/sources/System/Music/PlayerMusicManagerSystem.cpp @@ -0,0 +1,26 @@ +// +// Created by Tom Augier on 05/06/2021 +// + +#include "PlayerMusicManagerSystem.hpp" + +namespace BBM { + + void MusicManagerSystem::onFixedUpdate(WAL::Entity &entity) + { + if (!entity.hasComponent()) + return; + const auto &controllable = entity.getComponent(); + auto &music = entity.getComponent(); + auto &health = entity.getComponent(); + + music.setIndex(MusicComponent::BOMB); + controllable.bomb ? music.loadMusic() : music.unloadMusic(); + music.setIndex(MusicComponent::JUMP); + controllable.jump ? music.loadMusic() : music.unloadMusic(); + music.setIndex(MusicComponent::MOVE); + (controllable.move.x != 0 || controllable.move.y != 0) ? music.loadMusic() : music.unloadMusic(); + music.setIndex(MusicComponent::DEATH); + health.getHealthPoint() == 0 ? music.loadMusic() : music.unloadMusic(); + } +} \ No newline at end of file diff --git a/sources/System/Music/PlayerMusicManagerSystem.hpp b/sources/System/Music/PlayerMusicManagerSystem.hpp new file mode 100644 index 00000000..7038549a --- /dev/null +++ b/sources/System/Music/PlayerMusicManagerSystem.hpp @@ -0,0 +1,31 @@ +// +// Created by Tom Augier on 05/06/2021 +// + +#pragma once + +#include "System/System.hpp" +#include "Window.hpp" +#include "Component/Music/MusicComponent.hpp" +#include "Component/Health/HealthComponent.hpp" +#include +#include "Wal.hpp" + +namespace BBM +{ + class MusicManagerSystem : public WAL::System + { + public: + //! @inherit + void onFixedUpdate(WAL::Entity &entity) override; + + //! @brief ctor + MusicManagerSystem(WAL::Wal &wal, RAY::Window &window); + //! @brief Default copy ctor + MusicManagerSystem(const MusicManagerSystem &) = default; + //! @brief Default dtor + ~MusicManagerSystem() override = default; + //! @brief A MusicManager screen system can't be assigned. + MusicManagerSystem &operator=(const MusicManagerSystem &) = delete; + }; +}