From 708f6c5402db852185a0aaed425291ca7e62b286 Mon Sep 17 00:00:00 2001 From: SlyVTT Date: Mon, 5 Jun 2023 20:24:13 +0200 Subject: [PATCH] make code a bit cleaner and easier to follow :D --- .gitignore | 1 + Pinball.g3a | Bin 249968 -> 250204 bytes TODO.txt | 12 +++- src/main.cpp | 91 +++---------------------------- src/pinball_entities.h | 121 ++++++++++++++++++++++++++++++----------- src/utilities.h | 15 +++++ 6 files changed, 123 insertions(+), 117 deletions(-) diff --git a/.gitignore b/.gitignore index 87361b7..96365f9 100755 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ __pycache__/ *.sublime-project *.sublime-workspace .vscode + diff --git a/Pinball.g3a b/Pinball.g3a index d922ff08eadbaf32e13db8f9e83a5a2b79451f75..b655e3dd69c80865ab58be3faf0b4d969042f6d9 100644 GIT binary patch delta 17946 zcmch9eO%O4_W!+i0C{E@5k~@f5ETLC^O-?F9d!gBuuOSU(JTQ6rBWlM!eRv#6$1pt z^~1Vsk)ffInwZ14b&E~ctk`Wv9%MHvG_}dh_!b%!$?ttX!;IMO_xpRjet-Pvb>}{v zd(OG%o_o%@_j9eM)~oBFSIp6dznrKnIZ)m@a1Z}w-5cni^!hjC_dk=tKf0x}kWyQX zC^FM|c~54@o+L+w!n|Tn#x!&rtQ?t3G^6v87a--M{Uqu|L=1{iK*G^yI$yj%)czBK)HWgU?q*zjQ&awmB0` zOi|T>0*!Ae0C$DO7GZ$+%(Zzu7fSR0t!qQCy(@2L+zK^r?h32Ul&& zr-p3{+_I~Pl({XzS*y#s>gcB}SbeD~^v3u(r{+y?ban94Ob>lLd)4Gb2iMgBX16&L z@aGdvnsRr>crhehMo-(7ci?cJyEK6UrWyTmQ$F6TrRmaqk4_@__fzJlGdph63m zP%fc@qECJ!p~m#Ber()>LLlP(*$$OvV|DQ->^A~#*m-ct?j;azNf9GK&fZaJ$j3M< zeUs2uRu)7^*+N1}ke47QLVqq126~AoL=!Qphp@MaS#h116lo)t`068K5{ZjER;)Z( zRadf{=>s<@1F_ng&D3e*St4#cSrz(9mg~loGE(8q z+{VgR=E}Nx^5X!vA^e?s&6BfNrF>&F=T3OTSLQPD2o?w&)*c=01g?b4-m3FQH?Zuo zs{a29Xq9r@ zR5x(cLh84wDD<02qP}-8~Df|OO_(jy?k`Y*Hv}T{v^hfD>AmdRzh4dwiT8P?D|$y zS-~{T2d8IltN1E&TkD$k>{-sDzo-i~&2jU7%R0E?YRK0enVA{E>T-{aRk`|N=OE{D z=QXQ3m%X4&Da_oeQSG8{e0YVn&-kj}yd)(#EoGH5IxI6`R>9@PW8zlp=nLhH`W+q! zRtKv~6_u2XAuhwmttm`+!DL!E&t;xV`=i5#nI7E`wrb2Uzws_F(BkMI=Tb5zWuCI) zr;UOskrS+7!Ro_z^Gp@&OY++7E3`PYgqD&J%`Cud5X@7@z6qy=;x|szI*fHK5*dAD% z!%2=+)s_;M&WOw+49dJ5WD2NFPI*p2C}D(Da8u~RogUoluT3Z?!89%)f;x|gJK;Wy z`iSsxG+b~$5k5(W3vMGqyN(E*U2wtYiB|X+N=@N!CoCY^2zToq`C7@h3*R?L)$r&0 zh{*UpDkehjimJ}8z(RQOg$-yqpUJ?si+LeuyY*4?!b=N_xPQJe&8HtH!I$b2F8gn4@V{YkZ0e7eXmL^xx2&SzL2ErkSTe-)3g! zV%dguPB%?S*#e5n!cuzp4Ae|44g(Q-=nH6ntSPQN4xW!)ii>wMC^}--Dq17jV-1?Q zZhlNZqJni(b99l<<>;&Zrs(u%mu;9*l36t?k`AMOU?Aj@ukC{?d8}JQD z-M(f_tbeR_7p?tHou8>y$BAJnJ65-@IVVn}g|3c%V*{owHKdAup#cls=7gz7LzvEiBB^h`oLH8rvVgd$n6m% zd2NWyPg`Xz+b%5FsEerg@(=`h1CKEZdHg|ym(ypWg2r5=q@%E6JfQJ3^xydHf1bIX z1)e3I`#fuZ+heVJHh4C9p7%6)cKr|i7SCQU;^pq8mir6;jeu9Em*A!IO8n2m`)_!q zd1ZL5^(ywt_Xz(_Fdi`;@g563mV2!B*zh0wH+#J7vESpM$8nE$`fn8eJBY^xk4qk( zdxm*Nd+Pta7Yx*Uo%USdneJ8TRddNnwlI-bsrOrN)&&P0_bv`SF+63*31wykBzgME zFG)v)&KyOe{}mEeQo#a8ytbdXWVL15*9L z_F;Znf9k56K0YA1BVe*vpl}`LrwbTAJ+(E!S6e_`1GEaiF#*YKqOP0;_`IgOMN%7* zk7a2)DmCi(;P_y+Myo9Mb@%(cJm-gR$dkkK4Vinhw{8D}p*2kP5>4Kt_D#xR*Frb-@M+DZw^NTNpTMxS-;gZrsz$Bu$uZiqotrbYvz({+FWr;5cm2j0>PeRJ z#H=q{H_eDCrFBymdbj7#aWj0Gxp(OvF}H%PRn*0-R%C6|s5kVjK35fUdvu|6G5cJi zo1r!G;;!)>YqGyIoSW4oUNR1Z(SruIp`t{#zmL+zXVm3m~dMXgT$T0JWH=4L_d zSL~kPRuow{#Z>yQGW@~~=0{x0?q`?~!l-|#-4hha$61>6LJG0{M zv(9So>}_UWn5%OWJIhm2?wCEZt59oAzjNi6l*0O?Bl$FNyAZ~8F!@fLZ|Qf?XPJor!7^<$Fn=#=HI*(FW`D`+6}LAB9Y2xUKm?C{IX~nZ3d8n_LFzrf82&Vn3+HB_&AtlX2CBy!Fqp~xgkrH zoGFI+dYeD!{M%xL9)_*v3)je{3&HFPY5l7TaYTqJQr5sK^lrx5lJ5K$2^A%$LFUW@;I+f^cYSOzIwq+_( z4#oMW9$x*!^M=42jWAB->s_w&-O3l`e_N7&9!c+OKce=Y?^bBoX4o2ha-@$c_2S2Pmg2P(!v6O~E8?cl4 zX$m{aKh0`QKAv(yqbyIdkk7V!TD+oz1 zDbddI@Oj>?FC@4HZe039rXuTV>XlgkNR_|0MyO!^8|qGFLp8I9PuBhKl1TAS zHk_O9mfdK0KQs|0;}6NlJF@fX;`ir57M!iiYX-S}0o?A`)tFqLas;e~bvt%ud`&)I z5m;vV<+H~g>(8o+_sG5kSzN6;dShInJXH>=jxW>fFaM(3(X3DLPF9JS1wyKdWLezXwlLxH7+x>0;!i316z$z;DNv z#X{{~|2m%LY>bPHr(%BXyaXlp=Od~SjA0}CF2H8Q;m{XBnNNwcvg+OI&V^s|D6I~u z5|<*8$k92n02d?s?7LZT?;^x{8bLqb(a!v6Yu))@_}lzEVgMX!?%zucJ(BAYO;j8e z{j>IdNwiB7M+Ht0{Zf8ev+YJ9F{I83i+2kRNd0New(BJQ7j3}g4{i|A&v1^<&<*iS zpeAH`_PM|@iHK{`esU^MXcf0lD0}MZ8!mDLo zjfsp2(3A=N(DQ)jN3CART$LGl`XzTZjLMp*49?o7Ih)?62`G#yV6JjgNJ_8ftR{fD z#su)X6U43@lXYqAy7;iwV`9?hPFUO*mX-cvY*~6=Y``#AC%aCZ{StX#37J9;On#+YN`zt66)q3onTiQ|@42?sRe$C$8~W zz0SI>slAiKQu?(4b0#>r=8b}$Jj%gSe-tNXUy@;`&k0-O!C_ag3z?qU59qsdCTIdU zbb<_>@?-WTO#sKdCbiRs^=@of${lUMya_g`6y7JN4aoF}QdtSYd_LNmney{8FD6Ox)cs_M=3r2yKW)*^~=knROaO!kNy78zC%2eHZSA9re&E7#&%ec z>eABIC7B^Gx1ty}-23w4j+D;DhOBvRi!;q>?P)kQPEHF;F)&k_e0WU0lnOf?gxH$a z-vP2D8KwN2{%cstF8cbg>!h0&CQAC1%m+bt?IA$PF}#$Kt>E7L*k>RgpGi25qr-7f z(aQ%Fr`DN>)HNC<#{5WJsq^R$jBDN39Lcxx9h#bqf&!gjfLMyGh=2&XI^W{T!~ zAqrquiCGgIbOc7PeEb@m(%OZ2!*EO+wzNHJ?>GL1M-&)7cDBo9q}H(xBVh+NJxf98 zfg{-w96`xN@-zIVaMgj|cJcit?;p+R8X~ww<8EgJPDs4HQatQ^5NaxwCgNT-PyZbAK&D_pS`t`qo`#V&f{F|fLx zOLk*-N^EjW&KLwT%JR8!>h>q&mXy+iF>qWt+;MfRNnV|@hC8-(ii1Mcq}$^QAIok{ z>y?hqa*J-6*a?4>o{fV&q&^#xUQ%2PpX6#w3f3j1 zJ~~L*keG6);^Mc&oOpwz^D#8&?HXUiCS`L-q0S}t67_uH$MvG$G*%Q$=aBg<%e`CUt(y?n|NWG^4K z1l!98ENXjsw`G*Qyw&1oFF$Ybx0j!?JQP(ps9xVbVR5i`q*xs7<+&DOFHf~ldwEiV zvYd(j4IXR8G-PD$)d9b4(2oKI6um=fVC_}Ob1k7P>ev7q(ajy;)N zZ%RlRmh4o>0jp|jN=$03M%d-`e~T|on)E&% zMpi_qz1xNPZfSk#eS=}-~{@IVEn!H=;>#xWLAZy^j)k zP-9%rG$)s9MEF}S(zwQgyNf7oscQK#-t`0AR_#Q(5M8D2n>(c1n9~ef%Qs{Z+thZAr9z=Y~TTT%b>Q?3`Hab1F#>2Id0(?73fALttWe|dpA_TW=f zZ&h{wG1}WW``16>Uca&XUN~dr=|*=-pLcXRZ{S=ROPpvd^|+-63QVMg2o*|W%P@-T z-3lddgm4Dr4xp0?T<9mX*SNryhA^jc9LLVxk~%$TqVcRdz3J##33u{7;=}_wPTY7} zMJG`Zl&%e@9XvnlL%;W}Jju}#;k6bkJqb5@06ss0Mo@2D+)0VNU4}vXnUP@c-7+j$Y24^XSJH8Z3OK`@@&i8F?1sxaXzq{kRXCT;jQTI zKpt3w_3BW1!09bq>!TbumVW1Qo_F)AQ5Z)nsKUXjM0D~IagbUZV`-pG`9GxnV`l9H5wnr~j3iL&uyNh&x%pRG06V*o` z>cKJOuWgy}JS^jDyC}q@;J)0fFeqk4EE;F+=lG4CBAr2f|Ln{;;Oye45ozPl7^$TR zj9xS5PNruVyI3HF#nA)EjpySizD7;Vm;9&Fg{~jYCc=kMjSmGWZz_Ezz%tvr)WNI> zjyHoEXn``nsUDd}go~Cl(rOj)IN(BoCcw)~jtB;B{yr0CjVL+Y~Al>1jCoBu}cG z3*6x96D8Pra*$*%CpnrkKa`fJ1&dZ%9Wohn&%cxT%HcklOSM)q<{p_0pS-zDnw>yT zsRp?c!L1mbC=Zc2YIC--FnNJIYpG&39X80vqtf-+bg^yX;^bl*GvlRa<_u1}9ryUZ zo%mPX_c?-aWisvQc8=P5jSX|@%M?_Mafx&q^S%fiYaxxb2&pj}ED#qG=l*i8RQoX9 z%oz%Lgg#9#8p|G`@8Nqgpx5D(11JrF{?s7lJxY&q#6b(`7gn(Kco^^?*ynLlSQ5-) zi^G{@K>O`MbT$&Sw{Wb_5a9~!36!5>KA%b}I3L}&jOl6gu7Wu)kdo5rj?vuSTCQ0` zcx-FYvA=FUaknafv$NEjPNQ79$aEKcC?1w4MJ}Ts%(`V}S#!OE&5WyX-3X#5!Z-NL zo9rE`;%#{j*0!6yCV7iN!M&pdGnEw{+wbdJQuK2A=>*t-9_an8-g|!~gbyjgK0{9K z{WS?FZ{kehQbPnd@wmt6ZdKSx-pAoMJkgG~NS%+-N4)#_cXM7P+Az%J8$pU*L1Uc0 zJ&mF7NVzNMRL^fuV?O+Q4M+Em)U<+L@~ucB+6nnZbil;FV&jt$AtI@kY9FURE{2qE z8z90AeBOq&dZLNYQT(=nTo2-K1Z^25H~`8OqRmVvVgepn?Cu4LS|X4#If-);QHRW* z>PMfubn6N1n+mn0UP-t5`B&oGRIYsDg0Zs;2g@a$UP5|N_e{=u#lFscLZoa zDh`?S!vECQok?F9bsnJgNOedx#^!ip$k6$|nM zrai%3Ht^zt0wOMGBBVx7ocxLiUKKzj`9!z_NjXC56Z41&4JlcL{r*UfRKJR*IQ6a| zVodjb0}b)(U14&_PFNJu=Aeg_gJqR%9Z>2eoq;|*3Oe_Lfr#_LWmuPtS$sq(d!1$j zeTUsCk_xiv2A=n1(?2_!h;a9;baFL)#p&)@luc6F8hUi}ouXe6T;Ng&Z*>L+dy1~6A$QPl2X8R&Hv|h2euBs0 zKCjP5I{7sHXf*056X9px*2P7`Us7-`WX`JBLL@&mNKI?u19#7m64${iA@5#CHSE`X z$!9&?;d#%U2=_qmS7=T}k5rE~z!-&R=uPTJ(@hRm(OoBIhoFZB#V68qDf(F&!;r6i zmOewZD03wdXY^q6;_JM>fZQ3$2PvrTQRt)QA$$$>S3+}k)GZhQ&oc_7 z6?wGPv5RkPWAt+%8v~UPSq;a*$NO|u6)o0z7p3*g~(xsK)b(` z_5xT!UiJcA&z$vA{|g8&x~1HFxG`u*C(mI#^qc4tuAGF`&Per}sCL9f{(03z+n7G$ zI>S>Zxi0l=q8mK-IC071gD$A=E|zj%q&s5x(-%BuVsE=+{}h$UeXeEQT>5zU#Gk|v zJaRJAb{HbV0wUrj0}r93$d~97;T#{vY9}=Dv9`xj{{cSNc={z;O7SsQ+_M&NwKB_I z@p_pbF$8$sq5SgGog(0C1|0fA`cS@z_9oXdE!t8uRd| zhN<{o4KG0|#tX7sq&TUp2>Q||^%ubkdF4uLZ&N=WAq~DDF@2vjyO_3m^bm1b+aQ=u3f)d$^j-E25l1+n z%?C-1nw-rG{6qL=gzwUx6!!q1Q&}jOthE zr_Av#Uhm}@`(C3<9VWt+hxha8nH?8}@Y{t;4w)g(4uq)q;lO$n;qKlFBNZH`5m-HK z#B5{3VK^(-SlvBRltIMUwUU25J;-8pQgb~HW61rFK$@{SB4%L8BEV|~!u2C`JnfR2 ztXcOF`av+qw!%7*X=PUN@IfULN2JUiwMv$|BR2tpS;=;<6FJnwM8W4y7g&y~tmu9~=5a$_&l=V`N$?si>_Wr)P~!FE{tHyra9*GVV; zMwiHLiQA*ar|%yp(C2@FZjR?TmvmY2I`-pWh4Ib{c>IoZp2OdegSjQw@#TLrgxa6&9fDw`nf-F@cWMe6wn z)%bo}1W7J{1%3qyhql2pW85cnwClG;gKh6f8K2N`t}sAWxYJVQCv*(vefksnF)r1L zOw^UJ=X0d8ONdzw>1W&8Nz+?Lp;T*|CHGdkT4h*ZZxc>H;Ak&yrB%3?Q@25;Sl66( z*lk0DbiSRYcpi-=!V!o7_h7=&Fe$Wyo^U~RbukeQ4aP21S@1=GK;)~h$?d|C7T$+8 z0}|TSHX9rMNk_86^F++0*o`K5Q^9ul+e zqN$D+jz;S0g7aNBn~3Yw^A;{nNQmHGYF&~P`Wc;}GNhwigUeL^LDrh3yw7Ng?-1b% z$949;E{t*I0m`NV`TQ9AIqoc=EA{?F<9kgKKBr@N_08@Fs{d@0t36lfG~Rov=7HYN zOCG3x@!;6EAH;md^Z@XU+6OS7O_QtscoWPCS#WY0!d1swxtiBaUmjgjMl|kqFu#Oo z+*6^>dC7CNNqzCp0Hn^F z^cXkoFBM58-_SrrUMR|-C%=J{W1B;zwr}ano|{8~92cLFh)B+-+0T|Gw_!L7^NBXj zN8XrCw`n~0@{~syCDD?*2aAGPi2ja#A5vOt4MfX);XYutUhc6T;;+F*>?}cBuMIrE zhfZZ%oF$zH(;zomdgwgLPoZ0|6kA|lx5OEB-^1Pirmgq~Tq`|1BB}5@T+?WL`j9|# z3!F$Cg1|Tgc5$PUcHEpH9SW4n*9?r};d_)k`IJ=~O4qTk&k^ z;$3>!sipz{Cacq!_ai;Vyqh74beK)psoi0~mu3`xruZ)DQY7D`w)}#@aVyY~E4la6 z4MXKp(oYwSIFCyMP9I7e$AhO^M10*xy46qPr*iLE5^Yj&Lw?PP8|Z7Y_m<$xzH2ta z#OL7RjkoeX!#1uvn_*ABYnF0;r5~}~VaDit^kK&C)&9PS`Kj*VzIP(A2RFjKw%<2E zwk-Yk-7E%~QBB!qrW%$A&ehWne1ur?Z{wi$-Nt$ao616X2i|sRlo>NyXAe($b<;f} z$_7**+5|4s63M}dZFW7M#$`gpy-!JHPV8wMG)WOey4zi5&0!cz@q8UiQsYj<>QJO4 z$uNwCGfca37<0u}OSK`Z%+AzO&Mu*-Uy%s&-}x$hw@_VO5f{rtFDvwxv=HzjeSy&3;Wsi4{9R*p@xVD(xhHjwv=`n7r3$GRCTC`h<`kdKJfW^ zH^*VqJLsF1wn(`i?5cc>c^NAAr+%asDZ`WP{Y~3`FLu>;s8ZhtH}-jf&wwu6{y^FJ zV&3mVTNzS|lu60mwevyT`kBXh+LaDApYLmKEY^oD?g9x&M zhO?QD7m0RxkI^ukJxo<^=*SRJ@F_~oJ}kiz!{5+J&Lh|i*TYJ#1w=fYDg08nL*OGQ^J7YPsl}g#FhKSAGu+1H7}Wvn35ASC1$P6D z8bqzzb9kKAXT>n00l6;*24*Z87}y+pO;wavQ>d&X}weI~N$0IAUIQ#MXQ8!|=r;s*U{<7%uC*&JLX`C%{?OBja4m z>^b-r24`?0$dim^5zLi8Gn84>K2{{vPGq;)V@1ZwNo+l3%8dO2^9|=~1#a6H%YX7T zKyl^`aMn%8^qW(@o4iT)JfDG4FR&Em>vh&f(YD_Qe)?vIR5O{yN!=PY8tb`V%MPfN z83{@F>JK|>V(31C_y_lnRg*aj);%QErLu)8 z?7JX*&pWg}@cq6YmhpXObVy@cp(XA%mFGO)S9@i~{XGZZhQ$E>EvvevaE!2KXP2_8 zPJCxWQR~v#XzFL(0|NuPlSPoUu97bbXL%Trx|XrKnBN0)!@P4dx5#&bEowUm$5mYB@C%c?k};A#-~qOoQRn?ybN2y259oJ!r> zK!vyY86@F;#;6Hzwt5XS;b@-*$uy;3{+nLW)t=CDV+I zl-BNmf4C5BEZf2EDOiF|Dtnoo;ja*8m$J<&=LK-fk@)C{7-T{V(N3=2Gi$^{Vnz@V zSN4Hj>z}ytB<^>iLlOCM_YA~vGZJmRC=)V{cTXsjyGa;6>BrsgCTaq|LA2wqp}SDH ziA$85@>RYJBHXMdk-R%1Pp*qo^NASON5mIZm%O5N&9Sl|hE#;FsQJe91B$DTo}x3+itbqBFeJS(u~zYj z<5)zxG5XXzQJa-%Sec!_Dmypt$!FGc{S+7i+DP zjKPX*QX&aRTnrc)vle9>JvZr)tSf;lFu8B&k2dDKlyq1zwUASa4MOUYyS1^27*~RX z6@IDMnhIKw-$LRzAjqScc`HNPu0Qhy?iMIYHndahyS&QRWhwU)#XZ(p_Q;PZ1Gv>T3(1i*Bu} z+-u9Sb*+K5YR0zox32z+KMUT{PXw<9Vo05h8;8mA2<6$g0d_vE&q# zP`=bd&B3h~-(JM&w?>@$T&8XR&XGUTZhmKic2KLwKjv8T<)wab0?RpZ`iMNK?!zwU zoO&6pyoZotNoV}{x}sZ6|CBYew&p}o>(gf_bI#Vu`-c7F``Oy`$ua6PG5`8`vmTgt zhwoW!fng~PtZgx@@r9;@k{GYIGmpR%6aa>wJ}BpM#qjJmmAAa1)a61RQd61R%n zpWXHsFLHa*?LgG-M8|-~4Ldnv!w%!lF0_JG-8;V~y*o`~ZmwU`5Y-UL(w^O(rF!mf zOB~%?pKjf3b?)J3|2l*97B9xEz`ks&ET<~};LmEB9{N?Zt+LA8bF`e4Ib`ms7~B7& zx~7_`TVA|9YftsJS$n$g>)n)OFZzlJLG6njU5}b4SDz35>}*a}W{}r@=ggd<#B%#U z`znV`IeqtRS8B_$cB@tUnPL9dG*H=_`0c1MLz})@o1=^l%UYOJdTvcfTz&%GUd5=- zD{lmO1$iB?s-YyLj5xU6y=mcggJI=Thoug^EA8wIE4PN_gxLAaaM(_XLwR(d{Q(l9 zU8=19b(>(ggA=W0L0+#k78|PBH{?aTuW5N`1wBB5)k%QaDj4TZFDUn_a?NrAqoLg~ zz0q1ROAF={#`wNyF70!(jN#=KGgN>m^V;urHnO}R(0;$GA)OrYB)d~`XaJ)K$~?g$l$MiIEyu;t5sHTV2qGz;sAwifo39BjgFw523ML& zgsII$+>2PGizC8E#fW7IMEInR2u61z% zrkuS)yEZEui*qn8?Ms&BkZeriqgARID&xW|B^G95nBToX>%fI@fF6w`4!!fa_MD9~ z#!Oe8OUNq1#?hl;P-n5+3wY_VT5O>)))3blm*kksy5f=@bFI$C7Fc!9>W$4+FLCr| zi5}H#fObXeLc62SkM>5d6Yo~X*JZtw6hYTg9}o@h77F*Il7x@8XyWS|{C*&-{<0|~ z);CtOpB{DgF3Hk($BALuBl+)d+9S@U3LBqkeskC6t`dDh{qA&JTo&f-y+eqv0bh>m zP3cmcpOpe==dF5Xp=;IW+Pa(&jn_ht{j}i+?>6taH^0cb?L$w|m-^8V;=nx)BsVxo z#wX3PmAw--(wocv3Xk8YnE!REB}H{%ktQ`e)fHw6XuxycqqUw#PIr8Kx|AJ1ZHBdRNZ<6YwL`bc?M=o?qGN8b2P)-2fo z`Tku&DM!h~J`JI6;(PV=Z)x8Nom;H#^!=L5?yF`2p0BJY4)?#Ge(k)?+OI1DlV%sX z1$bngPdH`Ppt#4NLm$}rXnd(6Zr%*P^wYj`#8NAToll(KjCrfx_x042QiZRk%*rRk zFTF!dsA9hEN9UP{c4)&7Ss~puVqa2FQV@+*8>&3*eZHu=@8|Eyjw0fa)s~6!3c_Fq3XyZqBx*AJhfZbV#);=W`RkQo88awi>vbU+d zwvObt);{oqf0^`QUTcbD?)$Ua_Rr|rl-Hfxn(VlfYC)?zPYg5jN`1s*)uAw>s}pn+ zeE&$dx-GjqR#|=e2O>Rxkz61gr}h%oa=CZaI3C!wc&w^_y{T_yc{z5`E?{3~*`6Y0 zxwY&wLhdo0Th^DdYOD64Z%4BnFs+HG7|TS7FWJBkA43=uB0 z%x>?06a{*}msdMemAfb1xRb8EIw3r7xAY!w_w-(GkMy(Np6Tbjr>6ILd!>Ko?VbL) zw@WOS7!vPU&2nFAd~}(sA?UuJ6CHOH zt-7$uN_#Q3c_zf@O*Mhl%zNvx`FXYQN^#pqvRe_V=tZ)f24^o-s&#bnp73tTEQ*v9A9P?hfr_97PFyorgRzkTJ2JCI{p0}4(lN#c1 z=FFLY5y1tSoPFcX^d(!z-3r%Zlr$o!aNu#TI}r88vl-_U|@}q%oyr~_!@8=ywGhb8-W!^`BAk_`tFB+c(hetVw>DTTt zJw(&K3-J8wpX6Blt@c9tMJSHP`QJCYRmU%j=-T}q>ECT4U+(^5Pr$UbS4(K_ zo}~~Wc_nMl+6&q5+4$sit+^m(7)oVVQo7bPranuxFiic}4tqO<2esd{$2MtVGw#Zw z3iXEk?1#Lg*wUG0)_iEov^zB!)`~n$zTe`R#oo&ubMK7bSM|x-s~Nv=P2In?J5w8z z9&2XjKDX+XcSLLp?8*v={eg6EFp>TZUv3DP)8G&g)w>}#L_7AVeUvuYF;8>*z60^y z+7h}M>bWW=ch9CSsP(CA)zYwZ*ZA21>NQtcnIhhAt9SNnb9Bntw!~56MWn1fYkpcd z)5b^4kk?X}ufl{awt#)aJAVuHu~7tVi1kYUrQ97!$OlVj_9op*c7MmJAJT_3%KZ_2 zb0M`k0SCXF(-(jDjjUSWtIvKf$v&@3Ovq6!4pThgwS%hXt#V6O9lGdMwhSxhQ^h#h z^7p}Fk5qk;Rja+6eo3u7Pv9V@HB_aWzVz+)&A6K5MjW(P<0|7KQtUOAS}{khj!X9V z=J)$Usy8oB_{`&b(x495%LA&@VXmaefEsxA1I4Z62TIfxDCPu4Fpb#XqjcwozZ#@N zg{T2A6`4>MBJSh%ct*j2T}m(s57q`5EUwc7coI4-m& z`Ybrf>@H2IjZgl2hKsdfkImSK9k)?f`>5xIZph1-lVYtfZ#b;w&bhDb|44f^{nA$2 z-5oGZdpYB(+ABFIIf%tFANAe?^vxYPZs{iNcWPzTjBjlEKmLw<`LXG@u8%i|WY;Fo zgFGX$->d!U!gN`NGN4y-rTR$KzrV3D{9Q}anHY#kvF5Z>ljbGgsQVI#M)@oBWM-Zw#nCOqkhJQzGA+$| zPo0o)Ei)uLIIpWHP@KIu>fU6Q;eoc&6IVT2bu15bD>f$@op1 zj+vEtU3_N74L(ylGCp_qq`AM$3Ddw&@tN?)cV@k(9m%++_RH(yxRLp8S`|ER)i1FC zS~}BK5$Bij8}}M!!rk5zgwsXsm{@78cqlTYnxwF^x{ODPyb?NEaRik1Z zlJQO3D4akH3_szGliJbrZ~kH(r82sob8nal!|vpk$*plbCc#3>xQTwXo|`YvePweM z{`V`XM4n{}UoRqpV>C`l{b#j@8+dFmrt{z4bUD7*O;ep)*|#EVDH?;QpOO|~*PY`;@ql-3nTUgZHhLli%iBgtXsiE(yN;H!&>L)8p^rtO`@&$M=H zd&9?1wClFlKJ>j?S<_v>6S&CX97=bf^;Dczc09z-y0@HTn^qHt14oVCoLh1od4dBj z!8~w;T+RKad=li2RO#N3P*Jg;2>Z^U-Hg(N(n17N7!kwQ^Gg$Zr3d%5$cQ~!P|8kX zAPgNR6i6>zaJwSk;NWh|6c%;%IXWd|%eBk-rWuy@-6p}(USW!|w3AJdmUfJ3wxu0z zim7$odeh?89H3qehf`b)D`CKU&Mr^S z*KSfPtJxN-hR193f0$90l-IrbseetoWc9CvAB750tgVzvZ*jrLFzHZKpN@ z5v!tWGk$-KMz>nuc$T7S7z<~tvQB@7(noA;-*4nh=~L`zES(aO2ozWc-v1m-(^uM4 zT+<#*>qtnm=C=OHYO+#9(IcS=v2MtHoB2cZ#>0W=Cp62BfQ)} zgad&@IF5H(SSFt#ed#2GJZ!1${>_RZ!MatT%+vZPdd$V1ST7f7pEI+yqQD& zkcKW~G*mCd(6<=-@RVeVqtBq$m)}nDrYWLL>W`-@6rJTn=!9x?7D>@_>4Sb@i(C&_ z8?Azpji3fvpv*nUR4lzSOy542GRi(GmO2ukj2|zOBIeO-_Hlt!GmqY8UdDHqUWCXPymBs$gMKJ!5h2#1sC zi_StNo}pP6Qh_m0YDlItq~(e9P5(%EnNLn)aJBi)dIE3|zyKUw0^FbGN{LA{oPBaq zN?Qut;Odh!uyY?Lxe$f~ivFDU$)rRzI5d+wD^oEF|4rrMqMKBV17<2lL8ijjZa5=Z zFQO+@<4lQQR@A`T0IkeWcZzw@(UtO|rIm}R-8dh2N-r;_cTKEYjP96VW`-2CWPIH{ z@Xdc*_qTyJIf86uGCg$`j(Vc?g-hv^6jbyhDReG#MSeZC5W*-#T8-6Uf4Gb|_h(zA z%;j_!XJ}wKy`S3aQ&Z`?cs~s2EqIdvN|T^JZnV3{UGvoI233C~>kZlYa?iwW+sjTs^zwaWXD|gc`X2J-;ePUY2+SyP&H$ik8wB-Pc$>aq`LKVxoZM{3C}# zGV%V}Kr|c95bDkE^T>rj4oA?pu^uNB`GIKgorIX&M#O{BAkjbsQYja4Q3am+h_D$R zttwS&-Uz!nm?8CTq`Q4?GvGMYBEN!wx3dTb+a(oe(qvonxO6HL0dEp4q-F0q3p5~= zjx2ime;aGarrW)(0osIurOc|=w~t){o25h;CX$dtBW?N4|7SqT&7sHRQ=S2<5cW@i zo#`ZdcyakDA}+^^`}#y;>!U;8Fho*9ge!?$OVEa2g@&Z$!r+%RNd>u7Yx{FO5n}?S z_FNk5^K-qyI&b01;2!Hl_&NAi+1ml9P8!Xn_j^O>enPf%2iOejmr;w$(&V_K%cF0z zEA3K3KHbXemVEkm8zm90j!H$F=<~K$M~QGvDY+NWjzWe<-<5WK<9$?3RhEtc4kQnlHq(3>d<7j>+W&}!2qTC&JnH?jS}H1} zANk`MZ6aJp--s`l4gU~=b0Kq~?28Inr2APQFPlI$NqTteOO09CWmHmT@ zEn9!(VUUf1PKdOhr5~cF~GR3kTzZ3#y!~89J{C%?K&M$_Dh&Wz?3b zxUGi6{e+j}JF6Cy5-Ig@s7su5>T!4>=N2jAGWFpplJ#zET}`u;u$y)%K#T5ez%Hce zz4p)tC^{PZNFeW!YRYN8vummOd2Iv{*Y-%(Ptfiu0uk4_kAsy;gHO<%p13j;-4~&c z_j{qhM1lvT;=Od2Vr>l(Js>@|era?sy%x;dYmvfx44D;UZpp+vv$VsTCHD$?+CQTc z{STmk9lTYMab$c>#5GW5k1+j61wBTcxv*T*Ay*BEg_<3g49q&kK+IWA}MBWeP!Xu zb21M?qP_!C=|TE^@EUlusKb~)NdmLnvC_B9II;SQYI-DiGA_SUGV`F%lU1{E`FBc* zHFSx>jjs|C0uMDcI6SQz(4VZq4u#)DzzGs@>T0t{AO$hNK*Wq-E*_b|)I)SBKh_0Y zk?Ic7H5OCEv&?%?pX6SP)3g$^I?b4z`}7U9bQxr*gN`;pq0Vq!)sGyeG1Na)hmJlh zi1026!|xK#K8wkRBl`wIx=@bjARQhnbG z^b2MagU|3z>f2tVYprJ^l!qgd4V4&eRtEDc!!GNr;D^S7Rs3{dK8x^hZ-$W)UZJzF zdz$caec>yJRf?F>8$_3hoo$x-o9K%yrc~0siqjbC{#PN*m{KBc#FothuN#rBAEz^@ zuT)~L8jjNsgE+Q&^FrdWuUtHQ(tI8)ieyn$yhacCn+X9CdeZ1u7Qkzc4a1FuoLP84Dt|xBysj4qKQBq z0k<2GhEhs2b5e=8VhCe}D7Yg*PNSKvLph96htiA!mp!`;r4yx}Xd;~;>p;|)AK8e~ zBFkPA*+(43`8`Bj)+8r3VJGMpw?`ArtUl1HK>_S+hV}l4oJ%oyg z?dH!t(T6pJm-3KP>4F(HB?QT~FZ$(t5P5(Bb6R-Vl3xw*lv0euGOD60I6Ti2Mca)v zaztKa%OTjx2$xE-8_h2bZX))qX1lF_kFiMY<@)iyD zU)nL=*NDE8MudC$G$5w91HMzLcndBLdxm_Je@86!y+xOMK${|D4MPo4ENp?jlK)pU*D+@Y^NbCXgd1JR|Xqx%0{EMZpz7DmE?F~tju~MXs5j= z<-SJ`*vMegmG|f;2;JswzpHS%$+=gNoIIkVhPcks?mxl)rjVDmqQq z$We*Aqt#b#o+dEXf12(}<~Y|thJ4&60p}{XEW1jczN2l;;V;Um+?r6ijrSUW4>iz> z5po>jR$l)huFC{z=tH`e#}M?SbkgPMIowHOc@H9}p_9Jkp~RQml|&N-EsttI$>3!5 z75}836x$^=d<2)s`N`RxQALXYzE8=P>9Wfv1ln z8X;5~I76Rt<_S+!n>(+l3$McK z<={lp)QEoc6%u{n=X5G7v&J|qF{crIq40ct2J5K3D}xgq3lz|UzQZ)7Wj@yQ3?`Ur_ z^?7}Xdq}MMOS;M?jH8k2zeMaUEC+bT(iL|tTsVsdslpm*@Jl*hl~ac{4x_mKG_yve z=&z{ObCPg{*Gny9^ooZ@UtgJ0pwB94f!tS4&EP-*xp8p0o6hs&Jw_?f%> z*m9oE<)eS?zh(5x&RZV;ee2wlw_<)vc?V zp<5oii*9-R{^n>I*!V%7Yoz8}Mb?o2Z*7Ks^&O;}V~P#`FNCF2gLD-RDw^m)`Tkzq zhV<_O-K?0CCV$4oooUSl+NCOn%559H=|GX{7GLC^3jwe4TdI}y?2$z1Cy`9w(&@Gj zpOk~4yNNEFJXT<$!4qROCIl*+v^q>QzAXE&#Tftxw*~oH1SU3dSq3v*KdD{FnYmys zo2h(HG|}esCXfBuv$>C(Vo)-CU4c=0>^tgh8&gljM~kKU@8IanZ5WeI-|-!No3ck+ zB;60x6Cd@xU4)a<}y)E)4k@ zesB>!#O_32^aOa^e`q|@rAVVwm>RXd=|6NS<%dumwn7L0sw>ft{)BM{-j#V_=j?XyF0I$rwd5&9Z)MZ)!d9o%LDmRC7nII$16$ztfc-*0?9&^oIe$lPBPQakbR^J57$~a@tpHu;Pw<(3U%B zI1RY$Bb7+ba9b3$w*c2}yqAyV?%`v*;7=|SDeMOQh*cHnuiT)^82f!dN~Fw3^?NF! zE3srZ!VPz+kV3k&PHLbm2DQGAvRzDNTLI=X=05WgR@aeF#HRxF1=cK{1@i&-KB9JM zSkS%5E$xLJH;Bl6s7DdeBy+KLN*%Urm*Rcouw0Z+9hXw=*!?(a5*>ECDplsL!;Wd4 zU&O9Fn@U6}7o|oDwP)cBD^Ig$%N-(!__DohaEkN@&bYX}7*w^mD&U;Q)?3?iV zHYFJK^EE3x-_V<5=sSapAt%X8#qQxwYwf7H3uJUEwoLI7l$_sX;kie}-se)02Enhp z)ZoVAZFwj}qBY>g7TDMm&E0}N)SWG(s$->-Wx>}d={(p%8%#e|Ds_6W`HGj*xFSHv zEt1lcU1KkoNcK~?{0F4ysq9|%a+-8_Dx1&io~aQ0%eW`4GsSb2dc$<~h?S43j{__?8<{*miUXO~3ks=HW;lzC z511EyIMxPqN6iflOIg6UR+ojA%c8T5Hu1||%4^Rg2w+qZOoNpG` z?Y&F>lh*-~3oe4S0Yc_|fBWS*I}#q@OL$9UTIT6IIze&5;KzRbVXw44hQ&z@8s^XU zvt7fUQMoiMOvB56I9oHT&ZGLmXm*;0!%etAC`$0{urZhOJFymdUqN+(f*x2IRk$|2 z4@?|TUl7YqOz@D1FWVA<#Vq>^J(3X5A}1Cs1IM$k_{J^d_^j#BajpifI=%nG|E&jyxukktVJG+->T=Hsyi4@QGO zH~2s(>*X=*9HgLI2yJ#Am6{epyG@PKnT70LTb|0fH0Xsz>;?^X9xZErG$5h5Si{vp z)-UK52aq?7BS~ArrsBI-9r!Wbs3ZowC@v;|y^&4w)% z+{rfi30xMk-M}ms`~=Bf7=Odh*&4c&?F{DNFjQI6u1yJ#ADhnYiW~5_pJw%oL#sJZKyKlL%&z}Q$qiw=@bsNtK!S+-4->hEUPu)bT?hIQ!x!q+G@ z-@}fpIP0u_GK{`pJxit#v01EUO-P)B9g4cu7n;45OG7(H2(8lhZ(zq6x6X=8ruH-o zg{xXp5vQo?BO>0888R7TV0*#fMq$f8JNHcJ+QK*vJX8C02 zi1M0EIcyD8aRr4m2Vj`;&cp80^4N9ibI(XPK3&uS5wvS~!h3KE`rJ)OHsIjq%e;6L znR((nZfac6jtSz0fy6-6+*QHmI0Ajgee81v|0RfNQXIQO#qe7LKbOd zjyf_fYU!q+2g^K{pycjaZ8 zG4a`4$+?1ag*Qhl_rABbv+c|QFFZS1Tpu76o$e$xlrru3 z7h2LtDO2;d+GA8NJjV7hYA>~wAr0_CzU2fB@vM}bbhkX~Gj;4IDg$^TmtAkKU%#70 zQfEHH+@S=cQbReY@ILQGX?V|{woF;8FFVNl+V&!4 z09S*1ky3b>cTDYBC`If;eE6VPpSq9Tuwu!jQtAQr7XJ{zx{~cu*;OJeN8q)ilD}Rg zn&^S2l00q`H)i7Ynya7rPrP>+cf3%c@HTmP9+J3u6%(UqCz9!WIP44`7RCzjR=>nD zER1CkgbjQt5Q^b4;d@-9e0SyM@OOPAf)9tEl>5Zn+lUw!hk}eN4vfT=pmdCn)e!Oa z0g}t%!}{^sbU^N({3BANWsF0Z|3o&3%Ui%lxf4-ax_+YHQj1z025KffH_4wSXu@y8 ziW6@=`0I+$29!YyJa2fRXu>*b)9Exv;ipb{OcS1o_1cLM)_8qUkGDN+8$Je6&uNps zKE`%RHMPuEpHaiwkzqp-u1gtkroNXCVc*c&XUp z0u-Iz{;1V*n`uaN=jc`yi<<1L+>Lo9IeA6J_dWOkXJ3Oes%B0dN{v)<%qj#&QVm#d zIA%5D4&EFvuW=4Gq$CZc2qj~@uNiHeK1)hb%o~AQFnMh9k0!=iQodppU&blLWa7Ny zYn~rdfq9)M*x;QV=2Gf}({lvcz_|kg-RZQd`1ax*MR^width - 25, 5, MyPinball.sideimage, DIMAGE_NONE); - int mod = MyPinball.borders.size(); - for (int i = 0; i < mod; i++) - azrp_line(CX(MyPinball.borders[i]), CY(MyPinball.borders[i]), - CX(MyPinball.borders[(i + 1) % mod]), - CY(MyPinball.borders[(i + 1) % mod]), C_WHITE); + CollectionRender( MyPinball.borders, RGB565_WHITE ); - if (MyPinball.has_locker) { - int modZ = MyPinball.locker.size(); - for (int i = 0; i < modZ; i++) - azrp_line(CX(MyPinball.locker[i]), CY(MyPinball.locker[i]), - CX(MyPinball.locker[(i + 1) % modZ]), - CY(MyPinball.locker[(i + 1) % modZ]), - MyPinball.locker_is_enabled ? C_WHITE : RGB565_BLOODYRED); - // azrp_circle( CX(MyPinball.Locker_enabler[0].pos), - // CY(MyPinball.Locker_enabler[0].pos), - // (int)(MyPinball.Locker_enabler[0].radius * cScale), - // MyPinball.Locker_enabler[0].color); - } + if (MyPinball.has_locker) + CollectionRender( MyPinball.locker, MyPinball.locker_is_enabled ? RGB565_WHITE : RGB565_BLOODYRED); - for (int i = 0; i < MyPinball.obstacles.size(); i++) - azrp_filledcircle(CX(MyPinball.obstacles[i].pos), - CY(MyPinball.obstacles[i].pos), - (int)(MyPinball.obstacles[i].radius * cScale), - MyPinball.obstacles[i].color); - for (int i = 0; i < MyPinball.islands.size(); i++) { - int temp = MyPinball.islands[i].size(); - for (int j = 0; j < temp; j++) - azrp_line(CX(MyPinball.islands[i][j]), CY(MyPinball.islands[i][j]), - CX(MyPinball.islands[i][(j + 1) % temp]), - CY(MyPinball.islands[i][(j + 1) % temp]), C_WHITE); - } + for (int i = 0; i < MyPinball.obstacles.size(); i++) MyPinball.obstacles[i].Render(); - for (int i = 0; i < MyPinball.balls.size(); i++) - azrp_filledcircle(CX(MyPinball.balls[i].pos), CY(MyPinball.balls[i].pos), - (int)(MyPinball.balls[i].radius * cScale), - MyPinball.balls[i].color); - for (int i = 0; i < MyPinball.flippers.size(); i++) { - Vector2D start = MyPinball.flippers[i].pos; - Vector2D end = MyPinball.flippers[i].getTip(); + for (int i = 0; i < MyPinball.islands.size(); i++) + CollectionRender( MyPinball.islands[i] , RGB565_WHITE); - Vector2D SE; - SE.Set(end - start); - Vector2D Norm; - Norm.Set(SE.PerpCW()); - Norm.Normalise(); + for (int i = 0; i < MyPinball.balls.size(); i++) MyPinball.balls[i].Render(); - Vector2D A = start.Clone(); - A.Add(Norm, MyPinball.flippers[i].radius); - Vector2D B = end.Clone(); - B.Add(Norm, MyPinball.flippers[i].radius); - - Vector2D C = end.Clone(); - C.Add(Norm, -MyPinball.flippers[i].radius); - - Vector2D D = start.Clone(); - D.Add(Norm, -MyPinball.flippers[i].radius); - - int Xpoly[4] = {CX(A), CX(B), CX(C), CX(D)}; - int Ypoly[4] = {CY(A), CY(B), CY(C), CY(D)}; - - azrp_filledpoly(Xpoly, Ypoly, 4, MyPinball.flippers[i].color); - - azrp_filledcircle(CX(start), CY(start), - (int)(MyPinball.flippers[i].radius * cScale), - MyPinball.flippers[i].color); - azrp_filledcircle(CX(end), CY(end), - (int)(MyPinball.flippers[i].radius * cScale), - MyPinball.flippers[i].color); - azrp_line(CX(start), CY(start), CX(end), CY(end), - MyPinball.flippers[i].color); - } + for (int i = 0; i < MyPinball.flippers.size(); i++) MyPinball.flippers[i].Render(); // azrp_draw_text(150, 0, "FPS = %.0f - Mem Free = %d - Time = %.2 f" , // (float)(1.0f / elapsedTime), @@ -258,16 +195,6 @@ static void render(void) { azrp_draw_pinball(250, 200, RGB565_DEEPPURPLE, "Score:%d", MyPinball.score); - - /* - azrp_draw_text(150, 40, "Ball1 : " ); - azrp_draw_text(200, 40, "X = : %.2f", (float) MyPinball.balls[0].pos.x ); - azrp_draw_text(200, 50, "Y = : %.2f", (float) MyPinball.balls[0].pos.y ); - - azrp_draw_text(150, 70, "Ball2 : " ); - azrp_draw_text(200, 70, "X = : %.2f", (float) MyPinball.balls[1].pos.x ); - azrp_draw_text(200, 80, "Y = : %.2f", (float) MyPinball.balls[1].pos.y ); - */ } static void get_inputs(float dt) { diff --git a/src/pinball_entities.h b/src/pinball_entities.h index 331331b..47f802c 100644 --- a/src/pinball_entities.h +++ b/src/pinball_entities.h @@ -10,9 +10,10 @@ #include +#include +#include -enum -{ +enum { LEFT = 0, RIGHT = 1, }; @@ -31,6 +32,11 @@ public: ~Ball() {} + void Render() { + azrp_filledcircle(CX(this->pos), CY(this->pos), CR(this->radius), + this->color); + } + void Simulate(libnum::num32 dt, Vector2D gravity) { this->vel.Add(gravity, dt); this->pos.Add(this->vel, dt); @@ -41,10 +47,10 @@ public: uint16_t color; }; - class Obstacle { public: - Obstacle(libnum::num32 radius, Vector2D pos, libnum::num32 pushVel, uint16_t color, uint16_t points) { + Obstacle(libnum::num32 radius, Vector2D pos, libnum::num32 pushVel, + uint16_t color, uint16_t points) { this->radius = radius; this->pos = pos.Clone(); this->pushVel = pushVel; @@ -54,13 +60,17 @@ public: ~Obstacle() {} Obstacle() {} + void Render() { + azrp_filledcircle(CX(this->pos), CY(this->pos), CR(this->radius), + this->color); + } + libnum::num32 radius, pushVel; Vector2D pos; uint16_t color; uint16_t points; }; - class Target { public: Target(libnum::num32 radius, Vector2D pos, uint16_t color, uint16_t points) { @@ -72,18 +82,22 @@ public: ~Target() {} + void Render() { + azrp_circle(CX(this->pos), CY(this->pos), CR(this->radius), this->color); + } + libnum::num32 radius; Vector2D pos; uint16_t color; uint16_t points; }; - class Flipper { public: Flipper(libnum::num32 radius, Vector2D pos, libnum::num32 length, libnum::num32 restAngle, libnum::num32 maxRotation, - libnum::num32 angularVelocity, libnum::num32 restitution, uint8_t side, uint16_t color ) { + libnum::num32 angularVelocity, libnum::num32 restitution, + uint8_t side, uint16_t color) { this->radius = radius; this->pos = pos.Clone(); this->length = length; @@ -94,30 +108,63 @@ public: this->rotation = libnum::num32(0); this->currentAngularVelocity = libnum::num32(0); this->touchIdentifier = libnum::num32(-1); - this->side=side; - this->color=color; + this->side = side; + this->color = color; } void Simulate(libnum::num32 dt) { libnum::num32 prevRotation = this->rotation; bool pressed = this->touchIdentifier >= 0; if (pressed) - this->rotation = MIN(this->rotation + dt * this->angularVelocity, this->maxRotation); + this->rotation = + MIN(this->rotation + dt * this->angularVelocity, this->maxRotation); else - this->rotation = MAX(this->rotation - dt * this->angularVelocity, libnum::num(0.0) ); - this->currentAngularVelocity = this->sign * (this->rotation - prevRotation) / dt; + this->rotation = + MAX(this->rotation - dt * this->angularVelocity, libnum::num(0.0)); + this->currentAngularVelocity = + this->sign * (this->rotation - prevRotation) / dt; } - Vector2D getTip() - { + Vector2D getTip() { libnum::num32 angle = this->restAngle + this->sign * this->rotation; - Vector2D D( COS(angle) , SIN(angle) ); + Vector2D D(COS(angle), SIN(angle)); Vector2D tip = this->pos.Clone(); tip.Add(D, this->length); return tip; } + void Render() { + Vector2D start = this->pos; + Vector2D end = this->getTip(); + + Vector2D SE; + SE.Set(end - start); + Vector2D Norm; + Norm.Set(SE.PerpCW()); + Norm.Normalise(); + + Vector2D A = start.Clone(); + A.Add(Norm, this->radius); + + Vector2D B = end.Clone(); + B.Add(Norm, this->radius); + + Vector2D C = end.Clone(); + C.Add(Norm, -this->radius); + + Vector2D D = start.Clone(); + D.Add(Norm, -this->radius); + + int Xpoly[4] = {CX(A), CX(B), CX(C), CX(D)}; + int Ypoly[4] = {CY(A), CY(B), CY(C), CY(D)}; + + azrp_filledpoly(Xpoly, Ypoly, 4, this->color); + azrp_filledcircle(CX(start), CY(start), CR(this->radius), this->color); + azrp_filledcircle(CX(end), CY(end), CR(this->radius), this->color); + azrp_line(CX(start), CY(start), CX(end), CY(end), this->color); + } + libnum::num32 radius; Vector2D pos; libnum::num32 length; @@ -132,26 +179,34 @@ public: uint16_t color; }; +struct Scene { + Vector2D gravity; + libnum::num32 dt; + uint32_t score; + bool pause; + std::vector borders; + std::vector balls; + std::vector obstacles; + std::vector> islands; + std::vector flippers; + bopti_image_t *sideimage; - -struct Scene -{ - Vector2D gravity; - libnum::num32 dt; - uint32_t score; - bool pause; - std::vector borders; - std::vector balls; - std::vector obstacles; - std::vector< std::vector< Vector2D> > islands; - std::vector flippers; - bopti_image_t *sideimage; - - bool has_locker; - std::vector< Vector2D > locker; - bool locker_is_enabled; - std::vector< Target > Locker_enabler; + bool has_locker; + std::vector locker; + bool locker_is_enabled; + std::vector Locker_enabler; }; + +void CollectionRender( std::vector collection, uint16_t color ) +{ + int mod = collection.size(); + for (int i = 0; i < mod; i++) + azrp_line(CX(collection[i]), CY(collection[i]), + CX(collection[(i + 1) % mod]), + CY(collection[(i + 1) % mod]), color ); +} + + #endif \ No newline at end of file diff --git a/src/utilities.h b/src/utilities.h index 6d5ca22..22f1e0e 100644 --- a/src/utilities.h +++ b/src/utilities.h @@ -66,8 +66,23 @@ libnum::num32 SIN( libnum::num32 angle ) } +extern libnum::num32 flipperHeight; +extern libnum::num32 cScale; +extern libnum::num32 simWidth; +extern libnum::num32 simHeight; +/* return the scaled x component of a vector */ +uint16_t CX(Vector2D pos) { return (int)(pos.x * cScale) + 25; } +/* return the scaled y component of a vector */ +uint16_t CY(Vector2D pos) { + return (int)(libnum::num32(azrp_height) - pos.y * cScale); +} + +/* return the scaled disctance given in argument (typically for circles radii) */ +uint16_t CR(libnum::num distance ) { + return (int)(distance * cScale); +} #define MIN(a,b) ( ((a)>=(b)) ? (b) : (a) ) #define MAX(a,b) ( ((a)<=(b)) ? (b) : (a) )