From 5de5f5330a13e45bca55e920e33717f0571a7aef Mon Sep 17 00:00:00 2001 From: Pacharaphon Date: Sun, 16 Apr 2023 22:37:08 +0700 Subject: [PATCH] 2d game with fixing camera --- .classpath | 1 + bin/John.png | Bin 0 -> 426 bytes bin/Map.png | Bin 0 -> 31034 bytes bin/Rabbi.png | Bin 0 -> 903 bytes bin/RabbiLeft.png | Bin 0 -> 912 bytes bin/application/Main$1.class | Bin 0 -> 1287 bytes bin/application/Main.class | Bin 379 -> 1778 bytes bin/drawing/GameScreen.class | Bin 0 -> 4088 bytes bin/input/InputUtility.class | Bin 0 -> 1565 bytes bin/logic/charClass/BaseCharClass.class | Bin 296 -> 0 bytes bin/logic/entity/BaseEntity.class | Bin 281 -> 0 bytes bin/logic/entity/Entity.class | Bin 0 -> 1239 bytes bin/logic/entity/Player.class | Bin 0 -> 1994 bytes bin/logic/entity/Werewolf.class | Bin 0 -> 1796 bytes bin/logic/field/Map1.class | Bin 0 -> 3722 bytes bin/logic/field/WhiteMap.class | Bin 0 -> 794 bytes bin/logic/game/GameLogic.class | Bin 0 -> 1664 bytes bin/sharedObject/IRenderable.class | Bin 0 -> 243 bytes bin/sharedObject/RenderableHolder.class | Bin 0 -> 3415 bytes res/John.png | Bin 0 -> 426 bytes res/Map.png | Bin 0 -> 31034 bytes res/Rabbi.png | Bin 0 -> 903 bytes res/RabbiLeft.png | Bin 0 -> 912 bytes src/application/Main.java | 54 ++++++++++- src/drawing/GameScreen.java | 74 +++++++++++++++ src/input/InputUtility.java | 45 +++++++++ src/logic/charClass/BaseCharClass.java | 5 - src/logic/entity/BaseEntity.java | 5 - src/logic/entity/Entity.java | 49 ++++++++++ src/logic/entity/Player.java | 67 ++++++++++++++ src/logic/entity/Werewolf.java | 52 +++++++++++ src/logic/field/Map1.java | 118 ++++++++++++++++++++++++ src/logic/field/WhiteMap.java | 32 +++++++ src/logic/game/GameLogic.java | 50 ++++++++++ src/sharedObject/IRenderable.java | 10 ++ src/sharedObject/RenderableHolder.java | 68 ++++++++++++++ 36 files changed, 619 insertions(+), 11 deletions(-) create mode 100644 bin/John.png create mode 100644 bin/Map.png create mode 100644 bin/Rabbi.png create mode 100644 bin/RabbiLeft.png create mode 100644 bin/application/Main$1.class create mode 100644 bin/drawing/GameScreen.class create mode 100644 bin/input/InputUtility.class delete mode 100644 bin/logic/charClass/BaseCharClass.class delete mode 100644 bin/logic/entity/BaseEntity.class create mode 100644 bin/logic/entity/Entity.class create mode 100644 bin/logic/entity/Player.class create mode 100644 bin/logic/entity/Werewolf.class create mode 100644 bin/logic/field/Map1.class create mode 100644 bin/logic/field/WhiteMap.class create mode 100644 bin/logic/game/GameLogic.class create mode 100644 bin/sharedObject/IRenderable.class create mode 100644 bin/sharedObject/RenderableHolder.class create mode 100644 res/John.png create mode 100644 res/Map.png create mode 100644 res/Rabbi.png create mode 100644 res/RabbiLeft.png create mode 100644 src/drawing/GameScreen.java create mode 100644 src/input/InputUtility.java delete mode 100644 src/logic/charClass/BaseCharClass.java delete mode 100644 src/logic/entity/BaseEntity.java create mode 100644 src/logic/entity/Entity.java create mode 100644 src/logic/entity/Player.java create mode 100644 src/logic/entity/Werewolf.java create mode 100644 src/logic/field/Map1.java create mode 100644 src/logic/field/WhiteMap.java create mode 100644 src/logic/game/GameLogic.java create mode 100644 src/sharedObject/IRenderable.java create mode 100644 src/sharedObject/RenderableHolder.java diff --git a/.classpath b/.classpath index 865fa06..f831748 100644 --- a/.classpath +++ b/.classpath @@ -6,5 +6,6 @@ + diff --git a/bin/John.png b/bin/John.png new file mode 100644 index 0000000000000000000000000000000000000000..4a84953fa0932e974469cb1def7ff858f113abed GIT binary patch literal 426 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Ì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 literal 0 HcmV?d00001 diff --git a/bin/Rabbi.png b/bin/Rabbi.png new file mode 100644 index 0000000000000000000000000000000000000000..8e1f6a65c141769f59ee80a469b952d18bea6ded GIT binary patch literal 903 zcmV;219<$2P)Px&K}keGRCr$Pnz3#ZK@f&>G>FPjAfd=20wn~hNHlcVNGWVZyoLMZ0W1n6S2P4# z7a##rDnJm~MS^Tvo&XXhN|0!1FfZW9gD1*PvNyA{ci6sNH@0tg_V)hyc6N96lDWV? zN#M^v7X=8OfQO&H4>clueY{)n1DZnfe3`FrIJyPk}w<&FC;2Sl2l@}cA`$F zR5~Rf3NR*M@awmsS84vb@t+cag-8N=vejxCcFkr}M1ZSZ<^)6m2mz?Dl!RAzFM-Ls ztt}@44)*pScDUN*PC#%1-~-d4AQfWf35WuaLFGz9VF=KYFtY;CXi67GQW8EqxHg-! zK(GSfgWEPmt|TAly!PJuJ^U7O;s;DG7xY zfFt4Qm7j*^q_Y4`5n57-qjdnZkLCZJfG7Z2YSAHq1fb`!x@{dm$9BKpH#~eM+QUzb z6%&gAbg3D<0CY&?ML@M$g7 zJbM3c?BDzH628mj@^ldptN^wLmwMJ#Z{_VbD557)lmPA6$NPHE0>KG@Z*pWky-^a7 zfcZC1Qenbape4bXfM5lXZh8*)_rYT{BZSwfJGm32dc6)NoleIv#p`%cOM;kyC;-{_ z+dOCUG&d`7Bv5Px&NJ&INRCr$Pnz3%vP!xvi7a%MwNTmX`@C02+L^~uZ2$(7X5)4_PEKHFYP#%Ep zc?(n}LnRV679=JLtw2Rlg~ZTiLM#Mv=`V2)J~`*wzIE*DE~)K%9iQ+2?>WbIqJ_Z! zqQK){r~p(BC<%e|=7~D9{0oeci$6{H3J-@vYprJO09WO`J0N%fv8g%5PTUL79MD)_Pu0$+ znj9C8?@n-T0JPg}^Twyw>sb*01F*AWbK2N&@&TtjPLi7gf(P()Ys)y`<@UC50A5v% zZeDd#m>W!$&)WK_t3dDoumnKz)9q)Ln66Hc);e`c+O?nB0TqDLDgct>@!0(P;l^Y0 z`TB0MT!0=Q=dG`;#ij}A_XXNSl(-L|4hRka2m=HKfa7>(_x}E>RurdkX`PVR0l@>H z%5$h5-D8_O7lXi;E z4hR+i7x-W>Fc4jDgE{4;5(0BEa%D*z5W?jp6>ALmh5fvglyy95dY;Pd{zRW+c{ zrKKek1HJE;lpF5un)6{k?fkGUohP$<0m%`;1At-@D6MkZ^UaL|v=>}j09xhq9_OtJ mKwabRsEimjQH)3sVaY(Mf>7m^)y%d_>uk@~OfQf66eg4nsZ{Gd)_dfs@v01{9z=Z5}V;xDW z6BBGmZEEu+6a;3T$$k0sWgw02d@wG3lpg7hN(H=bs`ho#%iLW+tW(uW<%_1VD&3bc zRSyJ4S}L|uplJ7WR=dW6;o*u40%P>AwPi9j1;#^d)Ml@S@)!Ax!6K|y|GilWn3-c3R8W$J`Z!Q$FVLS*)AuY zZeo&g~;gNpZXzl24OrA@bIgQla~R>#`@ z>S4*bRzJArmMzOR`5Gp9A#j|x==p~14)$5uN_uIe9%{F>vP1lwgF4@1#YAzE5px^L z?j@}f)|mG2);+A_C&HQorB-0N9u9sKD%vVwv9?-p(D9nasB}4&S*G}Yqnj$TYe{A? zOAHM24=nN!C8TiB$T@)lRI3haa2)9^7v%+z?lNUg`zOo(rAiCj?I z7!-TO7G2XT{^K_|KjXi_S@k>VY!WfMKjX^LF#gA%s8N_afKN7kfZ#1|9N^Ad{E$bE zw+GD(vnW`oOge{21UQ3vTp-+h+@M5^;TG6+ zEXUKK35-6sURnpQ^6i^TEkl9ioZ~ssyg+w0wntfVS(d1prtK@g0!0{@xxjl7Q zpMie#G8osYd3Kd9R!||_KnD+jL>O5?BycSo~4D4sW7AYM2#kS>9hhe03jFQ&{yB%en!3b_Ck;VnCw<3vwwyi*V zQB3X*?&_FmLuiF+;2pdxkP2lKBVJ$>kMT)rg4*8X$i&*q*edXEfzu4>u{ z%2r&=~Sw`A6nr1 z?8eSrIu3Da1Hf1aUQYbHw+Htde|CG1NLummd4v$Z#sX(zUllLS6a>)f&c^1Fn9rAfOF7c2v=!w zjbn|o>naX0%p=oWar+W@(AV|P{0W9j4cshfCm1Q2S_5N+#FUw+I@V86EKQn8Q*U6ikTO$seASA$ zKvG~N8cd{c1AVy3-w1AF6j^FF!_hKt!xkp6%eU!Ut{z|(FEAG~eAbNpR3fs#H`pUL z4OKj*br(^~C~?FW9Z&Iue~l+>;~BnVHfC@i-{S{ru#8Fk2#cB=aJCPdp563SiIH3b P(<6A@nqP&T(y;g+iVC1E delta 124 zcmeyw`Nec>OC6*=X=OpH(>-#5Vr6!k5bZMS=OMdb_7I7X1 zMFvI&W}sRI2Byh!tXhoBlRa7G&9s4hMiAZzl3?Hhl5AiB4hC)@n+GDvAiy99Qp6wx HRwWDoYHSpM diff --git a/bin/drawing/GameScreen.class b/bin/drawing/GameScreen.class new file mode 100644 index 0000000000000000000000000000000000000000..457a281226edcb73a43c49a2bb2135434c25048b GIT binary patch literal 4088 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 YUzPL-{*Hg(pTw1u{a^SG{)dbH4>eiiIsgCw literal 0 HcmV?d00001 diff --git a/bin/input/InputUtility.class b/bin/input/InputUtility.class new file mode 100644 index 0000000000000000000000000000000000000000..8bb7e1ef7636b9c7b2bf050dccabe3666852aa82 GIT binary patch literal 1565 zcmaJ=-Ez}L7(Ht{k*z4?KgJLeN`S^riwg9QI!%G30a~{(bs9?U6nSw)Y$+qH0blkp z$_wrk&{n@KBweU5UhDGD*g}-+sI2`_7&{di&qs{{r|1-&x2BOa|dzPq`2D z__GQ+f$Cc*2#i1To_lV`3)}9)ooCWl0>j;?m&jiP#QM9%6M<2aeHb?VSjv!_+X8lw zG~`pY9=%{_3WSlE@YhHB7%A8Mt@i*y}ffMAZdK&7d86 zsuxRvnFZ*jzOV(Fep}69Af-q340{NxtmOw#ol^`(fpoo%= zW*yjRbk@NLN*2xuOr5~UMg?;YE?|NRteCPIzu>^ZsK8hw2<4Bx?v9K%y`2s@Pc|ao z>uh;(pw}j8Bab=KP`?HVNf7e>1CaG-TPoh-P@jdR)9zW_*2I<^R8ixN{U}sk5VHDA z3LAXKdX*1kQG1^<2+W;Umpqc=JT9KfW4pSgiG1SVx+aqMS}nc4>EKhn9*$) z$CnnqIA*eDKT)#l;1<3jFzV57nJ0qCeG~_wYN}Xz-MWnxtXlZ`-2)xpc4+L|yx*Qi zbhP_UQh+YtiOhPVP38H!KX`lDlck0}^6$7YxL*GxJJL%i+Vp^>H{+n)ma#T5{Y7oZ zdwVTUN%KXqwBmWY8TDdcZUovA6NBH{HEl9{Ko8~lQ4XVoA&%f|Wiu_xwXF?mX4=!t zG#pW980RoXBNs7_31%jlSz}KBl?w-$${%2czw$q*Jb8oj2blkhTRB|hIEezs5=WZ_ zM(ARPWb`griZ;&*x|{`bL$x=!bOawZNy|W-^Z*ud*_6D3tITLNH&{-Ci~E?by~c-s zGEUp4_^|$NTt<;cL`2#k{%U zJcUf}IYqIiG0Xo7%4}Id4d+bj*|dDtnvHOWnh4w_vVdI0;%eeRNEA5$he8=! zP|(nPvu{Q_dh_-Dc?7V;G=fK%xq4@{(tB=F$8D>gxHai7MF{+9$6109Bf=!Jm02BL3)5`4aE5S|)tX(-jqUlT8FYKw66V>z z68D7or9L#;JlkQ_AH}=g4hx8joCT@WJ4i-CYG5F|{lNHL8XjWFehm3=E}0DPQ0j#c J;ZoAW3&nmD7hQ=7#P#4l>#Bn*`~W}dxY;0B z*}Qr04KwrR{`Y$W@Q$_*htN&)gHD9Xj5c3lE-z|PQXej%eUhJ2q%u2*b$n8ZAylV2 z(`H7f42C;``;qTefC}mjc&HM>NM~wwJ;$op$~aYoPLwAy-N`~*{V-i~)E7c8dU1Y2 z2sZh(NYql>CE+vK*oHzM9D)A;SF)!WeO98>fH(R@Ent8~=h2 z{sa|3(0a(GRiWI|G*X;<);7%ZdV`D80 zDinsoo_S~*UDN3pFWP(D3RGkn%KonDaXZQw%?<9@+%wx<&X9fQdR_Z918ej)+YG92 zd7L|xjuGY9d-^x&l4siDz^9`_;fqj&?J#II_XE#8<~Bpd-{&%Fw(!VR@Xe}3?`&Ape= z8;UL0GP_%*C*(d(D#5NGlciQdt7K&}2u$k@d9+MtHO52L2K}0~ogA*Cs$zy=wC{S| z40d(YP$#=)o3xc`qefjz9nI5nESIANiD(&)=+K}8u9V&+CUhiyMW|wtnGMn3U4?K%M6LQqU z(RVT@U!+v%R+|19rNPciwGQYlQ)TBPeB0R^LEAWv%nmnfr0G)$vH-WV>Eq%?O0 zS7Yf9#K}=^dZwJ|{J^!6_VLqajMd6&f0t2C(kFB$9oEW*nx#;G8Cl7V^g}dD)>(*d z5K4#WCZSA-<_M`FGRUolTZE~FQ$(4^0@ literal 0 HcmV?d00001 diff --git a/bin/logic/entity/Player.class b/bin/logic/entity/Player.class new file mode 100644 index 0000000000000000000000000000000000000000..723a48cad45b5490543510c42361fc879c9120fa GIT binary patch literal 1994 zcmah}TT>KA7(LBphlN34MNlrmC@L)IC>o7oyaW_Btb%~tl8_9u?e561yUxrCBzgBY z#HYORkf%^WtW+frdCW`xPb!tl`DPadG!>}r=|0_G_jk_uy8rm+m)`)~#&-s)6png@ ztm{}hAG+bDHRaix+BZ;hc;a3(uMp4LYdS3<3T^3ftU%V-9zLuPyXofL@RmYnUn=$f zMg4OMH6w+Lu17T*Oc*c~s{8uq;!rqZq6y91XT9KinFR$kDsaNY(YNrTK*vn9p3+$Jd%0we|IM+$i!8Ni!*Lq@3H&X z#PxkE7ZsY)ZeBkut*vN()?V?nuq`;YH)s2 z`Xa@iY*>M#^V)Lk{Bt|7#(cY&bDdzMkPr1nINU#1j}hE6FsjgeSYi|RF-G1wJIF~< zM7&dVNbwX;KM5st!bBPmXsUizvOUSKd~n&S$(5&caJYXdj!8T+Fs0BPq6APf;aZxCW zSLit;)BepzN2Ts3@wtgFB&mjSQq$t3LRFS`?aaZ{{zGI|;Y?^ds}JmA#mkr-3P9OP z#f%;5I2>pLyeb_Bc)0muDYPc^rpRyN39>YKp7-Y9xd)a}6c?)op0bY06Dir{ap-z{ zOH6oJD_;w4JLT&jkQ@4r4*L&|{Buw+QH&C}E9ugzAR5icsAQrUSvh&##0FT0t!^Op zjd-rJI?KDA)pR|ope6b{Qz-e4zVAx4HEpNWQ}H7ug+L zs(@GagV%oIrd7DXHi>$+O+2QVy%x3!9OE0;iB_Cs?<^m;VYFikC-{~1Q9`(hPdH*~ zxW!o&^=`9Q74?KnHPJh`TcNTWA;2;d>sfrTi%)-)aLn>og`pn|emi69zjyI_ZZI*v zi_cynv4x9+iSDR>d<(q;+jz+MOZ;8i#q1UmM3(j;!mB#s)kf)nZsys82{L(zQ}~jv zq;P19vRr<{VVN__%=0VG9YO8i=ru6X(9rT1M+#rVtZ*3Myf9U7<%>nYK(wtalLcjI z6zn&Fe=-@FTieFUYvjJCfs3!$yh5vZ)Uu6y1h)&^xCb{T6XSGs8_y2MI8jV^IEFA| zq!M1^`TScghL{Lov7|22p&_bq85eMc|5xeaHR^MnKHR_xY2@gqN7qEBGNH8!AyFrW Qn)a@?E|U3%qbhv+FRE(1tpET3 literal 0 HcmV?d00001 diff --git a/bin/logic/entity/Werewolf.class b/bin/logic/entity/Werewolf.class new file mode 100644 index 0000000000000000000000000000000000000000..9023c4ccc917a7817572861f4422de92f694e956 GIT binary patch literal 1796 zcma)6ZBrXn6n<_JvLs&K((ob_s#fY|k*;EE#b8TIS{fTlEiElo(PeYlEQH<6W+~wK zK|XcH@dr3gzxT5pf*n8j1N=vR(D9s2%G=Z*o>z?oyFn~{e=o8>uGB_Ij{DaYDSB@Q6aS8BSm%A9?z z&kH1{T+a=!3JmGR;^|JgMS;YOUsh?v(IJsSr$AiKEv6vQEzyP~OBsnXNK(WtKd6=; zv#M93?@+bGssV{NF-QQvqg7|YCFv57SqUKOoJhiJ&iqy_c6{itMFdc+ED>v&~wL8G!6L_Ok^~CaI$Sp zGg~JlK4Pl0x*aIxMf6Rup_jKS5}zEgMoeBwA&<{AObHCvD^{S&^DAr04$b?@E31GB zy6smt0@j(|{{>tSfw>jLe1fquo@ zlQib>g@$_qom`SxrCVaoSz$%uJ{I`agqAl!PkJF&VDE<#i+Dt1Zu>M^3B9FWl6VrS z>#o<1ugFqWt0B+qvcxy|mWgl!YJ%%~JgtY>7Q(>woP0Z0C{5rxm5@=FB^2MLq}76) zthFYo_taX+b33{wBoE&Z@PpLwdpA3~Y7F_{jQ(_O zNur5EJ3SL5rNEfppwo}!m7wPZ<2Oj7vw<#S=vf0j##!34M)&gu`i(>bL&kUmBfpYo z3~$l?P83VhyJ?Enfi85Sm-Zoalf4I{$Pfm=XhtXh^K_y-co&0|o25~bVv)qi;-tNR z_gc7qBFt_^gUd34#W@b1}?ERd!V{}X#JS1lVdOODH$)(n%u|qA^J>& zst+UR#}o!|hdxz|wy&A<0Bs4kFiVI8Zll;lCN!#;`P?GEtrwf8$Ia7ZLhtU;>i%VJc#T$M+b+4;Vkv zoZW+Rcd-hG%ACd|Dp3RGsevv@39L~DYWLq*j>p^nLO-{QCb~%q#pD5_b;xltQcOgN PWYgG6B(P4dF;xEruc&?) literal 0 HcmV?d00001 diff --git a/bin/logic/field/Map1.class b/bin/logic/field/Map1.class new file mode 100644 index 0000000000000000000000000000000000000000..8311cedad766aac5f398336ddd71d380a7b7b736 GIT binary patch literal 3722 zcmai1U2q%K89jG*t(D|;toSdoB{`0R6IlrsF~lS|aUpg{Ol^`_!ND=4T}vBz6IpVl zO=43ZFU)kN)6R6->68wIfzTOV(uV>u)GZmF%K)#P_Px{BKJW$!=kCguyp{)LynFYa z@Be)J?ae}fg!1N+H6=|6bWM3SA(8fzSOGmqaGCvuDK&OEg>=J05vWwR9Ho z3M{jMBnDaMC388m%o4F2J&nrel`V`zcvQz>a@HU`SH{2)(gM5kmUG@-u?jPmNjC!h z$-zc;>tsg5h~tQ?z_7r<PGjN+nIE}M3d6ep=ba>WY& zRs~uzj+wpA-mG$DNMSa`B-?K#%u1dxa14IO?vCj)1IMArE($nq8so;h)U-SoW})bRLPbtt4KslNMjiT7q{rlN$FVw zm+GYF0-vAf8_u81WZu9_c$rmXyz*ttxEA@AGG*)26d%pnxT&Yc8-Ov?S>c zqlBO7Smt}NrDGejWS|UchGd9tH}e(q(QCWY#05tuCS(IDc@C$6t?k;_yc|2XBqige z!p3r@#2yN`yQITg%n3Bxl?kijluN5t&gGA77qTm}cExrFV>nZ~QO;V=vR?_v0Xrn~ z!#);ChVJcTfvA z;+epY4K%IVgXQ+8+$nZh_j3X^Rfo&=8@(K7;ZuQ}HAxC^r!<2XXgzEI$c81z_ zhB|!Ewv;=40^3sV@(K7;-s8jTLXP^NhADUZgzEHrc7|d*LvbIpE#-tyU|Y()J^_Eq zdwuw3$RDBOuY9K!bn*I2^z+)yPk0YbBgPpU$0`!|BYLrpz4$l!@D28f9`uW&*e}lG z5pf*@;#WLH`~?Tamq?2LVNhv7N=f37GLFN_6+Eik#*p$Z(#q#}O!*IvsKBrq!{h1* zo=`8~s9MH|`a3+SeuQJ{7wA^M!ZGY|qXI`ylo7cD2><1nQn>$m>J#*&^v@8#hu&1= z>3ir)9lD49)W_&m|Bm?Fhj?TSDV5KCi|$pfKEY!dDWTOQw8j!mHHoI}6193gBm%_!P9D)(?y9^mR2@5j-Ov*^HO-sjPYYpn9CyuU^%nO~Qe4Ial6d}3biIOZo; zo+_$2-{7!j!7vbe3*E5~(V-6Czk}BJTWF5+>Hd2NM83PrReU%$beDpvOXV(CX_Q2s zAb}@ccYU6rO?Lx$l3@#JoZ%V_<~Y|Hlpcj^enqPx+@zjHq$?GRuVHj7@ivS^R0Di<|HFf-3S5@-=ag7VT}J<@Tec+ zT}GP6sbJmcw#-y-0C-PYBU>evT(Kkjlmq9we0Q>XR| zuKL$-Y7J-e)#b-{K6^aS*;IpOYS0VWt(Y zM>GW&Sk(+`eUUpaumZCf=3#6aFXJ|@;P*T*y@?#|@Qn0lT*U{J{TmNOvh8NvZ~pow zAM0>%gSArdDQ>!bpkWQSTs~T9WrZt^n!n*NFnDelrZf+Utm-sdn+HJJlbu7Jzk@Es zL;M;+9YRM*@TanUAF?5|jV=>Px# literal 0 HcmV?d00001 diff --git a/bin/logic/field/WhiteMap.class b/bin/logic/field/WhiteMap.class new file mode 100644 index 0000000000000000000000000000000000000000..6ac3341b1408c8060e06beb4946a24d5e9e4d855 GIT binary patch literal 794 zcma)3%TC)s6g}e@8=MDCh{B_#FF*<{Vm^S1B0;H;(pI8XDs?xpC&?gVBafkU%ZiWb zrkhskq94#N=x^`?h&$tyMwA63`Mx~o-gEB!zWn(Mz)P(7a2T3#I#40+D;Y=p<51=D zjX3h*GTb{5CxXW!8Sr<#0~zK%JccKt$uQkfiF|u}*pu0Z0@3KCp@_R8Qzjo3-F&DtL#uNevkmGykohM&WRH?4 z6Q3E{?T%sFKjk`!ZYgZFj6x}x@Muw4Bcu7TwR>%V##bO_!w3dRV9Y96H!f!+78pjnUtYK0X-};l< zwTjldR)0W$R9E+z83;*fKg`_MIs2Tw&$;)nzyJ6Xz&Ci2MM`0;*=l%otKq!W)+7FG zS!R(|7=GjY4uawDy^p?FP<~$LNw)yi1!)2TkW#qKr7+oTvYQ+T%8KWE;VMlE7lkR-6w+%gR~zU<&cqPL6#5FqS{4&jp+om! z5ID!e*}yn*{ZP1SB7;jZ`@}>)j4Wp8(Zx7U)xb5(3iKRJ3)O0pt4Po(M5S00s2e5* zU}o_t#g3s~dAjLZo6f;K12-`*I13D3_%9R#MU=BBDa;(cb^`6jRkWUI-_?P$-_(y= zP0ma#;#=yE{pWH)OLlx7u&_b?{usDU8~!y3?#V zfhX%^GabJ64izRYR!t!j$t=#jsGjyqH6ST2=*L;f8;mvNcnuTkI%|D`CIF(x|B@DmurB<67y z7N+rlnrvVOTeyxIX0by1xi~F+ja9CgU_?jJzQFhMThdc_i0={_7Dq*^4C7A!!bu7e zRP+FDM1W>&kN~EotGOc@Y|}c$F-PaA@&~M?uuFbr^6TV3809n1w_pLI%t3OTh~3U| z%;7Pr1XcKf{9^ER+DH-tzRZv6{1^}0z2IenFB1IrxqNd8xWZFBOCZma&G(YMd(Js? L=DfoUQh5FkxKM7{ literal 0 HcmV?d00001 diff --git a/bin/sharedObject/IRenderable.class b/bin/sharedObject/IRenderable.class new file mode 100644 index 0000000000000000000000000000000000000000..b81aba67171b16da90d94b601a06c2c7919b59b0 GIT binary patch literal 243 zcmYjLOHKko5PgLsBOr#QM;JEr0a&Y}<)YJ4 uLU&nx2P?0xCWC)_Ms-7*peCIUWIFF2ZG8wi9vbYR+hDIoRX*x%p??L?m^q99 literal 0 HcmV?d00001 diff --git a/bin/sharedObject/RenderableHolder.class b/bin/sharedObject/RenderableHolder.class new file mode 100644 index 0000000000000000000000000000000000000000..4c866df907f182f68eef8dd2d69e54054e5ee7e0 GIT binary patch literal 3415 zcma)8>30)V6#q?HI%ztT(y|p~t5w^AL{LOc6{Uy-1JnkKps3U2H657D#F;4)_kG`Y zabI!44HT%H8@4cBc3DjzOI`iJW@80*jzkA<(^XuO~{sdqnPUwhf zSn7|Np2+VU*)MWIa!5FN;h7`0*y`FG>1fo@w%*LYyr$&BR()HY|Wf@22b9(}DoL)~BRJ6(mBx{9WWoLelJo*B5F zh6OdY15tu8alp-s1T-u(un6-sH1#WeGewIH%tDh? zo?~FCR2sHx=7)suj(d{yIT_0lJI0G6!rLXYrJ+6J=1hCo^ej17!UP(yP)C=Bjw#Go(d$1~%X_4ReVg zTlND{tTNTr69%BlHye1CQ%FTIIU-2jIFv~xa0U8xFqek%9?1<{31%xExS^Sbc@;Kl zoh6XO)iQQ@-pCnMKc@=jnoEw~M)j@vb~R%=d{n}I=$oWW4oO;Wvk z6Ubv!2MaFDuj&s2u5Gg?S+3(7C}50*=DQw|_C_pMyU6r4+B+=K>^E=#wrp7eJ6qT) zDtS~M(vdvX0tY1>E)P=`dqr#D4zSBKI^qx^)K@|jhYo5M)fIhBDs&uVc(z-xa!J(? z%gNos6L-4yXdH)#PtJC8rsFPBUAJ&hHKRE0VV4Nojl_DNf&1|QxgRtA9SRmZ%U&)C z-OIl9Z(vyK8uy%?4b0pD9wCs>~F1mUGZOAd(pcmBa96n`YM1|iWw_m+*NG!7QbdF6B}NKnGZ@ zLTtu`SQ9z#RvMu37&^aIn@d*pn z*<2&pq9j{uB-@lEQzO|?g};C~0D5_?_MscA$lhvfCDmVp@TV_*~2MuA}T?tmh}pWon8!zANt)S>C@Mmjq`CYh~BKv^Vet%$-kboA&{BA%o(SzQ~#7$0L}&-Wj} z`Et5s0#C(cq!V~fSCq?Qvs(2QJTSV~~ zOw22Il`v!!aWwqJPnP8|&R@gpTp1pkH&p2-DV0?>OKyE;X>C%@!?K(eI&VwJ^G_3b zZf=TV>*$-nTl_3l&yO*y@o4NQ)nQJ;!?TRIm-E|cMGf8#yi2a-uLJKX{v}=>qq%&% f&tVK7;6uJ8g3l@Y5?|vRNR+Y_eTU;bSDpU=<~ly2 literal 0 HcmV?d00001 diff --git a/res/John.png b/res/John.png new file mode 100644 index 0000000000000000000000000000000000000000..4a84953fa0932e974469cb1def7ff858f113abed GIT binary patch literal 426 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Ì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 literal 0 HcmV?d00001 diff --git a/res/Rabbi.png b/res/Rabbi.png new file mode 100644 index 0000000000000000000000000000000000000000..8e1f6a65c141769f59ee80a469b952d18bea6ded GIT binary patch literal 903 zcmV;219<$2P)Px&K}keGRCr$Pnz3#ZK@f&>G>FPjAfd=20wn~hNHlcVNGWVZyoLMZ0W1n6S2P4# z7a##rDnJm~MS^Tvo&XXhN|0!1FfZW9gD1*PvNyA{ci6sNH@0tg_V)hyc6N96lDWV? zN#M^v7X=8OfQO&H4>clueY{)n1DZnfe3`FrIJyPk}w<&FC;2Sl2l@}cA`$F zR5~Rf3NR*M@awmsS84vb@t+cag-8N=vejxCcFkr}M1ZSZ<^)6m2mz?Dl!RAzFM-Ls ztt}@44)*pScDUN*PC#%1-~-d4AQfWf35WuaLFGz9VF=KYFtY;CXi67GQW8EqxHg-! zK(GSfgWEPmt|TAly!PJuJ^U7O;s;DG7xY zfFt4Qm7j*^q_Y4`5n57-qjdnZkLCZJfG7Z2YSAHq1fb`!x@{dm$9BKpH#~eM+QUzb z6%&gAbg3D<0CY&?ML@M$g7 zJbM3c?BDzH628mj@^ldptN^wLmwMJ#Z{_VbD557)lmPA6$NPHE0>KG@Z*pWky-^a7 zfcZC1Qenbape4bXfM5lXZh8*)_rYT{BZSwfJGm32dc6)NoleIv#p`%cOM;kyC;-{_ z+dOCUG&d`7Bv5Px&NJ&INRCr$Pnz3%vP!xvi7a%MwNTmX`@C02+L^~uZ2$(7X5)4_PEKHFYP#%Ep zc?(n}LnRV679=JLtw2Rlg~ZTiLM#Mv=`V2)J~`*wzIE*DE~)K%9iQ+2?>WbIqJ_Z! zqQK){r~p(BC<%e|=7~D9{0oeci$6{H3J-@vYprJO09WO`J0N%fv8g%5PTUL79MD)_Pu0$+ znj9C8?@n-T0JPg}^Twyw>sb*01F*AWbK2N&@&TtjPLi7gf(P()Ys)y`<@UC50A5v% zZeDd#m>W!$&)WK_t3dDoumnKz)9q)Ln66Hc);e`c+O?nB0TqDLDgct>@!0(P;l^Y0 z`TB0MT!0=Q=dG`;#ij}A_XXNSl(-L|4hRka2m=HKfa7>(_x}E>RurdkX`PVR0l@>H z%5$h5-D8_O7lXi;E z4hR+i7x-W>Fc4jDgE{4;5(0BEa%D*z5W?jp6>ALmh5fvglyy95dY;Pd{zRW+c{ zrKKek1HJE;lpF5un)6{k?fkGUohP$<0m%`;1At-@D6MkZ^UaL|v=>}j09xhq9_OtJ m= 1) { + gameScreen.paintComponent(); + logic.logicUpdate(); + RenderableHolder.getInstance().update(); + InputUtility.updateInputState(); + delta--; + } + } + }; + animation.start(); } } diff --git a/src/drawing/GameScreen.java b/src/drawing/GameScreen.java new file mode 100644 index 0000000..3a93850 --- /dev/null +++ b/src/drawing/GameScreen.java @@ -0,0 +1,74 @@ +package drawing; + +import input.InputUtility; +import javafx.scene.canvas.Canvas; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseButton; +import javafx.scene.input.MouseEvent; +import javafx.scene.paint.Color; +import sharedObject.IRenderable; +import sharedObject.RenderableHolder; + +public class GameScreen extends Canvas{ + public GameScreen(double width, double height) { + super(width, height); + this.setVisible(true); + this. + addListerner(); + } + + public void addListerner() { + this.setOnKeyPressed((KeyEvent event) -> { + InputUtility.setKeyPressed(event.getCode(), true); + }); + + this.setOnKeyReleased((KeyEvent event) -> { + InputUtility.setKeyPressed(event.getCode(), false); + }); + + this.setOnMousePressed((MouseEvent event) -> { + if (event.getButton() == MouseButton.PRIMARY) + InputUtility.mouseLeftDown(); + }); + + this.setOnMouseReleased((MouseEvent event) -> { + if (event.getButton() == MouseButton.PRIMARY) + InputUtility.mouseLeftRelease(); + }); + + this.setOnMouseEntered((MouseEvent event) -> { + InputUtility.mouseOnScreen = true; + }); + + this.setOnMouseExited((MouseEvent event) -> { + InputUtility.mouseOnScreen = false; + }); + + this.setOnMouseMoved((MouseEvent event) -> { + if (InputUtility.mouseOnScreen) { + InputUtility.mouseX = event.getX(); + InputUtility.mouseY = event.getY(); + } + }); + + this.setOnMouseDragged((MouseEvent event) -> { + if (InputUtility.mouseOnScreen) { + InputUtility.mouseX = event.getX(); + InputUtility.mouseY = event.getY(); + } + }); + } + + public void paintComponent() { + GraphicsContext gc = this.getGraphicsContext2D(); + gc.setFill(Color.BLACK); + gc.fillRect(0, 0, getWidth(), getHeight()); + for (IRenderable entity : RenderableHolder.getInstance().getEntities()) { + // System.out.println(entity.getZ()); + if (entity.isVisible() && !entity.isDestroyed()) { + entity.draw(gc); + } + } + } +} diff --git a/src/input/InputUtility.java b/src/input/InputUtility.java new file mode 100644 index 0000000..9030143 --- /dev/null +++ b/src/input/InputUtility.java @@ -0,0 +1,45 @@ +package input; + +import java.util.ArrayList; + +import javafx.scene.input.KeyCode; + +public class InputUtility { + public static double mouseX,mouseY; + public static boolean mouseOnScreen = true; + private static boolean isLeftDown = false; + private static boolean isLeftClickedLastTick = false; + private static ArrayList keyPressed = new ArrayList<>(); + + public static boolean getKeyPressed(KeyCode keycode) { + return keyPressed.contains(keycode); + } + public static void setKeyPressed(KeyCode keycode,boolean pressed) { + if(pressed){ + if(!keyPressed.contains(keycode)){ + keyPressed.add(keycode); + } + }else{ + keyPressed.remove(keycode); + } + System.out.println(keyPressed); + } + + public static void mouseLeftDown(){ + isLeftDown = true; + isLeftClickedLastTick = true; + } + + public static void mouseLeftRelease(){ + isLeftDown = false; + } + + public static boolean isLeftClickTriggered(){ + return isLeftClickedLastTick; + } + + public static void updateInputState(){ + isLeftClickedLastTick = false; + } + +} diff --git a/src/logic/charClass/BaseCharClass.java b/src/logic/charClass/BaseCharClass.java deleted file mode 100644 index 1501668..0000000 --- a/src/logic/charClass/BaseCharClass.java +++ /dev/null @@ -1,5 +0,0 @@ -package logic.charClass; - -public class BaseCharClass { - -} diff --git a/src/logic/entity/BaseEntity.java b/src/logic/entity/BaseEntity.java deleted file mode 100644 index 70758f7..0000000 --- a/src/logic/entity/BaseEntity.java +++ /dev/null @@ -1,5 +0,0 @@ -package logic.entity; - -public class BaseEntity { - -} diff --git a/src/logic/entity/Entity.java b/src/logic/entity/Entity.java new file mode 100644 index 0000000..5186f21 --- /dev/null +++ b/src/logic/entity/Entity.java @@ -0,0 +1,49 @@ +package logic.entity; + +import sharedObject.IRenderable; + +public abstract class Entity implements IRenderable{ + protected double worldX,worldY; + public double screenX,screenY; + protected int z,radius; + protected boolean visible,destroyed; + protected int speed; + protected String direction; + + protected Entity(){ + visible = true; + destroyed = false; + } + + public abstract void attack(); + + public boolean canAttack(double x1,double y1,double x2,double y2,int attackRange) { + return (Math.abs(x1-x2) < attackRange && Math.abs(y1-y2) < attackRange); + } + + @Override + public int getZ() { + // TODO Auto-generated method stub + return z; + } + + @Override + public boolean isDestroyed() { + // TODO Auto-generated method stub + return destroyed; + } + + @Override + public boolean isVisible() { + // TODO Auto-generated method stub + return visible; + } + + public double getWorldX() { + return worldX; + } + + public double getWorldY() { + return worldY; + } +} diff --git a/src/logic/entity/Player.java b/src/logic/entity/Player.java new file mode 100644 index 0000000..1ad1206 --- /dev/null +++ b/src/logic/entity/Player.java @@ -0,0 +1,67 @@ +package logic.entity; + + + +import input.InputUtility; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.input.KeyCode; +import javafx.scene.paint.Color; +import logic.game.GameLogic; +import sharedObject.RenderableHolder; + +public class Player extends Entity{ + + public GameLogic gameLogic; + public Player(int x, int y,GameLogic gameLogic) { + this.worldX = x; + this.worldY = y; + this.speed = 3; + this.radius = 32; + this.gameLogic = gameLogic; + this.direction = "right"; + screenX = gameLogic.getGameScreen().getWidth()/2-radius; + screenY = gameLogic.getGameScreen().getHeight()/2-radius; + + } + @Override + public void draw(GraphicsContext gc) { + // TODO Auto-generated method stub + switch(direction) { + case "left": + gc.drawImage(RenderableHolder.playerLeft, screenX, screenY); + break; + case "right": + gc.drawImage(RenderableHolder.playerRight, screenX, screenY); + break; + } +// gc.setFill(Color.BLACK); +// gc.fillRect(gameLogic.getGameScreen().getWidth()/2, gameLogic.getGameScreen().getHeight()/2, 1, 1); + } + + public void attack() { + + } + + public void update() { + // TODO Auto-generated method stub + if (InputUtility.getKeyPressed(KeyCode.W)) { + worldY -= speed; + } + if (InputUtility.getKeyPressed(KeyCode.A)) { + worldX -= speed; + direction = "left"; + } + if (InputUtility.getKeyPressed(KeyCode.S)) { + worldY += speed; + } + if (InputUtility.getKeyPressed(KeyCode.D)) { + worldX += speed; + direction = "right"; + } + + if (InputUtility.isLeftClickTriggered()) { + + } + } + +} diff --git a/src/logic/entity/Werewolf.java b/src/logic/entity/Werewolf.java new file mode 100644 index 0000000..6cef8cf --- /dev/null +++ b/src/logic/entity/Werewolf.java @@ -0,0 +1,52 @@ +package logic.entity; + +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; +import logic.game.GameLogic; +import sharedObject.RenderableHolder; + + +public class Werewolf extends Entity{ + private double angle = 0; + public GameLogic gameLogic; + public Werewolf(int x, int y,GameLogic gameLogic) { + this.worldX = x; + this.worldY = y; + this.z = -100; + this.speed =1; + this.gameLogic = gameLogic;; + } + @Override + public void draw(GraphicsContext gc) { + // TODO Auto-generated method stub + screenX = worldX-gameLogic.getPlayer().worldX+gameLogic.getPlayer().screenX; + screenY = worldY-gameLogic.getPlayer().worldY+gameLogic.getPlayer().screenY; + gc.drawImage(RenderableHolder.johnSprite, screenX, screenY); + } + + public void update(Player player) { + // TODO Auto-generated method stub + if (!canAttack(player.worldX, player.worldY, worldX, worldY, 24)) { + angle = Math.atan2(player.worldY-worldY,player.worldX-worldX); + double xspeed = Math.cos(angle) * speed; + double yspeed = Math.sin(angle) * speed; + + if (xspeed<0) + direction = "left"; + else direction = "right"; + + worldX += xspeed; + worldY += yspeed; + } + + else { + attack(); + } + } + @Override + public void attack() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/logic/field/Map1.java b/src/logic/field/Map1.java new file mode 100644 index 0000000..b8d3970 --- /dev/null +++ b/src/logic/field/Map1.java @@ -0,0 +1,118 @@ +package logic.field; + +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.WritableImage; +import javafx.scene.shape.Rectangle; +import logic.entity.Player; +import logic.game.GameLogic; +import sharedObject.IRenderable; +import sharedObject.RenderableHolder; + +public class Map1 implements IRenderable{ + public GameLogic gameLogic; + private WritableImage[] croppedImage = new WritableImage[4]; + + public Map1(GameLogic gameLogic) { + this.gameLogic = gameLogic; + croppedImage[0] = new WritableImage(RenderableHolder.mapSprite.getPixelReader(), + 0 * tileSize, 0, tileSize, tileSize); + croppedImage[1] = new WritableImage(RenderableHolder.mapSprite.getPixelReader(), + 1 * tileSize, 0, tileSize, tileSize); + croppedImage[2] =new WritableImage(RenderableHolder.mapSprite.getPixelReader(), + 2 * tileSize, 0, tileSize, tileSize); + } + int tileSize = 64; + private static int[][] field = { { -1, 0, 0, 0, 0, 0, 0, 0, -1,-1, 0, 0, 0, 0, 0, 0, 0, -1, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {-1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, -2, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, -2, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, -1, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,-1, 0, 0, 0, 0, 0, 0, 0, -1, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {-1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, -2, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, -2, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, -1, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,-1, 0, 0, 0, 0, 0, 0, 0, -1, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {-1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, -2, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, -2, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, -1, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,-1, 0, 0, 0, 0, 0, 0, 0, -1, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {-1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, -2, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, -2, 0, 0, 0, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + { -1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, -1, 0, 0, 0, 0, 0 ,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, -1,0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; + + public int getTerrain(int x, int y) { + if (x < 0 || x >= field[0].length || y < 0 || y >= field.length) + return -3; + return field[y][x]; + } + + private int getTileIndex(int x, int y) { + int terrain = getTerrain(x, y); + if (terrain <= 0 && terrain >= -2) + return -terrain; + else + return 0; + } + + @Override + public int getZ() { + return -9999; + } + + @Override + public void draw(GraphicsContext gc) { + + int worldCol = 0; + int worldRow = 0; + + while(worldCol < field[0].length && worldRow < field.length) { + int worldX = worldCol*tileSize; + int worldY = worldRow*tileSize; + double screenX = worldX-gameLogic.getPlayer().getWorldX()+gameLogic.getPlayer().screenX; + double screenY = worldY-gameLogic.getPlayer().getWorldY()+gameLogic.getPlayer().screenY; + +// if(worldX>gameLogic.getPlayer().getWorldX()-gameLogic.getPlayer().screenX && +// worldXgameLogic.getPlayer().getWorldY()-gameLogic.getPlayer().screenY && +// worldY>gameLogic.getPlayer().getWorldY()+gameLogic.getPlayer().screenY ) { + if(screenX>-64 && screenX-64 && screenY < gameLogic.getGameScreen().getHeight()) { + gc.drawImage(croppedImage[Math.abs(getTileIndex(worldCol, worldRow))], screenX, screenY); + + } + + worldCol++; + + if (worldCol == field[0].length) { + worldCol = 0; + worldRow++; + } + } + } + + @Override + public boolean isDestroyed() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isVisible() { + // TODO Auto-generated method stub + return true; + } +} diff --git a/src/logic/field/WhiteMap.java b/src/logic/field/WhiteMap.java new file mode 100644 index 0000000..cc0c07e --- /dev/null +++ b/src/logic/field/WhiteMap.java @@ -0,0 +1,32 @@ +package logic.field; + +import javafx.scene.canvas.GraphicsContext; +import sharedObject.IRenderable; + +public class WhiteMap implements IRenderable{ + + @Override + public int getZ() { + // TODO Auto-generated method stub + return -9999; + } + + @Override + public void draw(GraphicsContext gc) { + // TODO Auto-generated method stub + gc.fillRect(0, 0, 768, 576); + } + + @Override + public boolean isDestroyed() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isVisible() { + // TODO Auto-generated method stub + return true; + } + +} diff --git a/src/logic/game/GameLogic.java b/src/logic/game/GameLogic.java new file mode 100644 index 0000000..7376cfe --- /dev/null +++ b/src/logic/game/GameLogic.java @@ -0,0 +1,50 @@ +package logic.game; + +import java.util.ArrayList; +import java.util.List; + +import drawing.GameScreen; +import logic.entity.Entity; +import logic.entity.Player; +import logic.entity.Werewolf; +import logic.field.Map1; +import logic.field.WhiteMap; +import sharedObject.RenderableHolder; + +public class GameLogic { + private List gameObjectContainer; + + private GameScreen gameScreen; + private Player player; + private Werewolf werewolf; + public GameLogic(GameScreen gameScreen){ + this.gameObjectContainer = new ArrayList(); + this.gameScreen = gameScreen; + player = new Player(384,288,this); + + Map1 field = new Map1(this); + RenderableHolder.getInstance().add(field); + + werewolf = new Werewolf(100,100,this); + addNewObject(player); + addNewObject(werewolf); + } + + public GameScreen getGameScreen() { + return gameScreen; + } + + protected void addNewObject(Entity entity){ + gameObjectContainer.add(entity); + RenderableHolder.getInstance().add(entity); + } + + public void logicUpdate(){ + werewolf.update(player); + player.update(); + } + + public Player getPlayer() { + return player; + } +} diff --git a/src/sharedObject/IRenderable.java b/src/sharedObject/IRenderable.java new file mode 100644 index 0000000..97e21d6 --- /dev/null +++ b/src/sharedObject/IRenderable.java @@ -0,0 +1,10 @@ +package sharedObject; + +import javafx.scene.canvas.GraphicsContext; + +public interface IRenderable { + public int getZ(); + public void draw(GraphicsContext gc); + public boolean isDestroyed(); + public boolean isVisible(); +} diff --git a/src/sharedObject/RenderableHolder.java b/src/sharedObject/RenderableHolder.java new file mode 100644 index 0000000..9f4be65 --- /dev/null +++ b/src/sharedObject/RenderableHolder.java @@ -0,0 +1,68 @@ +package sharedObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import javafx.scene.image.Image; +import javafx.scene.media.AudioClip; +import logic.entity.Player; +import logic.entity.Werewolf; + +public class RenderableHolder { + private static final RenderableHolder instance = new RenderableHolder(); + + private List entities; + private Comparator comparator; + public static Image playerLeft; + public static Image playerRight; + public static Image johnSprite; + public static Image mapSprite; + + static { + loadResource(); + } + + public RenderableHolder() { + entities = new ArrayList(); + comparator = (IRenderable o1, IRenderable o2) -> { + if (o1.getZ() > o2.getZ()) + return 1; + return -1; + }; + } + + public static RenderableHolder getInstance() { + return instance; + } + + public static void loadResource() { + mapSprite = new Image(ClassLoader.getSystemResource("Map.png").toString()); + playerLeft = new Image(ClassLoader.getSystemResource("RabbiLeft.png").toString()); + playerRight = new Image(ClassLoader.getSystemResource("Rabbi.png").toString()); + johnSprite = new Image(ClassLoader.getSystemResource("John.png").toString()); + } + + public void add(IRenderable entity) { + System.out.println("add"); + entities.add(entity); + Collections.sort(entities, comparator); + for(IRenderable x: entities){ + if(x instanceof Werewolf) System.out.println("WereWolf"); + if(x instanceof Player) System.out.println("player"); + + } + } + + public void update() { + for (int i = entities.size() - 1; i >= 0; i--) { + if (entities.get(i).isDestroyed()) + entities.remove(i); + } + } + + public List getEntities() { + return entities; + } +}