diff --git a/bin/com/mawersoft/projrain/Game.class b/bin/com/mawersoft/projrain/Game.class index fae64e9d8e28fe223717fb579cf516e4f4537ddb..ecf2e6f0d66204c334346c83caa3eb5b7b9a3ec1 100644 GIT binary patch delta 4163 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 GF&F@P(4e^h diff --git a/bin/com/mawersoft/projrain/entity/mob/Mob.class b/bin/com/mawersoft/projrain/entity/mob/Mob.class index 50855c6f24b0f86006dfb385533b5475332312e3..3ba0e482f4e2c53fb6b0af4c4128b608599497c6 100644 GIT binary patch delta 621 zcmey*^@f-0)W2Q(7#J9g7<@N!En*aBWMD1M$j>ifWMI?q^mNe-V`tE1WU!nlAg5nY zl%JKFT#}iSsvn+Nl~|M#02kn5&|%Q$Vc=%a=44=GFyvt{VlbY(jnRx!EEwd zMs;xu21`Z;-oz9nZHx>S8j}w)N@%6#m1LGwBHMs4+gdY>k%7^Lk%6&*k--$CTph1+ zE(TKuJ01pm28YSwOxB!E3@+>p&WsFdlRq%Z@_}6+l9`jr!{Ex`Ho1){fst+Ub0!mB z9tIW$eg;kk0R}z>p2-@_eY#={91P+Nd<+r{A`FrYq72duattyI>I||B1`KixmJA9E zP7I0+J`73>VGJshA2UbQt22l)Ffi~iFfuSOFfxcSh%+!SurO#bXfrS}@G>wk6fm$c zurV+&i0x+3iIkSn+|Hn9#j3T1!9bFA8-vM41_lNu1`!4Z20jL61_lNl1|9}o22ln* zu&E{ttRS6GQyCb<7*rWJz&437C^2v_FflL)F^Dm+GgvV&Gw?8QF<3L$FtAPzVDaHL z5M>o*+s0tKjlps9au#_>Lk1=WBL)rzV+J_}69!`jQwBE%BL;s4^U3#Fw9Q-@xEPoj zSQ)$++!;6+SQz9OG#ES>I2c$Nj2VO(JQ+9`*cdbz7#KJinEx_xFf!UQF)%WCO?F^a SlC=iA6xIKX4BlXW`2Ya91Zs8w delta 336 zcmaFE`=5*J)W2Q(7#J9g7#ucoEn?*2WME{_=3&rb(48#6WXP${V93s3z{sF9Q9yjM zJ~JDaPik3e4iAG7gYjfGW@}DU26J`>Ge!nAh&(?l4}%4R<>XT41V+}$*O*Os*%(+D zI2kw@xES~t*d~j!^y%_3a4_&Q@G%H5h%g8;h%yK>$T5g8s56K%7%+%2STaa3I59{v z_%KK@gfYlWzQhtGEYBdyz`(%6z{tSBz{nuRAkM%rc`vJvvz92UDBCs$y=@F8GZ|P} z>{?hDMOoMv{@)|JhJk^BnL&hsfkBReoq>TtiGhhhnSp~rg+Y!%mBE-njlqpUnZchy zW3msMwwVP37Xvc`D}xt<6$1wY3xgbk27@&N2LmgEF@rFJ4Fd-Q8-oS|0|O@m^IrxI fMn+pE21W+k$!pn^7Sux92Jl$J0usQcj10G8MHPOVJJPb^BYW@KP1E-1<@ zNo8cvz@;Ul|poS%})#lXxU#KXYHAk4_Xtf3jk$-u}U%EQ3P zzy)H7^DuBT@PJs7JPf=LF=-wKRt7ds23ZDqb_O{{1~nYMNAn5~g8~BwBLiOnIH2Rx z@{7t7i&8*FEAcR}gQWO42nM1 zgb(7@;EeqI5^%al`@oLQ9$R_V#ez?jL%z*xY@V2UdQ@j1epiy@mKmz^O8 zcaTC-mT!J(aVif(9@zTy)DkC<#sVIOLYP1V7eg^aDLX?6BZD-K&~Q)8P32)I1L*+8 zN_b{oN`85GW=cs0$gm0?hDwkWOL}TaB*?I89)=o_0DpRF2}G?&DkOQrgB^f*njSNkU46KPIiFrn#H0$D`=>kfjEj$dZ3~h`Iti_-WsCr7@e^+dD#s@CFigQFX#|p-#=|fjB*_ES3C@ooiJ3eMvp^EC5)CW?F>nqK z!(2=$uyONw7#4t}xS_@+B_?NsOk2dmuoxuHizE&)Y$*@JG7K58Su1!LR)S<;WLp{2c*K}u^AgUnV2#f@MSlo=Qp)uA@eVPIllVPIe|z-F`bRt60%nXL@k zTDk}~XbEs_WspF)L<{U6DKwWzGe|JVFvv2~F=#T#Gw3rYfL)~pu@CMl15jnh zzzA{!sGu61FmkEN9>Vg`kMm76z#;4Ei$}*jkwWLpUa24kLtP4&pFEWvsv) zM(J4$>@qVM1hu4PwlUahv20}!gBmBMwVlCHYdeDrCNR0eH^Tm~J6Vg_A?3I;ufY6g9V1_nch76v1R4hCaz z&?rDW2n`xxhB5|s22g<|%22}K!NA49#Nf%mz#zcDCHR*?ijk3phlhuUotK4y2~-C| zf{9@^0~6R3duE&E3_4m{7`(PI_(|_%2w`G4z!2rDvyCAJ(0uw`c3nQa6ROL>F zWJZRC|4$)2C&s|az`$U}z{+6GAjV+9pv_>$V8>vE1AI1M}OV8~)wz+erE*0~HOI~ekJFch)nq_lhNU?|_g zP{o>)((a|HzJsCGl2uD<3xkH%76xqz)@=;Uh?EG421uT;W#D75V~}L9XHa2qV9;i8 zWUyp#Vz6g$0lOHI`W&DxmSj+4XlLkPU}R8XkY?y)=wM)G&}I-}=wj$#ULk}c;8D}wo!kdBNk=7Q5-dPNK(448Yg+Xj4g90cS3WyX4a4lir)!M|+zm-98 zIRls0CWc8{85BV}SQdb_Ooec|%mldLA9)ycU%R;!8B@i{eY!EHWAzUn4 zR>8Hb-O8Y-4GLBPffP{4LMX*;3>y$hpo&3`fq}uDft|sFfsetHL6pIZL6O0mL4(1E zL7Tys!H6M{!HOY>!I2@D!Gj@$A%r26A(|nKA&w!OA(bJTA(tVBp@bopp_(C%p`9U~ zp^qVfVIo5!!wiO0h6N0149gkP8P+jmFzjN;WH`u>#c+fno8dG=A;Uw4a&V+U3bIGg gNMm4l#ITKFI|Cy)g18tswAmn#fstVcxPaUV00R&f{Qv*} literal 2305 zcmX^0Z`VEs1_mRBLUslwMh1=K{9OIq#PZal;{3D{{eq(WtfIusJpI(XlFX7y{oMQ{ z{eYar%G4ru1{OvJRl=%$^OG1ESTpkqN=q0S)O~Ph0L$xpr&cEACl;kxGcvFh7Zhcd zq%tyS;L?&_lvt3FnOv+N3|48)$iR}Amzm4R!05@yz+Rr1lbxBD&d9(R#mK;BlbM%U zV#mm!h0`=N2WW;dGO#%3r=)T*Ff$19Fz_-6F)}b~XohhzFfxenFmN((fmmWZ4BQMn zAeICV11kd?CxaA&3_F7~BZC?akD|Gnhe4KsgOP!+034?AY57IviA5}9WZz{p_D!(hW; z%gDfzn_rg7$iS-M=?RKEriw&H2BykHMh4#ClEma}-^2oFK(Q62=B1<-F*0c5ObduO zN-j!G&9jEYx(g43E6BUdDVar}cy{Mu@Bl@S0BYRD8-gUgco@8~Ng9D9eR&xCK$1LA zonX&^Bm#IC0zne625tsU z1|9}J1_1_P20;cX1|bGT1_lN(h*1nm49W~3APsg3BLm1n6{v-s3``6x3=9maXckIu zWl+_U*~*}yrHjpKB?b-#1_lu%t3?@v8N?VQ7{nQ586+4~7$m_?(1I8acY-RY6kuQk zSqLftzz$ReJByitkwKe522iFiXN#2I1ul z9H5X9*4n}#zJ)<&CIedw(|-uZ5X@nOa7;iPMyQNAn8PSNi-BEcCWD}sw9GaJD=n6- z45CouL_vYe%m4~pGX`D;1_l`h76w@cX$Cn41qOKrT?PdPD+WadcLpVf5C#>77zR~_ zBnCBxbOv>XECvmRd8Fz{+^ zVsP8aAh(=>OKTH@=T-(ekPemwU@blnE*35Ra4kU)HO{OMEuj!D7A+BQEzuA)&TJ4Z zaS$#REs1a~DO(xjw6(S{s0s+AXl-H8fKYPV7}60zUd15Cz`&r(z|Nq@z{jA^Aj)9C zpvYjzpuu3opv_>+V8md~V8vj;;K*Rf;K5+U5W-;15Y1r25XWH4kjmi5kjvo2P{QEM zP|e`N(9Yn>(8u7$Fpa~Tn z3~V-;d6^}4j0|iVo}Mn6VT=qc&iN^+Tnx+%QalV|4AP7Y%o>_u>NRtEF~TWRt7c@ONEDl9l}!MVc=lk1c_8uh3@o|%WvPq|T*3LJMaijdnV>M>M0!eCki6q8{6j0|E7;tY%o z5)2Fs{S3?utPBhc+FIKgB(-)k$V6^uklV^2uO+>eK~YO)D}%C@=2iw(E$Q~H4C-1k z?OPc%H!?6VFfnK|Ffb@FaDW}m!XU)J&mhVm!XU;V$so=k#~{I=!XU|@#URC?!@$6x z#lQlxfqW+ zt%Ycn1slx+Q2;fXk->z)6sp+>s+j|%c?*Nt8Z`ZiNcuUT`dJvP8Kj~5K^_D-krClv Th{dW%8X2J)85wNA#@hk_7t-El literal 0 HcmV?d00001 diff --git a/bin/com/mawersoft/projrain/entity/projectile/WizardProjectile.class b/bin/com/mawersoft/projrain/entity/projectile/WizardProjectile.class new file mode 100644 index 0000000000000000000000000000000000000000..89b6a8f9f711b0e97a1042a2a16b00582d863972 GIT binary patch literal 2019 zcmX^0Z`VEs1_mRB8g>RIMh45|{9OIq#PZal;{3D{{eq(WtfIusJpI(XlFX7yFh4c9 zBr_*fKRmN4u_z^=C_f7#z|O$J$Y4ygc7#So22MB6AlLXH#}HRW21ZXt243gJ1tg^7%fUg<$e`gvoDtR_cj)pk=z$DkD+U`25;EXnFa$Y`H8C$eCzXrA zn8B2t!Gw{44;(HziFxVzzKJCnJPc+G=8O!?$@#^g5OL9T0cp16VXy*eX3DDo>9pZt zum!6s&ddWz+w(9uK%^@f8TfrN^HTjvbCXhwLK2g5QbF;OpPZNzmROVt;zI>lN-{Ew z85yi`d5dr&v}R;rtYBndtYlG&~P|D6wLQGl*>)~N2V<=~25GYCoS%zFhSZR2A;)*HEWP#9W4Js(uiovE6 zm0`dttr;1(g7Zs@l2hF>L8(;~y|B{*BPt&$-v6M#=ywH&cMLH#K6J8 z%D@OJk{B2nxEUB2HZ!m?ure?(_-jeaXl`fV(bC$&z$cKhjX_9|VOm1_Rt5=XifQ63x! zQVdEAS`5la_G+WrtHrAR@*xvARJp*4bQwe#^pT7fg&NJkAj(j|Pzg4=3hbn6 E0NixO0ssI2 literal 0 HcmV?d00001 diff --git a/bin/com/mawersoft/projrain/graphics/Screen.class b/bin/com/mawersoft/projrain/graphics/Screen.class index efb0fd723153ce36ab34aaf7ad71b0c5355f1041..c41a1f39e392a676c9ff86bc022a00163bd5194b 100644 GIT binary patch delta 854 zcmZ23cuFG03KwK*|uOzdiQojH$r;ku(tr^C}5W*0~&JfDTU_4PkJP4m^9)@s+2u23p^wg5z zf}+fl)ZomjR7M774NXswDN#HO(F`$+44iOzMg}bn&B^^t8obQ^|1^$+4AU9xCuguV)yFfiFmN(3Fie-$ z+QML&Vk4uqg~2+-mf4JDIYW&oi%fzUE3+Bfa)uO9Ht7U2c2RcSZ4ALB3mIZX*|oMX zs4ij%5oMjt;4jLmwS_@_Ap_fT24_+BISg#fW+0W3TNpe<*+f}Dnlcjf%s50jgktA2 zh-htL&=h4CW!0+R!l0UwAj;w2!p11d22!^0|I8K^Mu?V${~I?lFfcGP7%(s}m@)7& zFfceVuroL_@G-bBh%mS^NHMrEC@{D)s4;jjcrkb~1TlCqq%n9i)G@d*bTPOvOk?n4 zFl1n0h=KT#!HB__0R*NqcrvgtFfuUIGfZdjVqjxn0tEp>978+OL5W*nE5Xzvy5XPX!5YFJv5W(Qj5Xlh75XDf&5X#WN5X{iU5IcDvdn{wZ kWEl=s#+1oU96Fqd46F=E3|tJUlgl|Y*;5%97?>E+0Ey_X-~a#s delta 261 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 diff --git a/bin/com/mawersoft/projrain/graphics/SpriteSheet.class b/bin/com/mawersoft/projrain/graphics/SpriteSheet.class index 563250621ac9dc3111f9878e5821ecf594057df0..bf15b23d207fb3bc0a9c847cb81968ca36613cc2 100644 GIT binary patch delta 833 zcmZqRe#*^t>ff$?3=9lL3=tE#jtB`B6y;~7CYNO9q{f$LRwWjtOgtmSC_M4GI-4jD zgBXMOWD!O+PDvgHZU!C>2I4iHP5hk=uUi;IDg zL6?U?k3oQufh8wDF@=$Vr6eP>n2~{{II}91i@}J&gq^{dk%2!eu`E$PCowNw-#I6- zxR{5*l)-HBUq(}93kEB821`Z;QILuX{mk6N^wi9JeNPbW>CeMp&0sS*l*x+Ij=_PQ z!Jd&pW^w_Oj2RDuBZCto14nvlNqA;TNd_YWvxcT87lR#x3lD=UNQyH(wZtPeGd-gO zB zS3=E8*c!b(e!oUntRnMTLwVgpl zOM5GWnwHE~1`RE(EeskUoUw;%D}$ESb_N}U!BPxt3=9lH3@i-744e!i415ft46+Pj z42lfmU`rH0MlvWd=!3n)z@P+*RR%@|5X*ppgMo>G2^5o1C#+-OV5kTAQ(uTtYYT(g zHU`5T4CX%C+Zb$ZwYM=i+i5d1%gAbNVbEfh*~Z`&zMO#rB7frz+lG6 zAjBZT5D0dhI0HXJ5CaDTGlLcb3qvqN2m>QSC<6lnI|EZDJA*e110zEiI4HvbV0(ve delta 750 zcmaFL-N4Ot>ff$?3=9lL48aq*j!b+c!6-EGw>p~$4}&O!*klbxHBJd025tr(4hE^o z;f(4mGCT~tlXo)edMkib@N+USGAQvdurjcLSSmaW>2E)l7Os2}l45sW1CX5WC zS&3zd75bUEiRr1C`TCw9+S8wh!HmIt@&YC+HcJL;b_T1-5116|Z5V7B8935YOTsf# zN-`K3m^Cy#xfm=N?0Fa*KvJCPsU;q%nduoNAWw`@2>orxuiC=I8M+c!K=GUr>~pR}x&3n4BF_ zlsLJ8xr32)GAD~>Ju?Fb10MrF10#a~0|SE-0}BHP$n9oej1&?SWMtURAiSAD9L$vz zFaYzUH!?6VFfqt7Ffed2FflNI_46~xfkhb@7(wv>HLrw$nSq&sfk8=YJA=HI_ErW( zEt#zh%34}m7?eRcqka$9Rt8nA?F{M&L!}tl7#J7?7+4qt88{h)82A{38Dtqm7!(;q z!ImgMjAYPa-~qXnK?xL@42&Ra7_=EU7?>ECKoJOa!a4>Hu&4Be7`3)AC~jlW*}-7s zqrHv6!d815L%p4yHZ!w~tkxC=Rc4uO436Q;88|?)t{cH7sxfFXxG^w;JuAn+&cMJR z$-v7X#UR8W%^=Po!=T0>$DqX^&!ESk1a_MV11kdqgFe)4ybO{IUJTw0j0{2yA`CuY uw}~_GGx#!aFfcP{F|aVm_%Zl1Ffs%%Ffgz)FlDkcxUn!WG6aHyG6(>-J#R4p diff --git a/bin/com/mawersoft/projrain/input/Keyboard.class b/bin/com/mawersoft/projrain/input/Keyboard.class index 9e3a74309b02934902e10a938e4e945abc9b2723..6ae185065ec56896a83a4704f1e44b393cc6a90b 100644 GIT binary patch delta 275 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 literal 2392 zcmX^0Z`VEs1_mRBe0ByVMh2zi{9OIq#PZal;{3D{{eq(WtfIusJpG*1veX=X9}vmT zz{1ENkd;`LsGpOVm#*)hl$DxX!pOi{o|#gT!N|bq$;iN#k(!yFQNqZ;QIeUHTI`uu z!pOiB?a9c%3g$C1uof32mgg}tsQ3`J(3+8f!zMW=GcU8mj*)>`LoABZ7Xvec9LNqnkP!+z46F=nAeIsj13QGJ!o$G9z{$nH$e_l01-+cZ&>j#SToo#GO(womV{)20#FAOR=6AlNq?ZkqYqMT z&Bb8H;K0sckJ~wDI(Qfi7z`O1*eimQi}G`F7#Y|rVJx;{uqPQAG;rCD<~3_Z2Br!F z5Mjv3z*GrhRT?rfFjg`$Fjg=!@CKJ8CTII57Jw50Cxab>FAswsgFhn!M_GPm3dsF< z>_T(5H7KD3@-T2Qa5DdYH7gQiTnG3&(BX`{?G8A0VEf}!w?CQoB$=M+BL>`7DkT?&-oV1+$^3)=bL<$c> zDo6rqc~O3HHuL|JCr^UpGI$s=L2^*bi%atJQbFR`JPbKV;^m1YpajSjoL^d$oazRS zeJ*fP)&pfb21N!&24)5Z237_ZP*!1JU|<1d6fn)fzzL?gz%(Z)H!?6Va58W(@G|f* zFf#BnFfizXbu%#V?q(2(6cXCbAhMZ3Vj}|s0~3Q30|Nsa10w?i12=;-ScHLrkwJ_> z2C6lWff=k>Mr%8Rtd{gv26-)+tqh7<(lQx)xVADVYi(mtMVKVTz{bG9z{|kGz{kMJ zz|X+PAiyBbAjlxiAPhEL0b&+|1_KWR2*`lF1F~HP>>(zw-QrNY{TP@Sm>3us_`r5+ zZ)4CzwM~eDg@J)Vl!1jojDeFuoPn1?0&I&IL>Jr^J_a2IT?R%57Enn7HCvkj3=FZl(lXl^jHKDC%vhv#w=kF|2nZywSDCTOuveL} z$>?rjuz-rNi?W$271NZQ*1TpmF44MoQ3|b7b4B8A@47v=440;R}4EhWn40;Sf z47v<43`Stbr$HPD4RHpBSO!OE!i;5bVqgPDX)J>?g9`&Q12;nugDV3Y0}F!$gDZm@ z0~-S?gDissgF6Eo0~>=DgE4~#0~-T7gC2t(gC_$U0|$dCgDis=0~-S;gEs>MgB%0P ze+EMaPId-HMn-l9V@42QVEDtp#whfQ0aUTL(~Qa1_nqpX@P^>l0k;Sn!$*{hQWiumLZ10 zj-i;ro}rz=fnhd-Bf~}pCx)X8&fqA5H=O_IsR++(Ign?^bd!Ffd4#xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5r zgg5euGcYhL@pN$vi8%cBS|C@80T0Us$(y&IoZ1<7e)3-p4~N(jPMcSsc`$#Xop;nB zhXq1S5i_rg-**xD*O;=h?(qDlY6?xOtCun;y?Dp_xBBA3jz0_q<;KRFS2wL#5_P`j z>t*L>Q8LGEbS-F3-`k5nMj2?Zb|^yt$XR-~E1}FXP^9fAg>Y8oO4qR%Ps{+IP`L nWr70}Cy2u;NKR8o%gjk-U|?V{fMO6^kb!}Lk&%IcL70Jofx~G6%N!79U|u{^S}TeR5|cCY(iIG0c4=~HRALi^is_c-WtJ#p z<|SvO7He{8ROF|n6{nWK9SG8mDFhKg)d~s+C}vy-Wq>H;_~CX+OwLX($}i0W2OASe zo`HdZ4H_f=L9qs9gCc+v$_6QuL1J?uvAL1hJVG@0CD=Li2wiq literal 0 HcmV?d00001 diff --git a/src/com/mawersoft/projrain/Game.java b/src/com/mawersoft/projrain/Game.java index 14b8960..004ed59 100644 --- a/src/com/mawersoft/projrain/Game.java +++ b/src/com/mawersoft/projrain/Game.java @@ -13,6 +13,7 @@ import javax.swing.JFrame; import com.mawersoft.projrain.entity.mob.Player; import com.mawersoft.projrain.graphics.Screen; import com.mawersoft.projrain.input.Keyboard; +import com.mawersoft.projrain.input.Mouse; import com.mawersoft.projrain.level.Level; import com.mawersoft.projrain.level.RandomLevel; import com.mawersoft.projrain.level.SpawnLevel; @@ -24,12 +25,14 @@ public class Game extends Canvas implements Runnable { */ private static final long serialVersionUID = 1L; // - public static int width = 300; - public static int height = width / 16 * 9; - public static int scale = 3; - public static String ver = "0.0.4"; + private static int width = 300; + private static int height = width / 16 * 9; + private static int scale = 3; + public static String ver = "0.0.5"; //public static String title = "ProjRain"; public static String title = "Project Rain "+ver; + public int currentFPS; + public int currentTPS; private Thread thread; private JFrame frame; @@ -56,6 +59,18 @@ public class Game extends Canvas implements Runnable { player = new Player(playerSpawn.x(), playerSpawn.y(), key); player.init(level); addKeyListener(key); + + Mouse mouse = new Mouse(); + addMouseListener(mouse); + addMouseMotionListener(mouse); + } + + public static int getWindowWidth() { + return width * scale; + } + + public static int getWindowHeight() { + return height * scale; } // @@ -103,6 +118,8 @@ public class Game extends Canvas implements Runnable { timer += 1000; //System.out.println(ticks + "Ticks " + frames + " FPS"); //Print info to console if needed. frame.setTitle(title + " | " + ticks + "TPS " + frames + " FPS"); + currentFPS = frames; + currentTPS = ticks; ticks = 0; frames = 0; } @@ -115,6 +132,7 @@ public class Game extends Canvas implements Runnable { //In the tutorial, tick = update key.update(); player.update(); + level.update(); } @@ -139,6 +157,17 @@ public class Game extends Canvas implements Runnable { //g.setColor(Color.BLACK);//Testing only //g.fillRect(0, 0, getWidth(), getHeight() );//Testing only g.drawImage(image, 0, 0, getWidth(), getHeight(), null); + //g.fillRect(Mouse.getX() - 32, Mouse.getY() - 32, 64, 64); // Don't need it + g.drawString("Project Rain by Jack Mawer, Version " + ver, 5, 10); + g.drawString("CurrentMouseButton: " + Mouse.getB(), 5, 20); + g.drawString("MouseX: " + Mouse.getX() + " MouseY:" +Mouse.getY(), 5, 30); + //g.drawString("PlayerX: " + + " PlayerY: " + , 5, 40); // Broken... + g.drawString("TPS: " + currentTPS + " FPS: " + currentFPS, 5, 40); + if (currentFPS >= 60) g.drawString("Your FPS is great!", 5, 50); + if (currentFPS >= 30 && currentFPS < 60) g.drawString("Your FPS is good", 5, 50); + if (currentFPS >= 10 && currentFPS < 30) g.drawString("Your FPS is bad...", 5, 50); + if (currentFPS >= 1 && currentFPS < 10) g.drawString("Your FPS is terrible!", 5, 50); + g.dispose(); bs.show();//If using testing code, disable me } diff --git a/src/com/mawersoft/projrain/entity/Entity.java b/src/com/mawersoft/projrain/entity/Entity.java index 86e2656..49c7d0c 100644 --- a/src/com/mawersoft/projrain/entity/Entity.java +++ b/src/com/mawersoft/projrain/entity/Entity.java @@ -7,7 +7,7 @@ import com.mawersoft.projrain.level.Level; public abstract class Entity { - public int x, y; + public int x,y; public boolean removed = false; protected Level level; protected final Random random = new Random(); diff --git a/src/com/mawersoft/projrain/entity/mob/Mob.java b/src/com/mawersoft/projrain/entity/mob/Mob.java index 631f562..3180b0b 100644 --- a/src/com/mawersoft/projrain/entity/mob/Mob.java +++ b/src/com/mawersoft/projrain/entity/mob/Mob.java @@ -1,7 +1,13 @@ package com.mawersoft.projrain.entity.mob; +import java.util.ArrayList; +import java.util.List; + import com.mawersoft.projrain.entity.Entity; +import com.mawersoft.projrain.entity.projectile.Projectile; +import com.mawersoft.projrain.entity.projectile.WizardProjectile; import com.mawersoft.projrain.graphics.Sprite; +import com.mawersoft.projrain.level.Level; public abstract class Mob extends Entity { @@ -9,6 +15,8 @@ public abstract class Mob extends Entity { protected int dir = 0;// 0 N, 1 E, 2 S, 3 W protected boolean moving = false; + + public void move(int xa, int ya) { if (xa != 0 && ya != 0) { @@ -30,6 +38,13 @@ public abstract class Mob extends Entity { public void update() { } + protected void shoot(int x, int y, double dir) { + //dir *= 182 / Math.PI; + //System.out.println("Angle: " + dir); + Projectile p = new WizardProjectile(x, y, dir); + level.addProjectile(p); + } + private boolean collision(int xa, int ya) { boolean solid = false; for (int c = 0; c < 4; c++) { diff --git a/src/com/mawersoft/projrain/entity/mob/Player.java b/src/com/mawersoft/projrain/entity/mob/Player.java index 3747d0a..b481b37 100644 --- a/src/com/mawersoft/projrain/entity/mob/Player.java +++ b/src/com/mawersoft/projrain/entity/mob/Player.java @@ -1,8 +1,12 @@ package com.mawersoft.projrain.entity.mob; +import com.mawersoft.projrain.Game; +import com.mawersoft.projrain.entity.projectile.Projectile; +import com.mawersoft.projrain.entity.projectile.WizardProjectile; import com.mawersoft.projrain.graphics.Screen; import com.mawersoft.projrain.graphics.Sprite; import com.mawersoft.projrain.input.Keyboard; +import com.mawersoft.projrain.input.Mouse; public class Player extends Mob { @@ -11,6 +15,8 @@ public class Player extends Mob { private int anim = 0; private boolean walking = false; + private int fireRate = 0; + public Player(Keyboard input) { this.input = input; @@ -22,9 +28,11 @@ public class Player extends Mob { this.y = y; this.input = input; sprite = Sprite.player_forward; + fireRate = WizardProjectile.FIRE_RATE; } public void update() { + if (fireRate > 0) fireRate--; int xa = 0, ya = 0; if (anim < 7500) anim++; else anim = 0; @@ -32,13 +40,31 @@ public class Player extends Mob { if (input.down) ya++; if (input.left) xa--; if (input.right) xa++; - if (xa != 0 || ya != 0) { move (xa, ya); walking = true; } else { walking = false; } + clear(); + updateShooting(); + } + + private void clear() { + for (int i = 0; i < level.getProjectiles().size(); i++) { + Projectile p = level.getProjectiles().get(i); + if (p.isRemoved()) level.getProjectiles().remove(i); + } + } + + private void updateShooting() { + if (Mouse.getB() == 1 && fireRate <=0) { + double dx = Mouse.getX() - Game.getWindowWidth() / 3; + double dy = Mouse.getY() - Game.getWindowHeight() / 2; + double dir = Math.atan2(dy, dx); + shoot(x, y, dir); + fireRate = WizardProjectile.FIRE_RATE; + } } public void render(Screen screen) { diff --git a/src/com/mawersoft/projrain/entity/projectile/Projectile.java b/src/com/mawersoft/projrain/entity/projectile/Projectile.java new file mode 100644 index 0000000..5d7be67 --- /dev/null +++ b/src/com/mawersoft/projrain/entity/projectile/Projectile.java @@ -0,0 +1,39 @@ +package com.mawersoft.projrain.entity.projectile; + +import java.util.Random; + +import com.mawersoft.projrain.entity.Entity; +import com.mawersoft.projrain.graphics.Sprite; + +public abstract class Projectile extends Entity { + + protected final int xOrigin, yOrigin; + protected double angle; + protected Sprite sprite; + protected double x, y; + protected double nx, ny; + protected double distance; + protected double speed, range, damage; + + protected final Random random = new Random(); + + public Projectile(int x, int y, double dir) { + xOrigin = x; + yOrigin = y; + angle = dir; + this.x = x; + this.y = y; + } + + public Sprite getSprite() { + return sprite; + } + + public int getSpriteSize() { + return sprite.SIZE; + } + + protected void move() { + } + +} diff --git a/src/com/mawersoft/projrain/entity/projectile/WizardProjectile.java b/src/com/mawersoft/projrain/entity/projectile/WizardProjectile.java new file mode 100644 index 0000000..4f604e8 --- /dev/null +++ b/src/com/mawersoft/projrain/entity/projectile/WizardProjectile.java @@ -0,0 +1,49 @@ +package com.mawersoft.projrain.entity.projectile; + +import com.mawersoft.projrain.graphics.Screen; +import com.mawersoft.projrain.graphics.Sprite; + +public class WizardProjectile extends Projectile { + + public static final int FIRE_RATE = 10; // higher = slower + + public WizardProjectile(int x, int y, double dir) { + super(x, y, dir); + range = random.nextInt(100) + 150; + speed = 4; + damage = 20; + sprite = Sprite.projectile_wizard; + + nx = speed * Math.cos(angle); + ny = speed * Math.sin(angle); + } + + public void update() { + if (level.tileCollision(x, y, nx, ny, 7)) remove(); + move(); + + } + + + + protected void move() { + + x += nx; + y += ny; + + if (distance() > range) remove(); + } + + private double distance() { + double dist = 0; + dist = Math.sqrt(Math.abs((xOrigin - x) * (xOrigin - x) + (yOrigin - y) * (yOrigin - y))); + return dist; + } + + public void render(Screen screen) { + + screen.renderProjectile((int) x - 12, (int) y - 2, this); + + } + +} diff --git a/src/com/mawersoft/projrain/graphics/Screen.java b/src/com/mawersoft/projrain/graphics/Screen.java index 6368b9d..e207376 100644 --- a/src/com/mawersoft/projrain/graphics/Screen.java +++ b/src/com/mawersoft/projrain/graphics/Screen.java @@ -3,6 +3,7 @@ package com.mawersoft.projrain.graphics; import java.util.Random; import com.mawersoft.projrain.entity.mob.Player; +import com.mawersoft.projrain.entity.projectile.Projectile; import com.mawersoft.projrain.level.tile.Tile; public class Screen { @@ -61,6 +62,21 @@ public class Screen { } } + public void renderProjectile(int xp, int yp, Projectile p) { + xp -= xOffset; + yp -= yOffset; + for (int y = 0; y < p.getSpriteSize(); y++) { + int ya = y + yp; + for (int x = 0; x < p.getSpriteSize(); x++) { + int xa = x + xp; + if (xa < -p.getSpriteSize() || xa >= width || ya < 0 || ya >= height) break; + if (xa < 0) xa = 0; + int col = p.getSprite().pixels[x+y*p.getSpriteSize()]; + if (col != 0xffff00ff) pixels[xa+ya*width] = col; + } + } + } + public void renderPlayer(int xp, int yp, Sprite sprite) { xp -= xOffset; yp -= yOffset; diff --git a/src/com/mawersoft/projrain/graphics/Sprite.java b/src/com/mawersoft/projrain/graphics/Sprite.java index 221c819..11baf69 100644 --- a/src/com/mawersoft/projrain/graphics/Sprite.java +++ b/src/com/mawersoft/projrain/graphics/Sprite.java @@ -48,6 +48,11 @@ public class Sprite { public static Sprite player_back_1 = new Sprite(32, 2, 6, SpriteSheet.tiles); public static Sprite player_back_2 = new Sprite(32, 2, 7, SpriteSheet.tiles); + + //Projectile sprites + public static Sprite projectile_wizard = new Sprite(16, 0, 0, SpriteSheet.projectile_wizard); + + public Sprite(int size, int x, int y, SpriteSheet sheet) { SIZE = size; pixels = new int[SIZE * SIZE]; diff --git a/src/com/mawersoft/projrain/graphics/SpriteSheet.java b/src/com/mawersoft/projrain/graphics/SpriteSheet.java index e923bcf..785f38b 100644 --- a/src/com/mawersoft/projrain/graphics/SpriteSheet.java +++ b/src/com/mawersoft/projrain/graphics/SpriteSheet.java @@ -13,6 +13,8 @@ public class SpriteSheet { public static SpriteSheet tiles = new SpriteSheet("/textures/sheets/spritesheet.png", 256); public static SpriteSheet spawn_level = new SpriteSheet("/textures/sheets/spawn_level.png", 48); + public static SpriteSheet projectile_wizard = new SpriteSheet("/textures/sheets/projectiles/wizard.png", 48); + public SpriteSheet(String path, int size) { this.path = path; SIZE = size; diff --git a/src/com/mawersoft/projrain/input/Keyboard.java b/src/com/mawersoft/projrain/input/Keyboard.java index b94f159..320b246 100644 --- a/src/com/mawersoft/projrain/input/Keyboard.java +++ b/src/com/mawersoft/projrain/input/Keyboard.java @@ -16,7 +16,7 @@ public class Keyboard implements KeyListener { for (int i = 0; i < keys.length; i++) { if (keys[i]) { - System.out.println("Key:" + i); + //System.out.println("Key:" + i); } } diff --git a/src/com/mawersoft/projrain/input/Mouse.java b/src/com/mawersoft/projrain/input/Mouse.java new file mode 100644 index 0000000..c855645 --- /dev/null +++ b/src/com/mawersoft/projrain/input/Mouse.java @@ -0,0 +1,59 @@ +package com.mawersoft.projrain.input; + +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; + +public class Mouse implements MouseListener, MouseMotionListener { + + private static int mouseX = -1; + private static int mouseY = -1; + private static int mouseB = -1; + + public static int getX() { + return mouseX; + } + + public static int getY() { + return mouseY; + } + + public static int getB() { + return mouseB; + } + + + + public void mouseDragged(MouseEvent e) { + mouseX = e.getX(); + mouseY = e.getY(); + } + + + public void mouseMoved(MouseEvent e) { + mouseX = e.getX(); + mouseY = e.getY(); + } + + + public void mouseClicked(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + + public void mouseExited(MouseEvent e) { + } + + + public void mousePressed(MouseEvent e) { + mouseB = e.getButton(); + } + + + public void mouseReleased(MouseEvent e) { + mouseB = -1; + } + +} diff --git a/src/com/mawersoft/projrain/level/Level.java b/src/com/mawersoft/projrain/level/Level.java index f5ebe08..e4e0de4 100644 --- a/src/com/mawersoft/projrain/level/Level.java +++ b/src/com/mawersoft/projrain/level/Level.java @@ -1,5 +1,10 @@ package com.mawersoft.projrain.level; +import java.util.ArrayList; +import java.util.List; + +import com.mawersoft.projrain.entity.Entity; +import com.mawersoft.projrain.entity.projectile.Projectile; import com.mawersoft.projrain.graphics.Screen; import com.mawersoft.projrain.level.tile.Tile; @@ -10,6 +15,9 @@ public class Level { protected int[] tiles; public static Level spawn = new SpawnLevel("/levels/spawn.png"); + private List entities = new ArrayList(); + private List projectiles = new ArrayList(); + public Level(int width, int height) { this.width = width; this.height = height; @@ -30,11 +38,33 @@ public class Level { } public void update() { + for (int i = 0; i < entities.size(); i++) { + entities.get(i).update(); + } + + for (int i = 0; i < projectiles.size(); i++) { + projectiles.get(i).update(); + } + } + + + public List getProjectiles() { + return projectiles; } private void time() { } + public boolean tileCollision(double x, double y, double xa, double ya, int size) { + boolean solid = false; + for (int c = 0; c < 4; c++) { + int xt = (((int)x + (int)xa) + c % 2 * size / 2 - 5) / 16; + int yt = (((int)y + (int)ya) + c / 2 * size / 2 + 5) / 16; + if (getTile(xt, yt).solid()) solid = true; + } + return solid; + } + public void render(int xScroll, int yScroll, Screen screen) { screen.setOffset(xScroll, yScroll); int x0 = xScroll >> 4; @@ -47,7 +77,23 @@ public class Level { getTile(x, y).render(x, y, screen); } } + for (int i = 0; i < entities.size(); i++) { + entities.get(i).render(screen); + } + for (int i = 0; i < projectiles.size(); i++) { + projectiles.get(i).render(screen); + } } + + public void add(Entity e) { + entities.add(e); + } + + public void addProjectile(Projectile p) { + p.init(this); + projectiles.add(p); + } + // Grass = 0xFF00FF00