From 57e9bd49a1d94a201a17a7ea1a31b3985969ba92 Mon Sep 17 00:00:00 2001 From: terry <724796052@qq.com> Date: Wed, 29 Jun 2022 18:41:04 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=A8=E9=9D=A2=E6=A8=A1=E5=BC=8F=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=88=B0TankFrame?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/坦克大战笔记.docx | Bin 77038 -> 77357 bytes src/com/demo/tank/course8/Bullet.java | 132 +++++++++++++ .../tank/course8/DefaultFireStrategy.java | 14 ++ src/com/demo/tank/course8/Explode.java | 47 +++++ src/com/demo/tank/course8/FireStrategy.java | 5 + .../course8/FourDirectionFireStrategy.java | 17 ++ src/com/demo/tank/course8/GameModel.java | 66 +++++++ src/com/demo/tank/course8/MainV8.java | 20 ++ src/com/demo/tank/course8/Tank.java | 185 ++++++++++++++++++ src/com/demo/tank/course8/TankFrameV8.java | 116 +++++++++++ 10 files changed, 602 insertions(+) create mode 100644 src/com/demo/tank/course8/Bullet.java create mode 100644 src/com/demo/tank/course8/DefaultFireStrategy.java create mode 100644 src/com/demo/tank/course8/Explode.java create mode 100644 src/com/demo/tank/course8/FireStrategy.java create mode 100644 src/com/demo/tank/course8/FourDirectionFireStrategy.java create mode 100644 src/com/demo/tank/course8/GameModel.java create mode 100644 src/com/demo/tank/course8/MainV8.java create mode 100644 src/com/demo/tank/course8/Tank.java create mode 100644 src/com/demo/tank/course8/TankFrameV8.java diff --git a/docs/坦克大战笔记.docx b/docs/坦克大战笔记.docx index 87fdd1d3c3766a8dcab77eb852c260f3de91de25..e1d5c2004bd4491af80c6fcb55ad0e812bb0b89f 100644 GIT binary patch delta 13968 zcmZ9TRZtzk)}_zE-QC@TYjA?QyIXK~J4kSMg1fszaCg@O1b2cv0Va3;nz}Rd(l1?m zS9e!e*Y3U6cexH#vk8^J1z(1M0eRcX;nmyXPFHscO$-gZJ-<$K7S^GQD>j7krmSml3+9Idu7lo>OlhhvW zc%4)lA-Jum-&Xo1Qun7{K3$;+zcY2_&(Y3{y=j0$jUC}`8V5z61tz{S`0m4?Q@FvJ zK7xFyZ+?$G0o}=D#y?c=y%j^=iZebEzypmL`-aC*IHpoP9IxE3VvmUjnl&%lUVIAl;~U(cwZTzyp%>h(V{4> z&D^=T2~t|gqxl!X956B9Lg~@_RGZoL;DWlP$Z$>XKaY*<%`Qi&1MasEsCE=X9c)8m z5~C!r+d9Q_r0ZK-wN!s-3vS!Dj!$|DI>sE{kRHTnaJ)W_kysAz)y_n{G|tq1x5%o| z(J^nXp0w3f(Ot47Q=^S|cTnl!$BxT}_&MMe={orrQCSWW3JU-LzyZP)_e8|c93jl4 zl2?F?pb|@!1&_$g9DP&M*b%~@ZEn*7D5tHSZu?btE}v_-tHHs^JU{O__h#5*4Ksuk z8Yl^4amv(noRb#a;WoP4Aj0wU5s{#{o%zPDo{3P4Lg(uX0z_uIYnAWpx$t`V25@O6 z7sDu=Pcl*&%$uBwcXP;FIC{)NFF35!=0RLgAZG8KcH9vU_Cgi<;o@eaS`sK#<8sju zc#<-iC>A?F*?S&hn7O14c3dm}qPFK{+8&nTeSa0a-3GUHQ-S2F@bJ}nS^92y1N*xH zyod$!a6K_5iWdOi9l`^AncZc98o!K?nxagQEFs?%g_fowIVKf1yVTx;o2wto7_t!i zb*CV_wBtk6=5nyp_g5^0H>k_Fx2PhQv5Zo{lc&EUp%AZq^RpU75Y??MifYTsI^! z0=6sPQ5kwRGJOFWDNDvE8#;24U-)XDktxU#x#8*obIpIx+xovH6)F8zf0V)U@p*mi zEIWQaO|P3gI+0sObzjY$d3NRIuLOIym2bqCHF>6=>TvUe2u2zWQWRD-%bGT9GTv|R zdOsf)kIc(Q62p+CI3@VAnU2evvYhpEh)7ZIvTSrvW`AicW88F}ryojxK9a_#TYP$V z`*2^SRk>8xot2U}#zUJ~w&s=c=hVDCnhOs%SqNVJD)>c0o0fd}+L^2MCJY<*aW%H( z9OlqtsQITIl2gjTi?Gc*|9ed*dlV7wu-(I>$?&9zQ;!XySE@Bp)# z)^Ehi)3lcN_B`;aEY85rYXMypl=RSIp1)&p&wH*`{_I(3EbwIR%gK~pcFgxJx$hSR zMGMXaTt)KciAZv2e6bkl$^>}v>=$-2uTFdE7#hTEoslU1ejJ;!+vZ8M9V;yVCM?;ub#?9`RNDrB zmsjaXT3Mgv6rlEanC;iFI+u*&ze+TuNWYCqK|0lRys;8Y&kOlev!oXE|ND=+G6kZM#}m<=MybZK{1s{muHPFsMCR`k;U2-!)E z)-f_z;qp8@Jhu{5fbB-pqLqFOue$4XSD(f6>{q1)F9;a>Zl_mGo}EAUkT|wVZcc)D z)EkH-d6q2n?loRs{&ZG&tm&d^MAc1hI0y#td}#b4BWmCEQ;4`29}apndg91)#eCjS&*v%8VEzJ(Me?hi%NvL|+8`^}A&;?Y&! zt5Iw4SJtqy0?9G)8f0}%30>*o^6uE|r~kXQQau%mTG#8NqeB>@by(cyY*|O4V*3i> z?h}FkclN~q*KTHIKdFWA=BFRtf`wG{x%ThS($4pmx9h@}zh`P7El|7P(}RBYjqvv9 z#@&-6_i8Ux5OaNIt&f~D=_5J>r z)JjMQJlB4LGSA$f51CoEVq2*l*5S~{0(62HC)zD?SR;l+AW9ryRIBQb80 zbc23QOEY5}jQ?-}d9_aQvXI5ERs;&|L=D6F_r=P>%#6g+gj4cuHZqx#*h(;yD_N!n z2kdu5NdyWgP6W2Z$sghGp&t;#`jchPEC=kq2q6sMU*)eP(c>UcNg-HZhGSVHKyxLe z@j3nr%?WQ$3+4J6E|7Z&Q78*T$lFSL7U-PMi?~K&5pxKdTb)4A6!BG`6BX638WNo0 zOJ%~HQ=L{P$**gvU+B-kknk-J;$EPQ5FZF%m{YBU;U361BU68blAzW1bW;`RAH#Q` z9BDyk8hym0Hwb(&bI~!MD^eHl4#c;E;DMm{El!iWBa`CJijd~~-2}NojP1fU>y*p{ zt9l>jdyzXx%tf2tuAe;yO>bLj%~U7Of#$UdA6+!Y9({WUW#tQUT6zzlgof8Obd-{0_!o6Jq*@R7Uthb z_Zb;#ilsgoVrSePEKmIVpe73A3trmpz#H;mrazycw)c}K+wnzW*?u^UxuQ_ce$ig+ zjtQt3dKHK`>)mmZh@oK9KxYFeM&uYJ^wdTo9bKvsSLvH0+n)|tgj-qfBvHoNb9u;^NE-F>e zB>IK$r)1n?szi(v!0ac(@xf@OQypNYve1u1Oy!w}4&!HcEy2H%Nf_XzAZ8ydP5}N| zrl?X#xu<|lH2QiNil$njGr!<2tzpC6bgVFepqH)=*x+gs1l4Qlag`6FnWD-AiDuZN zf`9`0&*dEIFYPhlgK`Szl9odRuM|dGDz5f;!3hm>FtqqQ6>XuwA&uNpG`TN(QVP9t zs&^^nQ+elg%vXMmz_ZyVEDN#u(%|ZfC)k(4yFR2@GHO*~3+cG%AWeKUH4^m{#UL(F z^kO9$b~x4R9TOC^v#7RWclZ@K;=XWn}UTgwy%U5U`fw1~-*dyFL}F(--k; zd6}Va$kiA`2Shs7)$$SH9(XZ&J1U7;#ueHEl7(X-E6``(e(cM`{xAfeyI88Q(C8Nv z_d=ex(y2=VfN<#0>zEj0lA;S-6)4T1IDG<>e!C=#F#6^X>B|)L@WI`1|I`Bs8Y|yN z?KrG#&F|{I*5M>p_Dd1rE7Vs(s8l(IbCvK69auArHkW;N3ozu^*C^{rdX~V-V#_p- zO#t}@Ol!oLqaL--jWOr#MK$$wH#9fcVmxx$`4)RtV=c^8gCc!}h zM+a_fHCL@h7XIYOUGxFjdgrc~sq%n*jwGdsgB-tjpKnMnfBM(AoVFPCgA$4ID4oU` zU@v`b#lC4Di3GK#3gz{hDz#NpmM@tUyiEj0^IQJ1zKe}YpB?J__HoNoIiG^FObaRn34`iwt5HB^-Kj{&Qv(oX2S%E+3 zl%$MQ0yQL|MGpxM>1)ixOv5?hA{j6sA4KNADwU1Wxr|GQ{sNEQ6cD@b@SQ1hvYez4 zXb34x(iCw5n-r?>mo3D{`MzXEP?YQ%29H^*isH~6bDG2+0<9C^P&svxt@^{o@`$n(ApPN{;f-(5+oI}P2n=W4pv~D zy=56Y%wJ0m$1>NgQIZmlt?b%efJb#1UEdpq9A91eFm#i|j0|EZ9YY%*IBWfc_zupI z`?T**ZCxSb#Q3@!ONYSE-08o+Ndpv~rlcmfh+A0Fwfqf8auiT)Pu!fmU6w)2XOAMi zl_z`>4+$;}Jzqg+d4e10VHWG0k-w>l;PkGUl}cAJ3Oau)Ze*vvkG^?7QTjZm{wKTTsFz z+5Yw2m3<+r@{i!(^V^RHsbwKwPc{Q$t+!*?vL;8K*}pHKAqAc}1rVFyaOKRzvdxq6 z{u!lk4%gxvj8H@D{dRD!x&3FyE8Qb!L&-b{)Ba6~FE6HK{*81oa7&4x<5LA`jN%wS43-)l}yXB3yR0YOv^*Wpi_TedG3cvN!|3 zasICLr%MNig#iL?D;Bj59Gyr~{4W`3{=f59eYP-(oCUFbHxTYrQK9vhCQ*)gWc5ZS#faF7{IF8F7= zUS0`Y^7VeU6-Z|gqM1vi6cYCwh0&1GiifC5$ABI^o@)*H)Igh~^bDlPHzxE9ZqH%R z!%vPuppUX`)YosS^}-b58Ym>_8h=9?jKk}cG|WCmB&pYE#l1?%DPSyQ5`C7!^0BN_ ze0+xT=XmMH3r5mPk7!)5lS}gR>8^Veg}(MN3hg^5{w>v8jgF8O6QEqAY*^`a}3;5e5GXCBl!-rv#h(DFVfJF7&mjaa;>YwGjM=ok_thlQ`ZPgy+KZ@m)CJ@n ziIy?D*u7LDYYwdb_C@89(EK#yA0^g2!d=j?RjHW~xALSq7tbH=3K$Dxsm3~i%+)7@ z65H zc@0t3hKQVZZ>(xMN8+Yi<@Y1=-=P?R-CeeS&X)8_z9B1NF&Co7!|__bMe8w2y*7)- z3q#2!2U)Qsp!BA{WV}q$fMem zaK)}VC#g`EXMBG}x5vwq7O{RnPj8A@2FGAI&@?S7e#{x_V;+>R{{}nUUv#c7cx>98 z4z(p4W!anLy5%+-Tvc6l1-1?7Co=D6;~R{IvWA=J6(3o?UJIhuW+653Z%Ba5Zi!&* zAD!pwV47)#ZOuGev>fY?8U6^L*1s7(MXIz6(q2dTsG@r}{%}id{*$`2V&h}YMEu#` zsN6Aq#KP~_vAx3%2A}Zu`Zd1}1>0x0%l=RrGYZ9vWChfJ(>d*F*^+(vVh=0vCL1=R zr;yu~OHBc`#6VQk00uJ?8l{02c#1a<-ku^K5|?raTcKfQnlKvIH$rH1U?s)9ZDmvU z7z2y`jvh;FJV#+(t9%Re&JNU@%CX@&wPpSka-^V%-htra;dBKLCE;ufP~M@Fzc~DE zHB42AUkS2m5?=Q)%wCwPX{=6>grXisqy;+R;Zfjz1*oCpC4%I%#hXD^aQc6pDoDw3 zfGp-lY@TQA^HHgXdNJ=t4R8ic(+JEztlpO=nfpT54-rxvj_Pm2ZAvN25iY30|u2Anb z3~)p*FuZXC=XwQOr6%@EG<*7opTK*gIzJGyH%v4x&xDVle>Jeu);~uOYEtPMDsp{F>oEt#5CC7!NZJ0Pk<*`H5Tz>?fOWzxjuK5`5 zBlJ#tLc9FFRzKoSKLfl)omAQ=M4#TAn)?M!h!aL?a=UhL^kB0+@Loo5>ReAeMT!n@ zyqVm7%l^_~5(;{JmL0`yj*JH{w6;Dhv>pueP=tA-;N3O5V3nPzC7+UN0m{HQ)s4fA z*mo%?b%OSc6VNUi1ZCH$Q-b11$l%uXJ8Q_)Q0VWgLZloIiR4r)-NS14m4N24@95XS_6=c zB1nGW@m>zs5#NpJ@U04@l?4}DP*qo%iQ?8a=Z>P-p9FhG2vXBL z?O?u@S4<*IL2y@Ax}mGOX`j9^wgR!gV_MSU-ILPE(l>_gNBwbuDz)*av4d}u2-lCcfXbl&Ub&P)ZnWO1KH!t2k z2cXe|cdy&`ck{pK*f1iH6*r#XGF0%y;=xp={aYonH(ELRlR7f9y@~dPGdJukR#-?9 zmR2j*cdKTi$c{(o!rcY0g|QF6Z+V6Vr5^7eVcfrrL-VuQ=_>n$nBfX!s8tzUOD(H8 zd=-n2Mfx?D)*!-Lnzh=JT-#1xOY#I3(m_TvSAI)UlIOhNvW#+@zL;7R!JeNq&l0xg za)^#YSvc%ycRbvsEA8GhC_oHL6a(ea5$N%obG(h~@*Gc;NY!p++&!gRA0v(kWvd-4 zT|gBJ$vQbGYiH)Ngegpho5wAOd}xIMX0&s(M^=z@>1D5jCZf<3J%VXHFKG-v#X-A; z^PTQQCq>|An(kh4`YDkxd(FOHpa)D+cBY7JBs<1nn}y(C>P^1 z#Jv9Uq|7f~i{J53zP{lmBw>(pHb^>#!xERWjP`1AH)}0g*<@%h;|o4C_eers2M{NnU(C$Xbe~2W`w~NGwHH zEVAWcq@g+Gy=e)?tCVsoc}Nt0y3_xD64dUG)tbK`yg1xd{!YrWU#nPGi!@5+ZrnD9 zn5sxthWT42sSbCd?<4h%SrS{LhXRT3;Oub5;6woQ;I=yKnxj=~c(xbtlpY}S4r3cb zr%Xy$=(dVj@Zm#;iD{F71u7B3tGU7%`h-$w2||q?e4i)7dJRkxRguB|n5tqRy%<#e z7Av(8-^#^9a`x5d!khc=?{OO-a zKL`9b+)wRRe_k>B``%7;AR1^z=y7udPvly`QmE`ur66HcESwI}p@5*Ui0-0Qrf_FM z$->vLlbnd^6fJ6JzSlDEV!yzn;iY9DptwKBwG!Fd+QZyn5rzHTm&yWf#Lc&lWEh>C z0>gcAyK(obc4+9zfuLk|I(;5Pv$$qFoSIHLS5r6}gO_%?gY>Iw1FR66UM45bNAe?7 zLp;{TPPE;42JWk?5|Fo{^rSbvmx8D#ntJ!dN*SB2AvQ~bI3m6T_0GFhos(*$=yrqf zk9|+jr{T5@J_63_?(5-S2C-pSv?2}|MkuX-=id1*?Gq{I&ceixWfHK=QT5{Y^YvK2 zYH|KzrB6OX#~TzxCkuDzm&&A-^a}-{idtiRJ$@|X+>_E{=>!d$ULY+U^p6kPDn246 zIsmPtg>VOa#JWhw?z9t=pCd**Z7*-wz^^mmN~7Ygkz1PW?07Mn>P5v82xn+fj#R`D!1O;9`g>&c zbx}lJP|dJzu%OjSroc}q7L{R6@b1wRuDNNWYtUjb8YI>g=~*J>vm9O4Ft7|_9~hm4 zG6%mN>%WVAG;7van2Vi1g<;rtA+|ksaSO@XF-BZJF!JTOwfskwm=9?jm|#cJj$E+R zpDKOM;ubCBXCh>E-tJe*;%jhTqCsjGI{yW#7-z~B0Vw}d0tJhmk-2G)V#4iuTc@Zi z=MIH3OF6okU`~OMWX+}E2t_a{gQOP{-?jqri8QaQd7YH~NEana-VlV&bgc6g`&$H~9y`TKMfm`tE5RAx;0Cc_qlNKfQjOa<#cwSGwjAXn`2n!GA z)83wC$7vczk$U8`co<4wA2;2sj%gJNXk6T}rOS`sUr``NMEVyYz31FU zXjthE2A_5~>!lNFJ$4O+L#?|Gx;1o>%&Kev4iHmuO9J@d$dS_feW#>Q76S?2cfBY+ z*dDAkHhLuVGD`J!Gab-e<;!z{k=fX>sUAk~cB z8k%DgyPR+H(wt_cBxXBa)EV~C($54NQ$B>OF|p-KB;m!JvJuX-^#$bhRcIjZNd6i) zQQCF6YJ54nAG(B(H3Pr=6%LeTLDfpOu4-h3WCj!^!36rBfsD>SyQ@%x_{VeOQLSs@yH=xLn?-jEP?HM*}>Y%<3QNdrG&BOv5`RT zhT>r!^1aPOO*xBV*(KE|Cg!i*XK+Ui@q4J1Fox2Z|4_tCOfB}z0WQ%V(< zi-F;`^1!^oY{~?5TDw`1i_l#?QE7Xe37{7~HjJRu>PqOaI?hWddzVNLb9);O5&!si z&~mF`XTk27doQNK+%#I%gv@bpVC;_$Gtw=jp3YUR7%>+mXl}h>(6n}U>s*3J1Pp>o zIrPtjmX5q+D8Kd65NjB2{V9PqBOQ*uivd>-Zj2gayIte{>rMH!dh-B`CSAje1UeBE zh&}lMPUi$s&9$tiDh&Jkm4`BDZ>uQ6S#%#~&ZEBDgeO>Ad~XM_YDQFv3;~{=Jw%d| z-NC3GdusNE8zclf&|EfSOZ$+w_i{yBe+1#sO~8S=3@mx8kzo!f5F7!NOOfD!}bDoW6h+h^dRnIT^cX;Y4AF^`JA%)Px>N zMk#Wt)Tf{jflbjUCv?GvDglxNknT>@I>_gESM);MwZwa4Uo20}^HHnyUOKq)Gm-Z` zNC;ZixE}}v%}HlgYW((X&eo8O&{<^qN+R+-5=(SZ#4ddCks8mjSFEVUdO)96btx@P zn?k~f|HVv`v*O1vCpnIf{03Pfg*(~Vou``K)x%F7?a3s%KxkEluXH`I{^rK<4S8?F z*ej7sBMkt!9Ntbwjq@2ut^`@;qP05NVtE}yzTmS55D%zgY&z6RVv49i(~()W$&@< z05QsE`8|elqEdZmZ@PT|cTT8#Wke{*WxtFsqOQ_3W1edgQ=3|+80}Go5)*j}0L)$c z0dYJFqO&Ui3vnW-yK3>efs8-6%KHZK5uVN@&jt};oV0ri&!n@%s2uSOX{GYne@xrm z@3Ut%XqKXlty%rPjzTBQ7@_;kWHd_V?=JER(2!h=ZhGBU$hY`2qo;UOL{6_-xMN9= zjsotPUzsz7O+oR%9fdn?)aEVaZi(DDG00&B-3A5?6)(?Zv@x_jT4Cz~ZRA=I=bFR1 z8<$A;PssH$PvW3^S#@h^qLKPrG3)Nb!*0CG9khMf%Y;d#1mr|npssXm)x=U|2uiAy zrc_>PV*QxWG3%*#n8uOEqqW1}eo)Xzi(Mb21aYau2z-F6tO@)R_~NEZjvI~6nw}Oe ze7G;20k+FkJpD1akEmW8H;T@$t{KRxqz`Zjh_FlL!umz($>?L;6!e#`#x|?{RR-7@ zk<5Z&1@g`8Dv?-2+}5o!pkakf)mn6r9J?=M@ZH#vY^y`8pCYpod(vYgWh=NBl-Pp^qv)F z){_pA{i$=ayf1(cg@F!Bac;Y3PH5ItXKd(k%W@+?Q{PKHM*VwGg>RCHMwB>cq0aLj zHCd#`cz7R>j2B8qyVAU22EK(bPXpG7>AmIG2te<_6cG!?iCYu*ybk8|C|n50)Wp&7 zcqTbs*)S%9*YpSxc||&HMrya%t+3CWpvc1bx} z2W?roU%WZI%^>Mvzx^x-o_YthfroTW{bAU@1MSVn;O#tq{OD^FOed!zOl0NLaV}#q z7}zHuclZB08k4)B3-#3ZJNSHE^ zw7I)~a}DQrfj)Ts2miM0+603kM@$TLn^g0L_L9ty`+Xgoje>3y+9cr@mBcgM>5qlo zN%6^q+9ZdcIn%kn8^xZ|EWx6OKD1$i$tLsMXqXP%)_Yuf9a(FgQlwN#JkdF_0jP1F zd!VDYsWz@WR=q~SvF22e(5huyq~o7uiV}3@mPW_}(MVdsTO#wKSOOxvN$r#ftke`d zQY@#m*a$v7Jr5nbX++IUzT_;A*H8aCJ{ zO{odf^m)`xj3+hAu%wNIB;^N(;eMEKo{}Ub9ys?#7b<^InEp_Kyt+FlE^qy{ZYjPA z@FN?NZFciPZz^^W#vO=K!}s+hEKMR)H}P%5=?|{7 z4JP6eRZtTurH`qMVl-p&8c<1{&ELA1v9lLjnDLtlFVYdQ8;+48H|`FsNYo&-D5Lmt zExZcxa~a^$OMdJA&k1JhvKEWBWo;=@4PE}Ctzq>`GNz1_v{zvWBr8O^oI5o*?=e?V z#yWvm`CGtOL9GGOJnm?3a4#w9=c-P^%qr4?_pLN3KD3_C>yaL7xM>=!jm_-ZbOkjr zDxj>jwOI=_mhf0O7#Ut(R`S;iKqRdqN9y%XDPN!F`wAci1kjrIwR1{llhkat;MvpX z)0V-&(7KRwQ9g{TkX2M#s4h$)J?jezTp}Tr>wb~>_0Fi=V#4?{Yat!ko}v3Xy5}!O z&w^!H%e0QYDM_{pcc$lDZPogGF$~Ht{6b2+8k;>4@0Ur$`igTU#{&QRT^KAoC}0Fs zy@y=yFUX!!ka30<)?CZ3nvK&_~-Y!Lalt+a#u(!3dA7+`b5 z8{(*S-i+9NMlkPJ`-3xyAH?~Ma;fG#-`s!5X+%{#{9FZJC=rF?NmjeQj=}>Lv6Rf} z7dO?9rnsS+srKsB_R&5?&Lei(POy!-^T0h7f{jw)IOz@-ZqW7W%el34BWdfWQ4_)j z^C*!MpeL%0YJ#Z%dajZ6m08O1`Cgrp_?n_&Xt)q5BocoKFY^>ja&>u6rOpC&2AC?9 zhqGonPn$8LqF8_NqOU5d6<2I6ubJpB4%%ASVt>ID2LovtZhqt~x3W!RRzBs{;#u$g zbk1W#T$rmmJW|YgTB=k)K8wcYlrIcP-&RiNLDu$1++TRbwyt;74|fir%lhX-OG=QY zIg-9p83|IMmf19~hp+e<>f0P)a;h{a79cA7xZGd8Iy(CpMPkk9_rw0Nws*9$uI{UL z)-JLirL}7XeSn%eLmjc}zTCdI5+KdV%H$gD3;x^xjR7X3+s5GX5 zq2Gr$lRJR5gUdu-UwZ7Utj6BP&XGueT=(yW5%eo0V}@>B_Sa6+%fg z3~J@bI_xTh+1AJqVT^?nz5ZoN?lye1Wnb6pkWI3%HOUw?%NVt_iQJ{6)PXH81GQOh zLAN3=aw_BZ*I63!&wdf6DyFDa9OF-o`7E{nK(em5AMdpxC0Q#C8E2yzwc}7W@fZ&b z_|EvS8#=x3NNEfkP-}yCm=D!~-xhwj26rOFSBO+7g1O-_N{ea5?NJM{%3Z6COf1oW z!0CfEjBMnqocm(CU?8FtYKkCU4eF4X$RQy8pPI9vE9~RGA(kpbx=J%q)9+B*2LN!= z$RZ(Y2uLo0E&qED7-e7+6cIwnAAPRg5XrG8T{Bpw|Ar9aazbu#VhLCRz#X?LX50Uc zk~6_snhx&lHC5)BZZO7%yC;aFPoV$`9Nx4z*M}V3Wj5?%)xkN8`~ittTqBTnYmV+h zWd}3B2g}y|`cF+uwNzTj`v}hfP(=*V;M`G!4RxSRYkn?8Xgcx^hF@~tf>D4=A+h^r z`OCM(W|WI!`CkiCSqHE3%p?gyAR6u`EYFo%JdB0o$kfqz(B723O!yk{&1e84AMcl6 z8Dq!-_1li2--tuG`aovNbCWb7a)$@(_e)1~oE{2=II4uU#LMUv56df_gyS6*z79mL z1?L4Ytb%k6n+ur3$}1x;H%Al%wx?)*#@<04*R6^KN|6Sd;e!xE1BnQOsiU|r?nco} zzAF#eai4+9@g{b)i{rQxrpUdsLU%q!{>RYOEhaBik1 zL(yH}r>jIKq5TwPjaz_q@%!4TrJ2z>2tVrA&eg{POU3qegZ7{@mAvp0jXTlH2)9GL z-4isLK1jtoZ0xHqW>kD+)4pP~zDdl$zgho`WBfwX7vL|~^BC~!Lsrmp zxH?ZLq}z3}p`u6mRN+1Ul+;Ksc{r^75aY7I6^8<;q)-$i%#YjvUU((76J$yL?IMK6 zhp(S$togerMz;LkC;{zDq+u`%9AbqIyAH^wOCV^gZNef?aUab|Rd~9xC|ZWmcJLtV zOG1?wDlKw_E*;hPozJ^Xng6ZFXAe0J`k@L z`lf^kK;u8>=6~^Z{qs>s>5t2%htwGPPhYVAl~CKwjL_#R19>%QKyP9mE7aZ{}XL|37a%MX63XxoMOOh+m%)^G+#_+ ztKPI@F^xBbZ9J)W5h9umD!R-?jUarFJl7WZ^>6l(r?JJVUJSm}`>y$3p;Z`z7M;mX zQ1<{Wkz6tELjUwz{zsOcb=JdP5#3)GwYi9XiM;mq_2vNK>VP_rTiVsy?FGA5?S#;I zO$Pg&%7Dn-$rWd^URl9WqZE$0vs7{~z!usB3R^u)`6t@(3Btuy@+&`rwwTmB!J3>B!P*$S4N4h(Y}Iv=`j830O!j zwnaDW@z6Q6aC?d(9}L3|eR6;P@YDP{3|lwv&U5uAs_-i9x6HbrWOk33a)}(ld3Ow& zb^YM#re9$Nv8W}fejBMHmp0eR+ZUE^RSd)V-N*@qehI_Bg|LN4U}>p9eiv!#8d2uG zD2Re-j&D%)=z-mTp64yQI;4^!Uj7V4;{09Ps3Tb6O>Ui6iH70FQ`4JN>7oV4qn1%3 z%JeriMii-rn>is89AkCCvoJ^5pmlD8a4wT)B3}qq0PTb@1kTrMppckm`!N~=_5-D#d&mZ04ll|(~ zVtgRhyegnv_+{5W$l$obO%YEMmV%auL^0I7Jy4JD4lm6S=OskFo(R`Xog; za4P9>Ls6=hnKVjaz&e1)v7Jl>86RB5H?47KzdpR7Iwr#`A)68`*fjNO_Rql26QJ!n zWW^AQvA74|-e1S|24l-VCBBTZubQ0hoPuHyBS-P;^ycN@C zDsE@to%~*_yXGHYy_RxvdV54QnfA5-*{l6dt~JR(T%ucgHvZ)+EW=z&mgvM zf2rop`XB-(bS!gnQvtZWpB?ph1b^EmzC9)=&P75jOHg zWSSOB257YTi`9u@fr_H21@LIZR3K43<7Wk|r6dLmQa8*Y{5h1F>RfVFz#trx%BFA) z{GL@Z**}3oSD(tsy2wyLPyg@htBI>V5ilBrj(hY4ri`ZgOPHa6Y@v#a3vNhncspKX zXtDTN%6efW-0fhZN{C|Gu4bmOsTkEKVIf>qmop)uFWPVwBR9@;|9rUaE(j7pDnS+l zxTN@1_e-OQO`=&NR@h>a;p5Xe4sSOmj@n*D+;pOJ95p|7g=t<}sBIPl?e_x{`j7cE z9Wkxl2c`n#S8xioEZPjm*DTx`Ud|t%5TlIjm_r?2V6nX=xNo>E|<@lb^ux(t-X3s^NLKt?NJ#yIvIFkQjC@Gl;tT-_Oi7~(i$Ez2$_2{%WK@r zxlNZuJ1aLCzx+8C_#3)kW@0KeY=yTTT;h(McI>8EI}O@sb&}nmB6g7szjvdM7W%Z2 z*x5~qFwAMx<(d|_WL~t;q&C`XjrRUuPPl9tf^7%}y7YEBpfE%*b@~e(kR76wI{gbh zQ2oE8R(cdYkc;piFJvb558U#H_#epSALjx90?7W21L^4Khyswf3M_!9wQ-$ZrSt% z#(yb~WYfnPfwYAGKX&uqh_!S?rhhAHOqXQ>3IJo$!lfl0R9(+ CJgK?> delta 13648 zcmZ9zV{j%+)UKQ4iEZ1qHL-0wnP4(;CVpbuwr$(CZQIU%&)%obS7%ps^{-y5R{vSm z_v-7e+62E|1CQl^QJByD`xg`h#4}D18yGKacR-9BbVK*_ORIas7p+8rBX7KYW1$?6 zM!~5PIeV~_lQ>uX;RcHxAo<(MhB@7WzB6gk_I(2l6EWiGeFObk0aqbVh&a;7VNRn|=S$-KHPJ z%+Z)?`qUlbkhgcPb=gUyT2rW+Z86JUB=}XWQ%eJmm<`}VM=;aC5qp6S$l~TR=9`&d zaZ#B~C4QGc7)^;YLaj~7AK_Jb04AIYfW7^WysP;(!h2xe-n04X;W^+dpS`MzjVo={ zuj4uU1EFiFYv=kx8)Nl+cXPe5j!wXh-KT8+5FN5gdZQu}mrMEz8AB|WRo z@=?4-BIXn3C_juzmuI4#LJ(Yu&@rpvpc?BBoRTa6932D%1R5knVP7bX2(Ys(m9PX# z2efrzDZE1E;A#-dKL)dNi_Ox1Y;qbVHz8M&p$T4wOl5d2%D4e5^LGve_ z-GnY{q422EydwzD{H;?vY)L(bg0G{oq6uL~!-bh$W!2{a!w5@xMQtbB_|RR1&DRYW z(nEzN=#Q!ke`9Xc-DLe9YxZRm!PN5m4fJ;p_B7s9kYJ~U$Vt3Pv4!;8#l}_2?HaI( z--o;CqkTE?CrOKwc{jzIW?#WyW2iNxoxuj_O6qQhW|mIj~S!b@1SwJBeU<@5ARw_YaL zU!TlNTn*fSYDCzONT8G+90-U8Wx_2A9&nQr)n}*t3#r__B?zyORt9#^n9qi$j$#C( zN0}{AJVR6=4nO9|uxE;goag;e-aIE5kUJN3U4w-G>+9ZS4d1)$J@0yb0S7p3A*s%H zgX!{d=lp!lDllOoIiS@XQGd36?(C|I&|v8E{nF#Jo(aFiJzu*QT5K7TaP;Zy3S^6} zNH{n!_EBY+*mG|w*E#RJemCct-}yectH1nJqd9ZD<)|M0q`tLya8+kCIr+TcT+-mO zlYLp@)?9hw&E>puAm%u)Z@BVc{o|B-`h&PbV19ahVZIct8$IH^6brA1vBpLBq{|E7aGxN*x(A=jjquOv&`IF#|(qDaNs=}BUz>u-!m}0)QEkCeS z5O%Hhm8s_4dEm`2FMgP5+jC7plrH($yUs_~U0w5Dzmt{*aw`DFueI>^n4gE6M;BHJ>-7L5SN$_1Lyuy(ho%urK4G<3zRF|pWmP;1+nFCGsU zc-@J|wCuf8wJ|hNUdWk#AS*4qrCQ)ub}=jo!1B!f+EzXB0>hb7YdVB^um;=Rii|jK z*W)@ccXwfNtpM;*Ji}vow~?TApI!_RssCDjsBhCsagg(Y{rhRW{=?FKfW0bW#}66_{Ok+Hu_L z>iCw8{AQFbu*HcfH;iLxrGEbYujZcxO-6l|Ce~niS@=dB>{fauzjs#+*1?qPtO@J- zMfs-+#?j})Y~nyvhR9O0)0Q6a*}O}At=gE6*GFGjsH3&4W~60FYR-bMSliDTGgmUs-h_R+1UuVFay^5oW_KPd3?PZVRq*jZG+S==xwXQw*DI;84Jspz%6 z^J@9v-+^HhT)!XQ^h)4pc5-V-uj?!$zriIKJxwh`3i!4Dg`j1&ON2F0LjR(>`yo?w z(|bOF%AX;7Ox~xrl&lqbzq|^Jad;y*ay}aCsb#z=!cbb4BWRBS^&1Jshg@h$q5LOm ze&pz?Tt;15BY*H=Cgp?7LRYS^*dS}^@cnC=`G=|DU}|hy53QO8_fz?K;Oj&*fss$9 z+SL7b`uX$9^+3e&Lxmzx|7-7lYsJZ7_{WRLZf2)vEfZ+{ciOke{17!#HT8;DxCHXH49mJxvLSIFpQX0#SI!i=hOi zSBIU4*s46%yVg2aXg?UDn=CG8S~W^hI992mWXG>r2OT>sjZ?cAH^wi@?%#Njix{}j zwoa9OQ$?J4hbY64W|Al5Rj9=2uu3MMmkU16dcyEu=mYXfeXYbv>~MpgklL6LVB{i< z*9f0_8q6Subr|SaYGV#Tx9g!cD=e&6F(~lNlSGeYUzA?PFQji{Tok}rM0k}4zAlwR zj0!^}GmxahUW>A>29;M&<>B1#AW1cZ)|k1+X`+YM=h#U|Rs=T-lw*v5w@&mg#hML} z-<1#=%orU+V-M>@)ahfrrjI1ipbmDiWg{SO^mo}bu>&?LNFkC1F=z#&n84xiCr5o! z1$-y4z=k2;;gEfbAWgI4vAEXjrQ@G7(4|Vx7N`Bz=uJ|QTE>;hVq<_$%s~4L<3A}xMUmMpjBbUs5AT3K@6|?OcFjyM z5c-HUN(MgvYzNit3a&gIZCA@$d#&C4U1UdI4VD=0S$yWXvKvOnzDaH62|1F47Oy|8wj>! zyX;fG4`frFZ0utZJPt>ts&}14cu?Y-JEN+1BH!ADrJ(!@#4xE37XBa?iT0bLfO!); zl$EIm`J&P`u7jdta`EStQpSRO1Ecy*#PQvZRFOHPj#lBRgw@hCKU`}TYB=(T?EoVY zTmhyR`JQL-L*`-VAO+dnL!iHrMv&6>hBQR}F#|0BB*X`)&uQwFpnx^eXiSX z4VUZi^n%Tgdf22pdH^&EL=_eJuC{-x4eD3jV!U}UO(F~VKcGzc zfW!5GjMP0TT4Nqq1B}8Oy14ARD%7|I?wk_k9bu)~ygT5C2idd8-awfL(jtKqy37~R zlA+BU(@4_V!YT&dzLtR}0@|4&N`amr`mSd|;o8429BMS#Q~n#FmMp7Cj&9BapMa1W z(5Z~ct4$gEM;ucdT52U*byFH<6nN|+Tn8(?`%p+9KF&H@9ao@=k7KENr6f*I7G!RP z;%bsy=_JG#Zc`qJ9jkMfIZcW_8;#lsGbONF0FF_PvyP#ZoRldOGP14=E*|HYt1NC) z2lmF9#f7~N2KI<5Jdc@`NG)qoz>P$nn^k>#iY__FsD*x77-tQjk@I`h02WT7L&Q%_ zL?ZftASRZOl~D@~D+w!|if>D4kHucaf|Dq38uwmcm|O5Ji6_f4!mis2E+bw!17_y3 zr62qiVwAlW62WkI0I9a)a_FYYiqkZp`GhnGFQ{4y3DEUI*+nom^hi?va$3B5peWM6 z)hejeAZDirSW*BJR#Z`Yz*3c^X~(P&u*yWRO6Su_Va283Y2TdrHdTvS*G>dA6_AW` zAt(yMD@W(T_~1xbvk2+(MBl|=W%LQ0T~qFYeQD4M9EFe%WsokMY^+VIT9xxK(t}<{ zHC}Pik*b&?PG{FiwDG9KbdC}k@L8p!d=*f8A*h!0M@X+etzvY3U<2DS`4H-ULY+|+ z)LpOJnUs^1opZdzE9hLj0)OX{(u%S>19m*`os=(Nxmiy39!*G8@>&f}+ZWJYmdg1Y z8jP>It*`QHawGXV6*|1vQA5>zVs5N#DKR4fQhD+`@(@wT?mtPe3#w6@*0KO|W{N+1 zW~qRs0|K?I>JDcIB&2sQ%LhZ7#N?r(K|fb+o0|I`k+?~fT&=;iyCV{4U=;a^Kvx1Pb1i@P(YfO4Kw^U;|4Ph07R=#RQM5?XnP0MK*O8kbOS53FE|hPx^;(* zS@Vx;%IDr_*Mg6?^W^HYl#pj*Zx@GL>$9}607j4DyNwi|^xIbhfsBMW11ej)M#Ges z8|w1swT_50)aG@=!<^~vE&hiSG>)w!&aa`z(lTB;&5Esskcya3=Vdu2h*vSr`5p*? zzw6&^@6^xUHYOXAKgHcwIgWx1$r3leia|RRahrZx?Gi#b-FGAu|G6G4dS?hWo_%mS zSr&|_XC&aYOW$O)f62{2Am*rkxU8^m73*~Jvu95ea$F_Wc2NVDrZb-MNquJ-9&XFK zu+OYk3im#sjDP)L#o{&;6G%Y-)P6!}Kz!iY&s!#x8$%x{ajEQM4+PKa|WLe{W(_fl5s7 z*V*n)PTtAK4lkNHy9JPzi!cA8=}7(qOz){Z*`!;GC#sVpT)i*)E!3S1Eb_c@&+#Pe z`57=GpL~J~ryW=6sAneg zDVfTuI-#|N(>f|Csk<2hp_rZ?%4fXv$bYOH)na$`x9U;%IGThtJaEZ69jlmhkQ8I? z(^n~i#ciRpx11+EA~&xuRLOgI^4=!{Z>fBENgjwUuw=GrVLMa4?<3m)hfz`C$iY0L z@#}OF4HK`MC4H!#RWwgGjiKLCtL=8g>zm0h-IMWKy}Ob9NFda}dZbBDJ-;dFIU@0X zXCmZo?b2hxxhX)FVr@3wo;VF#-HdLjZAE&9>$(~mn?328CgD`ZN3`dL$nD1SICbpe zU+6;{@#_eSVl<3@FO5#~O_L3=^%JSu3w51EW#$6JG0#jd_sS$}S*7c9CDx9I@HKa7 zCy4Oy?C@es!MSEYR#dzvjuy^-%{8L8R;gKFwPZX-HyykUp5@;I$n+RTDdKLB+iFH0 z_P`&BF+(hj`x$dvYI=LXw~yfFwapzzeBT1ey?IJyUtlFuoPLmTH{d%LKiSXJIs5$b zls^J+{^UwzPt+QEFYM-mCs=~AZ6+vng`lkn6AWQcClCm{Sup!tWe7F~`#na)3pY4$ zgCS`BRUd|UKxahByiNh48Q22)L3sPHl@8*>YNv8~p4d=dSoT_liw^3-2q#eAt1l4p z>r{ZEj7L-$#PS%k9?h)Co^375^bjd)h(kE8@^0Dmc(PiT%$BM$4$+J6t%(Ekc%o+=@r|2rz-f(Kyy+S-;r9nz;gx;*L ziq?1bLn7s95`l&5?ONZ&mfPhd7|<)^?kd)7;WQblg2?(s)B4j=fB7@*o~Q|bD5xoyoZtfs)z{?uwyIbAQp0U2xJ=(CWzL^MP4gl{ zF5~9n)$zj7mVJR-{DtLGaL^a^Ze5h6u;{R{lSVaX6>O2sO4Bz@qP}yOr=r?*5RES4 zi`JrM%KNO@F-3;S7gR>$HD|G8GL3MaDKLz)Fn+C!Fy(Gt8qOl7KH@oFIP3#rpX$K- z1;eNhUAbTu90{#q!qBb!Vk{z9ZzdTM_ubA?YkzX;?dG1y7>BQEC)&yQh+n4-H{*q@ z$83|?tCtBieSev_xEk#Tbw|bbVzmw;LoN_~)tiC6-KYmEP|;~Ct$jD#9bkfX*=om# zDV`wD5KR^3E)2yZ#qoFU<7fobI%~keqvRtqSlGkQE9fdoI)Wm(l7fQM9aLvyklCm+vCd0P`TQ1 zz&RVBesh_c7TLo|*<2A?`K-C|mcZ;xJ19xgKD!};tfv3t}so+X@*>Q{hmciQt6(>gQ9+2d3c}1Np zsc(AwQs?8Z`QvLii zZ-Z~XA5SW<^c}{^gS<_yq66rbcz5|2dUM{MKi~|YzP1kU!9QpGK#GRu{R+j_(MT(( z3F=AjJ+GeS?ixi(YUwJ&gcXj4&B8Lrvr@cfBkLyBEdS|3up1W#)dAtp$^VOOr~(c3<3qz;J@0m8&!KxC{VDX zVEM>sMUZ8Mm)cCy)PYS@h+?(eOt-X{q{&mS?ftSV{D|*^B`0TlLXo2Y1U z{f842o=+}@)gs&1qdqR)Cp+~ajut_c;hr6Zq2+1ORM(8Hhk<+z7a|_w%&XNL%|i9b z-OhA8o*Dg2Ux#sZpRDdD0WAC~BWcT@_mzOqq$+_`%@Ux_zsXD%nPF-tz{vB4An*;n zUegMNnvwLyG)#$lEZ1%Z)cwnA!0kP?UeUTkw600Aaa+m6R#f$U{3v_!!nxOgDq@59 z_g#MGO3H7)FyOnqv{B^DJSa1x;!DtgKctkGC%g9p0tahYpLl`G1$V9FQyqc_FikI& z1{A6iywQ<8gx9I)e%fwdOunVDx zj0P&`WA}P+{a~@ewiN+tZ+fWea1eVF20m499@qLkCLuBQOp>02{~7Q8l*TRpDZ}_+ z3yxYk3<=k;sAV7kaUtbkr_ROO3RWNCpknwFb8-}CZ>rI-N@)S+hJ0uRPTlCI z-wBICU9}oIK-~Jt@r2Piv&WBp{)7iiED*aUP^(D9{)N z!!cT}LzH;l0e<(ZPsMh3U|%T*Jy3#ZmQ^aAV{fLj_^!|3567b0>Cn8Fsm#{S4(V8V}nkQ_U zDYxOD;K=a0au84(-jce}Elr#NPgq3Zue$>Ik@e_>*5Oja)9YZsi-HH!pk|-^tPgTJwPXi)SmsB^X4Yc z#b9*QoySdn=z#dtBk4-f^r@3}i#UvvHQp@OyG)Y1NW%DiAqm@{x1UUxuR@Leco{oykJc9uQ3>8fso9Y-HW{|p;)wY+_( zfl^L~%!rA@4gTfRO9PkSD_3451tPdW4|B!CfCfw`pfEb1aBHf=7=Ud8Isw`i~i2Ii)2^W7k3`MnE=0$;^hGqYqJwEq&ioq^Qjd^p1zb85&04vINFE+_sF#(az(R!Gezl0EUc@ zn|U;0XLWo^b;*Q#-vY`75G^28)@DEP>zaC8gG&U0{d151;Opxv z*}fJ4x2~yuu!G)u#a~06z#g1gf=Lv6Jjt%dN8;3iRj}@Y!F8tFAb>|QidnXc){z(; zx%GVX!{uemK3%ZZu1J_ADSCaEUWs@RvF6(!thVEG25&2pFUM#VY{J5=Yf`G;y`E2V zn#RoS_~5~wei=eP`5mY(llDyqE(CT$S$7IVa*)pr0pAwrcPxEri{mfY}%eNTFsyz`r=CaWj6)V8> zKq7p%$*S+Wa=>AY2jZRgkiS_1P7=7sno0N&H^9C-?8coO3Y7BJn``+yhhlN2(ORSn zmh(%~s!FT?*gdGC%=B%VLvAg}<9+TY=&|tnv9&1ECclRo#U>$%D^3MXg#cb*>4`eLaq?d|(YFV4L^ZPCvp)m=yao)AAlbXkht)Pm4- z*NvjpR@VL%7tKNd0ee_N&N`-|kXpvF|EN$)^xZTs2+ zEBldNnwO}RG5?#&Ph7Z7EF6LZ`p1{fwxQHSGwgCw;XqB=xff#%M->T6a=}3*EwL;F zYCU=&I&*B5nVVgu4r?qG2PbtkQ|9k5{;AG{Nhsc90`X(8@U`LDkT3SU2cB;04?*|H z+-nvj5c_-yH|toi;4VCZ(v&hc>JiRHUzD;LNqcphE>s|N!_|2vlBZS7D)9IBOn_@z z6K5l@sosS7(Z_BeJT?*~8Xg|R;?_L&puY?vcWGg;R&f*;{(t-vZ3?5 zxQ;Yjc)jm2I;bx;@xZme(FCuK-)Sio!!e3cIl&~mgMRr2vHeBjYP~bYQz)gOXs#N> z&;9pTGE%mjB4RpHd^Ia|9_N{LEFLXv!p$iN-`PVi?#WF>#2r79}F>C~ODcWw{tp z7r}QU2@-?D0go6{RTKt^d+A3&S0s?Xg~WAK6peDGs)oH6u;rzN(P=A2xtt>$fS}`4 zgejb<`EMEybxNVVaS@w?qSjHnn+^KfVlMYAJRGtKBsBLevz04C*n5?o+HQnsKxb#U5|k3NS2_>a38P-TSGIm z=+dQh8$~!xC(5RYrvjm&cw{maSyD-3SJwh{`mgVo3SAUzbC7+&VnC1WV)i) zH3jogapnwLzOUF=IuQjANdq)3kBUyBXf9*7H}(QQGWZA?U4Vi=V?C&xQjEvc98#wu zP6*KrL~q%F8_|7xS@MFblD5Y^=_d%GV=t`ODNs!Yqx zWF0aH{R}jpa5H#`u}cQ&d(rA&tc z=~0NbBg!O)GJ(_F{R+DLrSr{6`)_r)2E<5AFEs2&RUc{J{umuwSW}Ay7&pxT09QwX zCg3kO{v#Skw(yOUs^UV9ExDnPXd++PmG~*O3{QmMQ-xr|zO&x}VFUg__&sgXts7hU zEyQC?&Es5*(dMfa!alGf9oxcf>Kt4{8iPjdqckB5(gFma_(v$<;kTM?-m)M(?4qM4 z5C3=XyUna$2pht6($nGxmRz6lQ+RoSJ#K#InOhci@H8@F%UsOF>2SDw{(lo+_XoAe z*Iwt~JB<(C;(5&w8KT@_OAq5=w@%R3${qIsnojh1GIQ3y8mPd%+%G&^1O|nm`p}&s z%fN?jH*QL<$GZ);cHY0spnz!Uj;y+c^3Cl6^;3vah6P5U3EXFDN5jMd>E^~+0yrPz zRy}z_ocxVwCLARBlLw=%*l)9CH^Ja{dUX#Hx0&q>)ONXfYJF3$7 zv-dIC^>_{^wkUaGHMVatptoj@msFLY={2ATs}p0uRRTD*En9KHQ(6*QuhHd-cImeF z0BVQ1O%nwacMW)y6aYKz2j#>?(xh27!>$KN%Mf`pHvlhor>bEq#Zm}|lqlEJO6A~9 zMABi-n5YYBj??SN*|>vi$DkVE&cw`kv!fv>|3JYy=ddxzBx2bdVmNb zQc|-kFax(cXMar@>5dLAZ&`%!(@pWy23IunF6!Ua(k_Y3*EC1Hp!s(14jl+lvET_u z*PORVJ{`H2(gQSty59|A1RxF}O9C^a4|LM`>AtNIy-7T;1fO?Jkjh!n@w*#}@kwV8h)goT0zB0@3EtP!$N`{ky{H!&ZWj7wK>n6=EosuZxM~ zlYr9TBUZT3?0E4|yk^p>hs)!m7F})*yS>SiF zDS)t42};-KsO@jvwZXp}O7_hsa`aKi{Kxf?AzNh~15-xH7hMf0b%N!RF<++9M?`~W*pn5Gm1$r8H32>lddEs_)4P_wv2oA&{b=7bY%hDw)m?kkaH!huf=k{SQXQqO&MITDIF$(uGo06xUFuN{Ce#XDRbuniWpiP8diu z9lJFvL=ixAE}z@Z_DS6&VE4Hnxz8jrKZISQnRi*e{f`2Gv%h9_3zl~sC7tUkvlSZ; zl|?S}5|nT7mpRR^J2p#gELZW*Ca1j7KOQ(SL(u+~KfM9!<<&6ZW;7h~Z@luxRppH= z!~Rs^>GwFcTy$wyqM_?)GjHdX8YIBxi%3Zlqb}cyI2Sx~?KsY-Un_vLCJ@ISl1~@9 zWEY;xz|d>@2Gnh^Mz2fC#s$*h%aIW~)VrMc8OcW~r`UBw&L?sScj1+c-!+yru1aY| zdSA8dB_`J{n1v4%0nXX{tih7KDcRj`kehj0M}F<=Y(7rs(j(xzi^s*?kF&r|hikxV zY;TcSv@R0J6l>GhsM|M6CWpH8 zGkF!Q%vm0y0y6T(K|$Hdum1!-L?x#;MMJ`Hy_I~?36Le(uwV0iGO?SbAZDh|I1z9X zp|!H)HCqUQ*r9ErY~ENN2LQeuF){U){N?Wo`ko89n5{*@CMNAYXE?a#%;bO==q&fI zLf|_8m)-yJxGnZcvivpKGTRwS7Bp}abICZ=B*QW?jlX+|>utX}0)@}6#C&E88c5AR zomQor*kuO4RvFra}z)4cF(&R{=7rx=_$lRWg zCX@9l=y(UawnM{W{<%uh`Qq>+o%b5J@@GoL`CW^S{~^ty{n7D>h| zO%-y`F;;E8NluJ0;fu%7L_zNiPW-%)Tl>;+;bVvr(ewU&6UY;sakj)7!o-kDT<_z& zu57H7^lxa<#46P#2xbAE`+o;5++8(t@V_PdpuFcjD)Wl!z$%7~W75y?E^C9!dX_XM zxN-1;Lsj{{-`jwPUoRG3@WM9dOCj9+w|cYTHKkaao^UVZhKj;$cwgJlgBHfV7&NfT zlxXJH+{e)${@2_GcYNHjy*iW=4L(rk9(RZJwQUm|T$j@uIX2&F(z6bvgj|28kei=L z>go~+4RWWBb4B}XOieZ(R*_#NuCc7y!Kr#PleSlu%U^)ppqZRrScQ9jT*=ANw24?# z$u05I)SDQ`j&!6}y4EW5nA`9ruM`%8U%!nM3!6uBoipj83d?D7Z>zOf(=JZd^{@O^ z_9q~rpt@?@vyK9g1-TcI)xZtV5Q!WrQ-^BZ=ye;)*U%S47jvnbKgt(I8R*Sgm(v$T z!QN;?Sh#=#ZZ#=095^>sdSqjiI;qnKELkHq7GdrZ66J`q3ESxcjP}rS6T;?@JvuH| z{7^pBQsU9PdDm*J-x=L^Y>7pzl;7n&z};2E;Sp>ir%R!rHwwUT*3^G*lxQ>{6c|?C zNx4QrIJWTL$8-2@hPC?23@-yEk%Ww46!C45wIerui$(mfkc zo)BxcQiwwL-j$_@zeEw7`JhSIa|;*7u?ipX?$KrG&%_i1ftq{0zkg}xBea^ z$&m0rv6T!px&pAo&C!Qnn}E}j-lWL`z$Gb1X-0bv8_Z@a=fS#6ouONDT0$h~I5 zUIfb9(68cvbp^8rIdc1!D0mT|>jgfzPpvtmYeH~cJm<2w1*KFkIkbY7#H8uf6D#F!b;!xKRJykq`~x&cOr$)PkuhN^2VOSC1#Hv@L~JfXJ-=7Q zE-J5r@gpL1;q$lZ$!v$D@gl;?mq|~GoSRk^aFRZC^B!Ld@o;(1OtE9ZA~E}p%<7iywpsW^e^`@nIN-xMVicelnR|prjGrv zAxuO6x*H1Fait|6RCNvO)4GliAX8X4t&Vvuugy3$d&T6hMm8Bztojh3U%I$#oBjI? z7pl!aD+YKd&cx;9=mm@Z6>t&{VeCaCNU<L46^OBQ`lj zBj#0v1ctEs-7%bZ9Ha2qSJ*mUJs~PQT&Mr;8Ro#A>yGw)$TV5Ygd+$Xy-N9M%3xcArJIOxw;z;%iT?j*0y`vGfDjPJ{H2t!>TpOm(k?)H4QFXj@rGl)yp|EF z;0WU1<)w-$+!z2zC6JAQJM_xd?H6nW*}3i@l@Pk<264QJ z$KNYr74TgF7q5S8Z2_qS;JV|<= zC{efrf_GR^S;X}ZW)c%kX$dUHZdq7U0Ohin$D#UGQXVENF=yxhoJFs#m<^BD7RE+6 zKL`sR(#jR40*#Zl!g05Uf84K)y7+YTF?Cqx5sXY>Uhp)X;z3{*Q`6-C2>*cnS<8z2 zCHfnq5s6$M`svJ#wmB<1;!GB9b=K3J^UVhTy01W#RU`w&;(EmOt}Y|CKckJUuK5pd z@BT3xTsPxai~H9X!u$LWUN*j6;qxQm~ z)bmB{EYS9&SrcTgxbZ^)-*z~o!(4kHhDxz{cO+Xd%4<@_6n&O<)IdvBcS5;S@_Zm< zAt~r^cO^WuVm>(EUKU%w-3`q^5539AuA`G2I;$C*{4xK3$d4nn}p02=j{&0Osj8sK?N^YEX zEU`94L?S`APJB5CrbNI;8*Z)h>2w4skz2ORNuY5Pm1FxJ;tI zr$yS-2=kGq)hDnvIdo19mZErwa5M6^;^CQE?Uv**+Js(6QNRfsBRS!3->rG1tpQZ- z-#oji!ncX6`I#wZXPubvP7TB(der*^=}wsl`slqjL{CaYLAO}FC9_Y?#m>=1q(e(0 zW&^5|mafX;MPoM0Cyi1k>Ywi*^VhZCBJFZL=W#TMht%mwt(ybkfA|tD>TWF?|jgZ z-ISs6di(|g8F-pxkdlH#OCL-iJ5H$VcT-8kuP=#(z zeZ%?M_}--$f*`vE(4i>3Eu-5jSLJh-D7NYchJUrsezFBj0@-+z8-q~7XflS0eDSIn z=d=X5{=vll+oJGiUZ16K#^^pn<;|^OOj-5QzJ`Y6wj>DtV4a9Znug=ez^ba8)q7>q zx(fzQf;&uSw-7u0dCa>gtt#rWC|E^d!F_T-l~5PfUSMun7&)4$=>d9uJRAWM7ZBO$ z+30bnrd*w3+Uj&yP1@IOpd*8GLG8%oeWU>TssiqZ+&)xtO+aPgd z&G0o`xB?RA+WvHA|6t*Qg}JcoeV)n0s`EL5HUf>Pf=v>5D*Hu`s5Qx_VE)s~E)Yn| zOid{DQdo&JeP({LH69vE>$p}5Lfw$7MQ@wTo-x#iD@2y^Z{4*FJNcv~ega5U1t!4x zEz^G}*oq9{4%h`{$_owXFECN^6mD8jR>Cv*O>n2z+dr{7WAuu`xXL6IRNssFnP$o~R${Xswg diff --git a/src/com/demo/tank/course8/Bullet.java b/src/com/demo/tank/course8/Bullet.java new file mode 100644 index 0000000..70372ca --- /dev/null +++ b/src/com/demo/tank/course8/Bullet.java @@ -0,0 +1,132 @@ +package com.demo.tank.course8; + +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; +import com.demo.tank.util.ResourceManager; + +import java.awt.*; + +public class Bullet { + private int x, y; + private Direction direction; + private static final int SPEED = 10; + public static final int WIDTH = ResourceManager.bulletD.getWidth(); + public static final int HEIGHT = ResourceManager.bulletD.getHeight(); + private boolean live = true; + private Group group = Group.BAD; + private GameModel gm; + Rectangle rect = new Rectangle(); + + public Bullet(int x, int y, Direction direction, Group group, GameModel gm) { + this.x = x; + this.y = y; + this.direction = direction; + this.group = group; + this.gm = gm; + + rect.x = this.x; + rect.y = this.y; + rect.width = Bullet.WIDTH; + rect.height = Bullet.HEIGHT; + gm.bullets.add(this); + } + + public void paint(Graphics g){ + if(!live){ + gm.bullets.remove(this); + } + switch (direction){ + case UP: + g.drawImage(ResourceManager.bulletU, x, y, null); + break; + case DOWN: + g.drawImage(ResourceManager.bulletD, x, y, null); + break; + case LEFT: + g.drawImage(ResourceManager.bulletL, x, y, null); + break; + case RIGHT: + g.drawImage(ResourceManager.bulletR, x, y, null); + break; + } + move(); + } + + private void move() { + switch (direction){ + case UP: y -= SPEED; + break; + case DOWN: y += SPEED; + break; + case LEFT: x -= SPEED; + break; + case RIGHT: x += SPEED; + break; + default: + break; + } + if(x < 0 || y < 0 || x > TankFrameV8.GAME_WIDTH || y > TankFrameV8.GAME_HEIGHT){ + live = false; + } + rect.x = this.x; + rect.y = this.y; + } + + //检测是否跟坦克碰撞 + public void collideWith(Tank tank){ + //关闭队友伤害 + if(this.group == tank.getGroup()) return; + if(rect.intersects(tank.rect)){ + tank.die(); + this.die(); + //爆炸 + int ex = tank.getX() + Tank.WIDTH/2 - Explode.WIDTH/2; + int ey = tank.getY() + Tank.HEIGHT/2 - Explode.HEIGHT/2; + gm.explodes.add(new Explode(ex, ey , gm)); + } + } + + private void die() { + this.live = false; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public Direction getDirection() { + return direction; + } + + public void setDirection(Direction direction) { + this.direction = direction; + } + + public boolean isLive() { + return live; + } + + public void setLive(boolean live) { + this.live = live; + } + + public Group getGroup() { + return group; + } + + public void setGroup(Group group) { + this.group = group; + } +} diff --git a/src/com/demo/tank/course8/DefaultFireStrategy.java b/src/com/demo/tank/course8/DefaultFireStrategy.java new file mode 100644 index 0000000..1ed8fab --- /dev/null +++ b/src/com/demo/tank/course8/DefaultFireStrategy.java @@ -0,0 +1,14 @@ +package com.demo.tank.course8; + +import com.demo.tank.enums.Group; +import com.demo.tank.util.Audio; + +public class DefaultFireStrategy implements FireStrategy { + @Override + public void fire(Tank tank) { + int bx = tank.getX() + Tank.WIDTH/2 - Bullet.WIDTH/2; + int by = tank.getY() + Tank.HEIGHT/2 - Bullet.HEIGHT/2; + new Bullet(bx, by, tank.getDir(), tank.getGroup(),tank.getGm()); + if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start(); + } +} diff --git a/src/com/demo/tank/course8/Explode.java b/src/com/demo/tank/course8/Explode.java new file mode 100644 index 0000000..e662896 --- /dev/null +++ b/src/com/demo/tank/course8/Explode.java @@ -0,0 +1,47 @@ +package com.demo.tank.course8; + +import com.demo.tank.util.Audio; +import com.demo.tank.util.ResourceManager; + +import java.awt.*; + +public class Explode { + private int x, y; + public static final int WIDTH = ResourceManager.explodes[0].getWidth(); + public static final int HEIGHT = ResourceManager.explodes[0].getHeight(); + private GameModel gm; + + private int step = 0; + + public Explode(int x, int y, GameModel gm) { + this.x = x; + this.y = y; + this.gm = gm; + new Thread(() -> new Audio("audio/explode.wav").play()).start(); + } + + public void paint(Graphics g){ + g.drawImage(ResourceManager.explodes[step++], x, y, null); + if(step >= ResourceManager.explodes.length){ + //播放完爆炸效果图片, remove + gm.explodes.remove(this); + } + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + +} diff --git a/src/com/demo/tank/course8/FireStrategy.java b/src/com/demo/tank/course8/FireStrategy.java new file mode 100644 index 0000000..cf97e75 --- /dev/null +++ b/src/com/demo/tank/course8/FireStrategy.java @@ -0,0 +1,5 @@ +package com.demo.tank.course8; + +public interface FireStrategy { + void fire(Tank tank); +} diff --git a/src/com/demo/tank/course8/FourDirectionFireStrategy.java b/src/com/demo/tank/course8/FourDirectionFireStrategy.java new file mode 100644 index 0000000..182ece2 --- /dev/null +++ b/src/com/demo/tank/course8/FourDirectionFireStrategy.java @@ -0,0 +1,17 @@ +package com.demo.tank.course8; + +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; +import com.demo.tank.util.Audio; + +public class FourDirectionFireStrategy implements FireStrategy { + @Override + public void fire(Tank tank) { + int bx = tank.getX() + Tank.WIDTH/2 - Bullet.WIDTH/2; + int by = tank.getY() + Tank.HEIGHT/2 - Bullet.HEIGHT/2; + for(Direction direction : Direction.values()){ + new Bullet(bx, by, direction, tank.getGroup(),tank.getGm()); + } + if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start(); + } +} diff --git a/src/com/demo/tank/course8/GameModel.java b/src/com/demo/tank/course8/GameModel.java new file mode 100644 index 0000000..70b3380 --- /dev/null +++ b/src/com/demo/tank/course8/GameModel.java @@ -0,0 +1,66 @@ +package com.demo.tank.course8; + +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; +import com.demo.tank.util.PropertyManager; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +public class GameModel { + Tank tank = new Tank(380, 660, Direction.UP, Group.GOOD,this); + // Bullet bullet = new Bullet(520, 440, Direction.UP); + List bullets = new ArrayList(); + List enemyTanks = new ArrayList<>(); + + List explodes = new ArrayList<>(); + + public GameModel(){ + int enemyTankNum = PropertyManager.getInt("enemy.tank.number"); + for(int i = 0; i < enemyTankNum; i++){ + enemyTanks.add(new Tank(50 + i*80, 200, Direction.DOWN, Group.BAD, this)); + } + } + + public void paint(Graphics g){ + //打印出子弹数量 + Color color = g.getColor(); + g.setColor(Color.WHITE); + g.drawString("当前子弹数量:" + bullets.size(), 60, 50); + g.drawString("当前敌人数量:" + enemyTanks.size(), 60, 80); + g.drawString("当前爆炸数量:" + explodes.size(), 60, 100); + g.setColor(color); + + tank.paint(g); + + for(int i = 0; i< enemyTanks.size(); i++){ + enemyTanks.get(i).paint(g); + } + + for (int i = 0; i< bullets.size(); i++){ + bullets.get(i).paint(g); + } + + //碰撞检测 + for(int i = 0; i< bullets.size(); i++){ + for(int j=0; j< enemyTanks.size(); j++){ + bullets.get(i).collideWith(enemyTanks.get(j)); + } + } + + for (int i = 0; i< explodes.size(); i++){ + explodes.get(i).paint(g); + } +// for(Iterator it = bullets.iterator(); it.hasNext();){ +// Bullet b = it.next(); +// if(!b.isLive()){ +// it.remove(); +// } +// } +// +// for (Bullet b : bullets){ +// b.paint(g); +// } + } +} diff --git a/src/com/demo/tank/course8/MainV8.java b/src/com/demo/tank/course8/MainV8.java new file mode 100644 index 0000000..e08a2f4 --- /dev/null +++ b/src/com/demo/tank/course8/MainV8.java @@ -0,0 +1,20 @@ +package com.demo.tank.course8; + +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; +import com.demo.tank.util.PropertyManager; + +import java.io.IOException; + +public class MainV8 { + public static void main(String[] args) throws InterruptedException, IOException { + TankFrameV8 tf = new TankFrameV8(); + +// new Thread(() -> new Audio("audio/war1.wav").loop()).start(); + + while (true){ + Thread.sleep(50); + tf.repaint(); + } + } +} diff --git a/src/com/demo/tank/course8/Tank.java b/src/com/demo/tank/course8/Tank.java new file mode 100644 index 0000000..30d0533 --- /dev/null +++ b/src/com/demo/tank/course8/Tank.java @@ -0,0 +1,185 @@ +package com.demo.tank.course8; + +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; +import com.demo.tank.util.ResourceManager; + +import java.awt.*; +import java.util.Random; + +public class Tank { + private int x,y; + private Direction dir; + private static final int SPEED = 8; + private boolean moving = true; + private boolean living = true; + private Group group = Group.BAD; + GameModel gm = null; + public static final int WIDTH = ResourceManager.tankD.getWidth(); + public static final int HEIGHT = ResourceManager.tankD.getHeight(); + private Random random = new Random(); + Rectangle rect = new Rectangle(); + FireStrategy fireStrategy; + + + public Tank(int x, int y, Direction dir, Group group, GameModel gm) { + this.x = x; + this.y = y; + this.dir = dir; + this.group = group; + this.gm = gm; + + rect.x = this.x; + rect.y = this.y; + rect.width = Tank.WIDTH; + rect.height = Tank.HEIGHT; + + if(this.group == Group.GOOD) { +// String className = PropertyManager.getString("good.tank.fire.strategy"); + try { + fireStrategy = (FireStrategy) Class.forName("com.demo.tank.course8.FourDirectionFireStrategy").newInstance(); + System.out.println(fireStrategy); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + }else if(this.group == Group.BAD) fireStrategy = new DefaultFireStrategy(); + } + + public void paint(Graphics g) { + if(!living) gm.enemyTanks.remove(this); + //根据方向绘制坦克 + switch (dir){ + case UP: + g.drawImage(this.group == Group.GOOD ? ResourceManager.tankU : ResourceManager.badTankU, x, y, null); + break; + case DOWN: + g.drawImage(this.group == Group.GOOD ? ResourceManager.tankD : ResourceManager.badTankD, x, y, null); + break; + case LEFT: + g.drawImage(this.group == Group.GOOD ? ResourceManager.tankL: ResourceManager.badTankL, x, y, null); + break; + case RIGHT: + g.drawImage(this.group == Group.GOOD ? ResourceManager.tankR : ResourceManager.badTankR, x, y, null); + break; + } + move(); + } + + public void move(){ + //如果没有移动 return + if(!moving) return; + switch (dir){ + case UP: y -= SPEED; + break; + case DOWN: y += SPEED; + break; + case LEFT: x -= SPEED; + break; + case RIGHT: x += SPEED; + break; + default: + break; + } + if(this.group == Group.BAD) { + if(random.nextInt(10) == 5){ + this.fire(); + } + if(random.nextInt(100) > 95){ + this.randomDirection(); + } + } + + //边界检测 + boundsCheck(); + + rect.x = this.x; + rect.y = this.y; + } + + private void boundsCheck() { + if(x < 0) x = 0; + if(x > TankFrameV8.GAME_WIDTH - Tank.WIDTH) x = TankFrameV8.GAME_WIDTH - Tank.WIDTH; + if(y < 30) y = 30; //算上菜单条 + if(y > TankFrameV8.GAME_HEIGHT - Tank.HEIGHT) y = TankFrameV8.GAME_HEIGHT - Tank.HEIGHT; + } + + private void randomDirection() { + this.dir = Direction.values()[random.nextInt(4)]; + } + + public void fire() { + fireStrategy.fire(this); + } + + public void die(){ + this.living = false; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public Direction getDir() { + return dir; + } + + public void setDir(Direction dir) { + this.dir = dir; + } + + public boolean isMoving() { + return moving; + } + + public void setMoving(boolean moving) { + this.moving = moving; + } + + public boolean isLiving() { + return living; + } + + public void setLiving(boolean living) { + this.living = living; + } + + public Group getGroup() { + return group; + } + + public void setGroup(Group group) { + this.group = group; + } + + public Rectangle getRect() { + return rect; + } + + public void setRect(Rectangle rect) { + this.rect = rect; + } + + public GameModel getGm() { + return gm; + } + + public void setGm(GameModel gm) { + this.gm = gm; + } +} diff --git a/src/com/demo/tank/course8/TankFrameV8.java b/src/com/demo/tank/course8/TankFrameV8.java new file mode 100644 index 0000000..6c0d73a --- /dev/null +++ b/src/com/demo/tank/course8/TankFrameV8.java @@ -0,0 +1,116 @@ +package com.demo.tank.course8; + +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; + +import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +public class TankFrameV8 extends Frame { + GameModel gm = new GameModel(); + public static final int GAME_WIDTH = 1080; + public static final int GAME_HEIGHT = 800; + Image image = null; + + public TankFrameV8(){ + setVisible(true); + setBounds(400, 100 , GAME_WIDTH, GAME_HEIGHT); + setResizable(false); + setTitle("tank war"); + this.addKeyListener(new MyKeyListener()); + this.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + } + + @Override + public void update(Graphics g) { + if(image == null){ + image = this.createImage(GAME_WIDTH, GAME_HEIGHT); + } + Graphics imgGraphic = image.getGraphics(); + Color color = g.getColor(); + imgGraphic.setColor(Color.BLACK); + imgGraphic.fillRect(0,0, GAME_WIDTH, GAME_HEIGHT); + imgGraphic.setColor(color); + paint(imgGraphic); + g.drawImage(image, 0, 0, null); + } + + @Override + public void paint(Graphics g){ + gm.paint(g); + } + + class MyKeyListener extends KeyAdapter{ + boolean bL = false; + boolean bR = false; + boolean bU = false; + boolean bD = false; + + @Override + public void keyPressed(KeyEvent e) { + switch (e.getKeyCode()){ + case KeyEvent.VK_A: + bL = true; + break; + case KeyEvent.VK_D: + bR = true; + break; + case KeyEvent.VK_W: + bU = true; + break; + case KeyEvent.VK_S: + bD = true; + break; + default: + break; + } + setTankDirection(); + } + + @Override + public void keyReleased(KeyEvent e) { + switch (e.getKeyCode()){ + case KeyEvent.VK_A: + bL = false; + break; + case KeyEvent.VK_D: + bR = false; + break; + case KeyEvent.VK_W: + bU = false; + break; + case KeyEvent.VK_S: + bD = false; + break; + case KeyEvent.VK_SPACE: + gm.tank.fire(); + break; + default: + break; + } + setTankDirection(); + } + + public void setTankDirection(){ + if(!bL && !bR && !bU && !bD){ + gm.tank.setMoving(false); + }else{ + gm.tank.setMoving(true); + if(bL) gm.tank.setDir(Direction.LEFT); + if(bR) gm.tank.setDir(Direction.RIGHT); + if(bU) gm.tank.setDir(Direction.UP); + if(bD) gm.tank.setDir(Direction.DOWN); + } + } + } +}