From c85083fc926fc797a3cc5289f2b299f3032e5329 Mon Sep 17 00:00:00 2001 From: josua Date: Tue, 5 May 2020 22:04:33 +1000 Subject: [PATCH] first commit --- .classpath | 8 + .project | 17 ++ .settings/org.eclipse.jdt.core.prefs | 11 + bin/maze_game/Main.class | Bin 0 -> 1342 bytes bin/maze_game/entity/Entity.class | Bin 0 -> 1473 bytes bin/maze_game/entity/EntityPlayer.class | Bin 0 -> 1692 bytes bin/maze_game/graphics/GameWindow.class | Bin 0 -> 3088 bytes bin/maze_game/graphics/GraphicsHandler.class | Bin 0 -> 867 bytes bin/maze_game/graphics/GraphicsShader.class | Bin 0 -> 1162 bytes bin/maze_game/helpers/MathHelpers.class | Bin 0 -> 2747 bytes bin/maze_game/helpers/ResourceLoader.class | Bin 0 -> 2825 bytes bin/maze_game/helpers/range/Range2i.class | Bin 0 -> 477 bytes bin/maze_game/helpers/range/Range3i.class | Bin 0 -> 525 bytes bin/maze_game/helpers/range/Range4i.class | Bin 0 -> 574 bytes bin/maze_game/helpers/vec/Vec2d.class | Bin 0 -> 2289 bytes bin/maze_game/helpers/vec/Vec2i.class | Bin 0 -> 2862 bytes bin/maze_game/helpers/vec/Vec3d.class | Bin 0 -> 2470 bytes bin/maze_game/helpers/vec/Vec3i.class | Bin 0 -> 3184 bytes bin/maze_game/helpers/vec/Vec4d.class | Bin 0 -> 2734 bytes bin/maze_game/helpers/vec/Vec4i.class | Bin 0 -> 3554 bytes bin/maze_game/init/Entities.class | Bin 0 -> 501 bytes bin/maze_game/init/Mazes.class | Bin 0 -> 750 bytes bin/maze_game/init/Models.class | Bin 0 -> 440 bytes bin/maze_game/input/InputKeyboard.class | Bin 0 -> 1879 bytes bin/maze_game/mainloop/FpsCounter.class | Bin 0 -> 1170 bytes bin/maze_game/mainloop/MainloopHandler.class | Bin 0 -> 1953 bytes bin/maze_game/maze/Maze.class | Bin 0 -> 1991 bytes bin/maze_game/maze/MazeDrawer.class | Bin 0 -> 4070 bytes bin/maze_game/models/Model.class | Bin 0 -> 969 bytes bin/maze_game/models/ModelPlayer.class | Bin 0 -> 611 bytes bin/resources/maze/maze0.txt | 32 +++ bin/resources/maze/maze1.txt | 32 +++ bin/resources/maze/maze2.txt | 32 +++ bin/resources/maze/maze3.txt | 32 +++ bin/resources/maze/maze4.txt | 32 +++ bin/resources/maze/maze5.txt | 32 +++ bin/resources/maze/maze6.txt | 35 ++++ bin/resources/maze/maze7.txt | 0 bin/resources/maze/maze8.txt | 0 bin/resources/maze/maze9.txt | 0 bin/resources/shader/entity.fsh | 9 + bin/resources/shader/entity.vsh | 16 ++ bin/resources/shader/environment.fsh | 9 + bin/resources/shader/environment.vsh | 12 ++ src/maze_game/Main.java | 34 ++++ src/maze_game/entity/Entity.java | 64 ++++++ src/maze_game/entity/EntityPlayer.java | 49 +++++ src/maze_game/graphics/GameWindow.java | 118 +++++++++++ src/maze_game/graphics/GraphicsHandler.java | 25 +++ src/maze_game/graphics/GraphicsShader.java | 34 ++++ src/maze_game/helpers/MathHelpers.java | 112 ++++++++++ src/maze_game/helpers/ResourceLoader.java | 86 ++++++++ src/maze_game/helpers/range/Range2i.java | 17 ++ src/maze_game/helpers/range/Range3i.java | 19 ++ src/maze_game/helpers/range/Range4i.java | 21 ++ src/maze_game/helpers/vec/Vec2d.java | 74 +++++++ src/maze_game/helpers/vec/Vec2i.java | 100 +++++++++ src/maze_game/helpers/vec/Vec3d.java | 80 ++++++++ src/maze_game/helpers/vec/Vec3i.java | 112 ++++++++++ src/maze_game/helpers/vec/Vec4d.java | 88 ++++++++ src/maze_game/helpers/vec/Vec4i.java | 125 ++++++++++++ src/maze_game/init/Entities.java | 12 ++ src/maze_game/init/Mazes.java | 20 ++ src/maze_game/init/Models.java | 9 + src/maze_game/input/InputKeyboard.java | 78 +++++++ src/maze_game/mainloop/FpsCounter.java | 25 +++ src/maze_game/mainloop/MainloopHandler.java | 70 +++++++ src/maze_game/maze/Maze.java | 82 ++++++++ src/maze_game/maze/MazeDrawer.java | 203 +++++++++++++++++++ src/maze_game/models/Model.java | 40 ++++ src/maze_game/models/ModelPlayer.java | 20 ++ src/resources/maze/maze0.txt | 32 +++ src/resources/maze/maze1.txt | 32 +++ src/resources/maze/maze2.txt | 32 +++ src/resources/maze/maze3.txt | 32 +++ src/resources/maze/maze4.txt | 32 +++ src/resources/maze/maze5.txt | 32 +++ src/resources/maze/maze6.txt | 35 ++++ src/resources/maze/maze7.txt | 0 src/resources/maze/maze8.txt | 0 src/resources/maze/maze9.txt | 0 src/resources/shader/entity.fsh | 9 + src/resources/shader/entity.vsh | 16 ++ src/resources/shader/environment.fsh | 9 + src/resources/shader/environment.vsh | 12 ++ 85 files changed, 2299 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 bin/maze_game/Main.class create mode 100644 bin/maze_game/entity/Entity.class create mode 100644 bin/maze_game/entity/EntityPlayer.class create mode 100644 bin/maze_game/graphics/GameWindow.class create mode 100644 bin/maze_game/graphics/GraphicsHandler.class create mode 100644 bin/maze_game/graphics/GraphicsShader.class create mode 100644 bin/maze_game/helpers/MathHelpers.class create mode 100644 bin/maze_game/helpers/ResourceLoader.class create mode 100644 bin/maze_game/helpers/range/Range2i.class create mode 100644 bin/maze_game/helpers/range/Range3i.class create mode 100644 bin/maze_game/helpers/range/Range4i.class create mode 100644 bin/maze_game/helpers/vec/Vec2d.class create mode 100644 bin/maze_game/helpers/vec/Vec2i.class create mode 100644 bin/maze_game/helpers/vec/Vec3d.class create mode 100644 bin/maze_game/helpers/vec/Vec3i.class create mode 100644 bin/maze_game/helpers/vec/Vec4d.class create mode 100644 bin/maze_game/helpers/vec/Vec4i.class create mode 100644 bin/maze_game/init/Entities.class create mode 100644 bin/maze_game/init/Mazes.class create mode 100644 bin/maze_game/init/Models.class create mode 100644 bin/maze_game/input/InputKeyboard.class create mode 100644 bin/maze_game/mainloop/FpsCounter.class create mode 100644 bin/maze_game/mainloop/MainloopHandler.class create mode 100644 bin/maze_game/maze/Maze.class create mode 100644 bin/maze_game/maze/MazeDrawer.class create mode 100644 bin/maze_game/models/Model.class create mode 100644 bin/maze_game/models/ModelPlayer.class create mode 100644 bin/resources/maze/maze0.txt create mode 100644 bin/resources/maze/maze1.txt create mode 100644 bin/resources/maze/maze2.txt create mode 100644 bin/resources/maze/maze3.txt create mode 100644 bin/resources/maze/maze4.txt create mode 100644 bin/resources/maze/maze5.txt create mode 100644 bin/resources/maze/maze6.txt create mode 100644 bin/resources/maze/maze7.txt create mode 100644 bin/resources/maze/maze8.txt create mode 100644 bin/resources/maze/maze9.txt create mode 100644 bin/resources/shader/entity.fsh create mode 100644 bin/resources/shader/entity.vsh create mode 100644 bin/resources/shader/environment.fsh create mode 100644 bin/resources/shader/environment.vsh create mode 100644 src/maze_game/Main.java create mode 100644 src/maze_game/entity/Entity.java create mode 100644 src/maze_game/entity/EntityPlayer.java create mode 100644 src/maze_game/graphics/GameWindow.java create mode 100644 src/maze_game/graphics/GraphicsHandler.java create mode 100644 src/maze_game/graphics/GraphicsShader.java create mode 100755 src/maze_game/helpers/MathHelpers.java create mode 100644 src/maze_game/helpers/ResourceLoader.java create mode 100755 src/maze_game/helpers/range/Range2i.java create mode 100755 src/maze_game/helpers/range/Range3i.java create mode 100755 src/maze_game/helpers/range/Range4i.java create mode 100755 src/maze_game/helpers/vec/Vec2d.java create mode 100755 src/maze_game/helpers/vec/Vec2i.java create mode 100755 src/maze_game/helpers/vec/Vec3d.java create mode 100755 src/maze_game/helpers/vec/Vec3i.java create mode 100755 src/maze_game/helpers/vec/Vec4d.java create mode 100755 src/maze_game/helpers/vec/Vec4i.java create mode 100644 src/maze_game/init/Entities.java create mode 100644 src/maze_game/init/Mazes.java create mode 100644 src/maze_game/init/Models.java create mode 100644 src/maze_game/input/InputKeyboard.java create mode 100644 src/maze_game/mainloop/FpsCounter.java create mode 100644 src/maze_game/mainloop/MainloopHandler.java create mode 100644 src/maze_game/maze/Maze.java create mode 100644 src/maze_game/maze/MazeDrawer.java create mode 100644 src/maze_game/models/Model.java create mode 100644 src/maze_game/models/ModelPlayer.java create mode 100644 src/resources/maze/maze0.txt create mode 100644 src/resources/maze/maze1.txt create mode 100644 src/resources/maze/maze2.txt create mode 100644 src/resources/maze/maze3.txt create mode 100644 src/resources/maze/maze4.txt create mode 100644 src/resources/maze/maze5.txt create mode 100644 src/resources/maze/maze6.txt create mode 100644 src/resources/maze/maze7.txt create mode 100644 src/resources/maze/maze8.txt create mode 100644 src/resources/maze/maze9.txt create mode 100644 src/resources/shader/entity.fsh create mode 100644 src/resources/shader/entity.vsh create mode 100644 src/resources/shader/environment.fsh create mode 100644 src/resources/shader/environment.vsh diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..d6270b3 --- /dev/null +++ b/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..a81845c --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + RoboticsAndGameDesignMazeGame + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/bin/maze_game/Main.class b/bin/maze_game/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..af60830873f9e107c03d0b18e9c28b5af5527ce5 GIT binary patch literal 1342 zcmah}>r&HD5dID=4XNRNRW23;Y*C3Kcq^ia+_VK0EF=724sE6llO~-sz?7HpS!@wz zWX1>Zp&a)lXu?=^rgLujcK6$Fcl-Uv*KYu(u`Qv2p{2-Aw7onpYHFJ6ri3s<+W|k~ zs=>{?y1sv)WgUjdv2Nz9V}_e4-ym=EQbEs_)nzi@b^%F-Xwld!a5HCUHp6HDUL^m9 zWtH4O;;`bO$R<)UctzlY?lsfVor=2XZW}IupkWc8q5F#C6T$vO6P{*uQ+MVVLh(d~ z&hiz0+}1sl$GU1hTFQhUp|JNf?g&i0#SrKUVPnT z=!x&9e3>>KTQ~E`L`KGS^h>zG(B@YHgeD1ht^}$heH0U(#iRlmQ5p9! zCE)=>XE54j4hkM(np(jt>t4wsEe8Y17Br)z*=6-e%c>bIJC#dD@d!^OJZ9+k{rv$` z@D$HTzpPcNkVx^wKYhwXc~-%5K_x^SWW2zc=C!G}!fG%{?O-2uT=|vcSa-9LIRrH0XY8bje?Bh8`YPfZQF*@C@A%1}g zI^C_|URC^tPNAM*<_nTl%+bpkUT;?sKgF9ftoZ~+T<$%z_MwA@bpZVsr*#HH)EzOZ T+;D*0DmJl2gcv^1+JMYYH62Yc literal 0 HcmV?d00001 diff --git a/bin/maze_game/entity/Entity.class b/bin/maze_game/entity/Entity.class new file mode 100644 index 0000000000000000000000000000000000000000..158a5db2a5fe82bd69b9a034edd80b127841c8f2 GIT binary patch literal 1473 zcmah|+fvg|6kUf_VoSIPQt*O+7i?2C3U~#tRJ7WPiq_E=4Q&X)H0h)jMSp?^XLQu@ z)mL=@9bx+QuWPTp_qXp~z5*D=O$7}CT}9)mdEYXMrf#|wyE3m| z3=Rchfwoy=&d?phwe*RpSu*M-f7+iYBxXKs=FC&`!U9 zK!{=swn~RiVu`0xiChFMU4??p^0rMy1W|$3jP07&9u=od|CTZ3m;&t?FK;+G!?)$T zCJa|*Y}UW64(Ko3$#Q(tEtq~3eb}v_Um&&tufB2>dt?>iDcdbbB>PlsLSuw@_p68_ zL6)EJKP4qe6$b*zd=!UpSb;9k>G_uKJf5{2-7A?ck4u@MAr(h3D9~g%w_SVM^NWMi zgcMJYkITyYFs$Mz8X31NBOO<90w)Dj%SrjhZ_SJsC19J+Db_QYnfAnkOqp{$bWA)kY&a z={@rE=D00~r>VM1hvXKapWO{{@j@ImwwN~|$B$=&9KJw97pRms^L2;X2A*BoC$wlQ z*mAd}8BmZs)fh;o7%DjyYoJ#12YgRd?(}4_^!vq+!#s3vIO|59lkX z)3il&FQfM(_VN~6#K1!J)D}MDpc0bmMGSq$vETDt`PGO{) zO^mQ?S<X6q&!cQ-Kj zs&D=Swr@T;<6Du^jt@Ti;Gd+9dhRA;(gEu1%-#FrJLfy+JLlft|NiAy09R2}5Mr39 z>0gVosn>)m>b~Xgs=45|Ve7lXRS;nqI|jngyI|EVe~}@aOqCcS%T7f^5k~y3vexXHij?;IeIX}FrGXPCD{ixt1i}> zwJqV^*0*fIFswO-ZkKe|lI!+n#IIT&!}%^(Mt9s9If4f=wk^+c>I_q_ z4>h0KjN%Gr6{rj&9ha>JAx7$tw~?W!3QL+h83l-u5!#t&0~$ARm&v3l=d3O zyLgWr7*1oC>YPkGGQ&Wt!OC7$uLzf6x+|iNRhy?6fJpcpRu!y}q8*iv0dstWUh0*mN4GDB zk2yYp#-KD@hb(FgEZ>IlX#V{`(<2{njensKrq98O|{{v;iyqD{K*-w@(ET*miwjh|pPP$b>Tx~&N1 qFJD8_q@Sv7KqLLuFoX)t!VttgfXH8nvp=yO`UBSp_=q+`F#iRc|ERzK literal 0 HcmV?d00001 diff --git a/bin/maze_game/graphics/GameWindow.class b/bin/maze_game/graphics/GameWindow.class new file mode 100644 index 0000000000000000000000000000000000000000..697e3322bc56019858adb5f6b2fd4d5fd1bdb046 GIT binary patch literal 3088 zcmai0`*#~x5&o`M@=Ee1v7OkBla@NPw36dSiAzHhr=f}bs1!MIqu7pPsI!vR(#9*T zvRXw+c(jy9cr`p)XbGVd3WPVrNgSmqDFs@fz;7JN51a!(arhrNhw$B%8q3t2>PWNq z&d!}XGv7S)#(!SA0pPv(qly-RI|}+~V>YK3jA+i$OL;R>j*fCSWfrq`RfSKW{g{42 zk6L;$7d?I{?y1?gPPJCOD+EMBpmmp7 zG~L|-N;onp;EUN=BLoGjHH6R>LOVKDbO@}qom|wa9?MzLoHbXCjwVN@G_1usfq-Ph zsl`)rL`Ap2h9%PvR(O5E7(SUXO0H=a16VK6BhUAme4|_DXpB zKvy`qq$lM%W-&JynN-ly+afJ{mxephE3jG`P>%ph%=G%P_GCQ`bcwkv}n8i}Xjm9P2XPipg zx|7xLK0HXj_obz?30%#&pX{>zR3h zp>QI(0?^OH*=>Xi(8Ag+8F+gEEDbO4$fh5{wK z9D;$Iin*0N8Q7{J4^v=W&Kfn`iK01YJB6g3@hVQ>_VE8r?MOU`c@$Jw0=F%BTQ@j5 z?6njPMQIotK-rq5F#(i_tP~EyfvbXWtX?`hrkh0#B~)l^Q>IFR=orah5LKK~agv}f zox1f}!)bY&ziMXPycGSghL1>2Yu+$(c?Q_P;~Jj8#~ApW)o^xz-nUBVWP4kaG>gXm zN+E4HhxD{%Fok3=tV!K5<-Wo6xp|YOHtflc5q!n0+{};TtkaR6gYB z)jf`*pDG9OO?*qm3(Me^ZK@77YfHno@gm{&a=@##u6kpvxTY2Lv?R^4%j)_rE~xk( zVf5Pf^4A)^j~`Hr=^BpiN~gM6u}gyS27j;(Kf+H`{ForU{jG+d;%9WQ$fm;deoI5s zu%sFDxTxXNXp@>QX}Bz>m73Sf`*}!0vZ&#z>^*C|URc#jdp$T9qjp@=@RAIn*O$g^ z%NjmGzZs>MaYMx~mbK^t6Wg-wQgozLj@g`dhNIyX8E<8-#6%KRftDFIERiRxI!m7g z+qF`VE5)8=!jqojSZpebWtBFl;#KyelwEN$#t7#mjb8eLZH@#PboSuNzg*>@GIYFKj)tFEJKy7RWH=y|2{_SPEi=-lMdcX!?; zH+TCaeUC!g*P--wv>fidCm5_Dd^MX4*PA<=go11-e#Ke6N{MPWBM{4>rB^>y@X?O+r+iW-L-K6 z$1mfAM?X}o7-^-ySe`7LIn;EjtY*x0M>F3W*)IB^? zckzt9!>?>tmF5su^@2n=D(y9HC(Bowt(xtqnB{~e_;3v2DQO!{2D_tBiaAf5or3YT?bV@$_$4J^gGHuW{w46&DGi&MF#UyZJ3w0p8-L sZNFnZNl3TCcasLHgjB`v`BfA_aJz5Pr{Hp?$|l6VBJc*!wcro`1vQTqtpET3 literal 0 HcmV?d00001 diff --git a/bin/maze_game/graphics/GraphicsHandler.class b/bin/maze_game/graphics/GraphicsHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..c79427c907e0ec41f80bb5b48c935a092a02e801 GIT binary patch literal 867 zcmah{O>fgc5Ph3CcH+8iT1pC(5-6o46~Y%dwc-K-8l@o74km0D72Np; zocRU4P$ZBz@B{c!h}p$BQH6x1-JO}8_vX!xfByRZ1He73JE$-$_hZ#=~ zWH9od6vk5?he~7)EQaPGf6INv^LU(%IR}6L}mC`h#t=5018Z zS`?l6i+LeZ!E@6CVao7c8uFaFxrXZw+H^5iqLChMV1-JY$T&<+7~20-N+Wn_5;k0{ zV$H!VhUGEQcsgaGhugY;I}>pzG6r`iInDy{SnAhXI5)++dVnN^#M7$LYUqcjU!g{O z11?3T$XlaRe|EF^1>R?}Dwxr}iPte}A|Q_*zrgr(YE*6g8|KbKYylmgX>x}G6vkrqlUNVK(xOGIE$Y06&!R+`G=nbZOGvb9er~^FQbG=dbTS0PNzqiVQ=!<9y;DT&Ke=H*&fyuMt~E z>EXELG#VVG?@7mnpSfor|4w|OIBP`gn`k`4p28FB|+;3bC)MYA@{Jx(GoaQ8P( z7?hV`lk3Q0(trwsA!}}&=$OW=iW!Erp^p~#yF7}mw>%EdqXw^q!iIr4%roddMSWvq zYS|hX77R=v$1qd#0{-f}Q|Hk;r|xrx`C8a;{1YegM4VnKNz02F)@wr-W2Ujsknx%V z^G}!5(s@iRmT+CgHF6h5uH}DhyS^26c|bo$wVfRUYbY}quKzyfZw4b&Oj`^o7xTmp z62Z7>;1+H(Oj2UtorO_n+hdq8ZJEd}81j@{rE$Q-fNRkTY$OK^>pchP6StzBDcP#K2R~P((ke^emOil9^Mg zsUOQlRz0zR!sX9vOUw~v+F6!9OY$fdN2eT}ROIQcQDh@S4=`2v2EDS`!_-$4KGQ`8 zMS4$5@gx)&^h{xq?iTw3T)`4WB*ikW$^t8t)5q?~7|2(?pwPqWkf=-bELoV7G@+op zl*VvFS{Bw`P^Pe^3C2nf>!Xkbk`@25r2Vm^;g0N+!Nf*t=@M?ehsr2!iEztfaa*z@ q3-|wrqq%L5;#LV)8jE`!5aQGXvuEm=G literal 0 HcmV?d00001 diff --git a/bin/maze_game/helpers/MathHelpers.class b/bin/maze_game/helpers/MathHelpers.class new file mode 100644 index 0000000000000000000000000000000000000000..91d466891102d608b25bf03bc861376a28d2bdd3 GIT binary patch literal 2747 zcma)7TTc{c7=C6Cv$Mkr6cCq#TC5#s@vsVNOTj}0K><%iskF5^EaNilVbJPOM#p~OhfyMv*u)rPC1{wwz%Tv>Kc-hPO&&w zaor^i+JuH(<9@kTcgpp7r?~3s=dQP|{QhhIZ4LUESN7^>HAL;qyoT7gzvP;TqBR8* zEgITpy|R0CwY2C~Z#s)bS3}3FpL2@yPSq1VG{)-7UQNUP*&W%AYDm-`tU6Vp6|*NY zWTvgtcg26GA#Ps|EIC>)(^_>2sd;2SS9fxSD^4Z!W-fUWOwJu9PST!Gzs!UQ4R5B< zi7pcda4>y6j?vPOi5*GpKzUdwPwqr{c*(>?ToOtwuPzzP%qPimCWTq(to3I}9=MvqHKlFHw;L(! zhA#FSvdl;fLY=L#cSou`Sn<7bedmK@O}`~6tIsm4Jh7&l!@ot&X^XlFj6Bx7Afkf4>J9U?pJ!9`k>p!YaBE+V1{v{T@eBQ0GT1KtJc~+u1=dV_C z?xZKxYj1iAj!CCufHM%~^P!;!ap>F=)FLp@PMIUkHAPF7yT&~}_!7H*P)FLh$^}{5 zxu${xcmo~Ok}_Ac$mL^*5fX@5R^d7K2sZDwG~JC!>D1kB>5JF9e)Zl zbEq)=MO@n*@BQwt-!cLhRdC(p4}wML-k|do_uc4L@Ph;)1k#LBetVQ7&Mo&|!bf?x z9epYX{rqkq@&}BlrZbGa*cVb+=Sc~tKdoE&SJK*eT#EBfPIbM;=>_{0-n9x`N3Ft3oc*5m=Dx9%&u)d^ zh4&REZ{h-_2vNr|5u!dNs(74wjf)Gdt*tLHb@k|xA2F>Qyug(}9vz8^^*XKTSivg1 zzz2akN|oQ3ZrbLKZW7t2X5|QHB+Je^&RIIae?xpxhxziHYD)f8gWwcy;uZw&f{466oe( zyg)+Z40V!k!W2hwM!5>!iJp+Oj2mHFq{;6!UW^N&s}_Z?TMwUGo0D!T7T0;$$x(Yk8JrS@{S?$87YD d8TL*Xu}o%uJ7Cs(JKz$5%l{8pBLnF{?{B&$sO$g$ literal 0 HcmV?d00001 diff --git a/bin/maze_game/helpers/ResourceLoader.class b/bin/maze_game/helpers/ResourceLoader.class new file mode 100644 index 0000000000000000000000000000000000000000..17a6a9ae3314375b5408eefa50bb0ee85b15230b GIT binary patch literal 2825 zcmai0Npl-T7=3NY8cCjPO5{YuAt4DMCAJj^2}I6fd5wa+L^dYIKo~1yc@kL?qmi=# zS=jfmhJ6Wp6$jwp2og9^MHR*0fCCo}6vcsp@OnnFWiUmR-90ni{e7?BdtbM{|Ld!7 z0NjL66x0cG!0Q+hF9GShl8uN~4&1#W?*hqY-fn$>cd=)m}4 zJ#7hib{aXu+AZJ;M@9tPo%ut$A1?S*)WajNBx&UI{?gRAZVqeXSzREI%%`>Nh-Mn{ zz4Fm*O&Udk^~wLk(I%i~iKvQBpfQ}BgEeHCMlRD98SC(48I~&u5W?JWXI3i~Rjfcz zV0lKjs!`%aF4VOtfyhG9oCHQbn#dJOmNT_Y!AgNOc5IGx9JlniX==v@O4jTgKN{ha z%~dK^qe-CtsA*W_Knag^BodJkKd#0)1#5|>8mK0Pifgc*oD$g~uH~9YLPp!D;#yoM z&|u|f({fta-gOw86hvwR4s;(&>jlfm=TvOAH7SrJZbM5S88)>v@wjtTUP?1ZRfS1` zIwL0#T#y2)o-fe^YiCDi@zl~l%{=3!i3#0gw6PARD;g)5P9*rxz9#q_RxVm(L+sNE zwn-Gk<~h&-s9>vrUpiuFQu>t97E&rLLc zMMWpN1Qutqo#foot0CRtM8uA;MM1B?%73!dQ8Kd3?FBa!h?8_u{e)b<19wWecU4SBc&8LH=d!ZN4~JHCr&0r{*wEg1S9dBl(w!RaJ`nSQ z78WrHVOqse9HWRe5E8kGd@`Sr(j^vT@C5EtaI&W2YSOB>U#hOy6_?HVxrI|IPD?u6 z`Z2@u;w(?Fd8m3)@!r1f{$U%?LnC2p~# zC#$BdCvA=ZPpNoXW+bsZjgM49NZ!xN2_zIg1B zae+{cyBsf9Ezer9S8!5;J-d`n>qTB8bz>~V279dfi3(JRQ;NZM z1Lw+Xm1WK&m{@sJf-UO-9<~bKqU;6x`b`(%{hSYV@UxY}z#=rTRhc?Q?JE_*+-!*Ass9ws)Kywy&-oGDf?RU?8}iB$;k?zsvZ*hjI3v)5r8ceMlS z?b*8tnLyBt7WN9;R(o$tc*ktP4ct}`YjGpCGRG=3as4)e-v%$X<7Ohbg{wBgb%jal z73@%OwSq|`FBfVxxMJ}DBtf!$^7*%|0&yXz8qMgw~sN)oLl9J{qr%6GlDdtH^d745#Mj_83hVy8{mlW!2 zuKJc${1f8%8D01V-S~|c%OCOrwjlb%E$A0Jv0t?F3hKhJZL5MKZ^c#~ z5yxxH#2;^>4X^X54%dqHc*C~U9^u8Cd~y@z?|2Ju(;VaY5%2KHLxexzU0k3wPvbkh z$0sk*9KidG;vj9X|dW DSdFCN literal 0 HcmV?d00001 diff --git a/bin/maze_game/helpers/range/Range2i.class b/bin/maze_game/helpers/range/Range2i.class new file mode 100644 index 0000000000000000000000000000000000000000..6e67e116365ea6b52e619c86281c194f4316b569 GIT binary patch literal 477 zcmah_O-lk%6g_twbsAr4_Wc3nPG`|TxGUNOfglAH1Fhm|4}CH-%BW%erZ#~RwCD%) zqoVu9*|)iK?%~{X&YPd#uWtY?928*@jwAV|p87IU{y>Fel}!9Z#(m}AnR%v*unEdg@vmcagp9)I17xZj$5wVeyxXF(OkdV;q>KE^m*lFuIEOiIR7?MA+35xj zh>&9ownDocxecmu!1TQgzm}=3z8rX!rg(;DRBa zh-Dz+1yPX!@?3bBEYg9zi4;4}EC8LZ*_mf{e}2Ed0d#O|!4PPMa-|+dGF0AJ1y3q^_98hQDesnT$G2b# z6ejXTdI7C?H-m{9&IOEcDIl&`ys}xb2?bK;{?wm$1+0@RdfI&f^J4a>Y$T9#U?VS( zIBEAY5ZHB)M2c0(fwfh84$@n-?;wMeK)&Zs)%7AAsOVk}0wqxF&4x1Q%gE2b`)8mtfpjRBeHkpM6rs=z_T6j|4b`R3)tz|qQyv;EqD#p0@X2L zk~ip&jUBQMMQ;=*$yeP^WZl{Z1-HII(QRx{cK6H;Dj#~!0q5xbHud0Q_t~qqO`eiWL5!_3qZ$#_<|^ zZ2>oe#5Gg`q?SZf;sUrR#F^>ZwOX?)YiGv0GtYVFyz|aK|NiwifLr)F4NYMF)cV=| zzGJ9`QgSqFB8?Q^9C&T_N&mFrcE7b6EmvUf zz_+c|q1E-||L~rmh zQXNEQM{{^gHHV_fz^}LYC0g9uPUBu=L3mQ|fr&lH zrThxnKh)AWwsX+g8f;B2nns4d5BX+E;b)M;MgAi|$p|%)LJ11+xP>zNl+^ewS9wW= zm&mTN=aW6hrQi5oqYk)AuAf!>{G0hBehwc~Nic>yu7uPr&XLqqW%W-iz00{c#z|o% zj5CF+iX-p|u7#W3i*P_|}knK-kmt)vP+z9=ahfdZ&Zs>PWnO&UZ^x7CTH*z|MsydX?>HnuHn~Re? zUXP((kDw}pi<8{F9YbAfGF=lgwX29GR{`13Q-O`q zrO;*B$(w0KmK+(G<~csA%UeML<)2NxbV)zQ7jH{DqcZw{7ttQ(QBw*Pbw#a=vbGY| z$21Fln+h6drm@43&RBMFC)~$9URg4>{A=7*^>~i^QkmTuzIwM7_s4dVAMIwJ>owH> E14%Dva{vGU literal 0 HcmV?d00001 diff --git a/bin/maze_game/helpers/vec/Vec2i.class b/bin/maze_game/helpers/vec/Vec2i.class new file mode 100644 index 0000000000000000000000000000000000000000..d7d08389e2abfa81ea17871ba90a8f2b182916f1 GIT binary patch literal 2862 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 Ca*gl+ literal 0 HcmV?d00001 diff --git a/bin/maze_game/helpers/vec/Vec3i.class b/bin/maze_game/helpers/vec/Vec3i.class new file mode 100644 index 0000000000000000000000000000000000000000..a58347fe0794837d49de0ee8dc34e9d120be3027 GIT binary patch literal 3184 zcma)8e{&O66g@B5ByHRhN(f*#q0oXRsW#9;(f$ZxD-bB46jK2ew%LU&CQVJ#4)6u| z8vNm(odIV=7@6?{_&NL>jOV`Hgd#DqGkJU8+xO17_n!Oi_OCa8{0ZO`evBccVAbu% z?w$K~-7Qqz+J@WQENr`#LfNfMdodUadmq@_cA;jk-!EKSd*D`D3hE($CH@}q_gEo1 z@2z{SB8_aRRLYeVjKzlI#u3Jli9zg92xoKUK@iPE1W~c}nTYw;eiH+TDkPS@b@%F4 zea&s&u-9rX_bfLmcCBnTJ(&lKMyu*=DrA;>cs{2v;CP!Yd%Z%KBiWvNb4zigaX5wy zQQrr>Vz;Un{nVHk#Sw*g8+zJN7|br|zub~Sq|vInO@)QtgnhkHIA-EQj3|V*Ps%Vw z?E7x3M80F)u$z>}EnJsz+MCOj29d`nF-$0oz8}y#n@xNwxewJJN)ietPJoQzdV^FE z%IRZGn=BZ;?U6vwm^kB4seVM`DIDz*);m-bCFBuS)mbU`nvJ@IbFP0lrCb-}PLa;V zSxjf8%;NOL{dvo-^;i6s!q7^~uKaYx-U!MnY&&#kzMDI5xq5rTqTAeBYc*}TBm?!W zTFcw0@s30tZ`*TpA@+%d$=T-ZsWditY&6@CZqFveZMsYUyV6S{@--7*;~RRo(b)7_ z-ZmXGvJ{%~IK0^*huk5D$_}&|ON}jk6MOsO%*F6s&tBrhv5H%w(rsxIyfM-y;wz1< zX2m`4$z_l0o---!21luBm|ZH&C;J60CEY?l*(>-Q<_aa}_yK1%gkbQwKmQVD-g<#V zKK%m2`OFI>f8}}zDUJt-1(@8qhi4NU_aaH816~1ODj_?-*l0#P@^b7z;RN zxkosn`H9~#{%@Q^yKtg79{3-{M;b@rV`KxIzv+97IA!sbZslHKazR|CJw>}Hp3^=} zd&UUQM2wkeDw4iC6OqkgXHwBBr>Ur%sLD#p2$mu{ME2vG)S6_NnZxv9ls+A$4`Z0X zF`VS=41N28ewDbo!put^F8ZEz@=(TS_?&*5xTKW`5vizaAWVdl^2MNHSxjP*O+R$lR>ohO^4I+EUqjtYXHv#X6rXn@8zV1J zAjb&|(Tn|CGMBj+^&*1-bty*Af@%C-mS)IE@CO* zTh(3x;}Un9^KP3_45^Id-FMRAvz^_=Hr`P_ObNyN}3P8X8JJ|yRRlT_Oz zVrY_T7m^EoNG|jyskKSO&?L1kB$xY;Eb=b+UF~Y1$w*rhOADgMq}5G|YrC*VI#P`A zrioM{#eZXK9V{(^)lGqwKG^4bVC(c-I`>w$#IN?jzR&|(XWh~%x4Px~b|36ZxE$oW z$h)aKb35Onr%2gF#XB0+^!EpuR#?WB0P7j=uXLVS-kJn463#1JU69)=pfV}SeG+t; z%oyp+FNmaf*m3yG?4*phmwJTi0S-Hk%kR!TcA6@CkjGy0KzreLo7s-uv%%FH;{SHn zbq$T+2s^EGn=JO>1}#IkfkA}cprDkB(d}$`Gsu#=1L2@t{${{S1o7?%J5 literal 0 HcmV?d00001 diff --git a/bin/maze_game/helpers/vec/Vec4d.class b/bin/maze_game/helpers/vec/Vec4d.class new file mode 100644 index 0000000000000000000000000000000000000000..930ab04e57c13358de2ba17d409dfdd6826562a7 GIT binary patch literal 2734 zcmah~*-{%<5Iv)1B$Q!|7*8S-1Hsk;whWPjF_?If7aSIEr7H504AKO~2n3Q)C4S3O zKEYLa$QQVZq$&hgT$K;Vx8xg=oW3)XsYDs6n0vct?(Ngvr@Q&%uit(LP{7j|LK;$g z_Dko>ZF|qj?>N;1r{2i7oN~V8lna#@A{vHX*eyF>wfDF48(S}&a#Mr$4WA;PZ~46B zv!_8{a`)ZlvW8fu$X~XkA#%4?aS{k)z(4|n8p4@usSg^44Md@f^uB?ZCyg42d(t@r zeb6-wuDbiq`qAE&Q-5x6RUHi@tF^LSE!lNfbpK_fx#Ko8jI9O)vZx_maT`s0zf3dZ znZUEzVgeU15yLpG{@3W5-Q0QTWy-)LK4!#?!y~)yR2XrlD7P;n9m6FJ1MgBNw+v+D zc%*SyXA+~e=8jX>a5LDOo~~+`F>oGZ8bYmES>|Zlp-0u;k$$0}|5?*6@2=SgemcW; zg@G&uJCzOeDnVke3FYrG?Tw?YX5E&miSHd%o9;oCMWa{TmRnI&6oYNCxLQnExpu&7 z7c#vL4|r4*eXfPb&kWp>w8sx>4Y%pGh#IP}fI}5p3{_aZp$h9a+N`bY)5~BCcQJ;C zflcEI<|6~2W0gj~uGVVgSn6UWfd^QZv}{O|tnepIl6Y1-s+XPnt`vAewcQmd8%!{Z zVK!=nJG+GvulYMWMd|Dl?t}coWOFsBeaBmU+*7$z^ykti7|LZ&Fp{&PCrIY3*a^&^ z`8foO>xasKL68An8ss{JB!>BZ1RwBwfzUKXJ;hxlaYa*-I3o_Gq;dUo;!up=S&zOu z-}6m~r{;6NU}&1p_8WXed4%$a$Ym-?D#^BDQZbeC22;np>bW{e7{FwV=jggg_bfJ= ziA$8`xPO9C<+AC)bzGiDmM&@x?>ut8Q#W`I`=RT&qU>nM zx zz;g`Mqxvf*L*QrLLfdS+Ao*0u?IczNgGhB2BGHwVLT}TwObZFy7&695>iw9F*kh{}B{XX~mLS&2%?@7J4Ae2OubN z(ux_in(1zw-0XpHJpe%wl2&Y})l7He;dT#%MJ)L|+~L@iS!T6)5WtN9gB2niN*qu4|ab25#Xo-#kGHPnEOFEDbu;DV9yY zvHN-Fwi?YTEaMKP2)|s#T}nDFO`^y>4w*Zn2>(sPItM%d!u$aV$=p5M_cOV!ramzB k77x@UdV>{-+1rxdW^y~l+P^1I=}cCqI$3>8;1Hht1DL$TkpKVy literal 0 HcmV?d00001 diff --git a/bin/maze_game/helpers/vec/Vec4i.class b/bin/maze_game/helpers/vec/Vec4i.class new file mode 100644 index 0000000000000000000000000000000000000000..a0835aedf19785d8cfd2462cc3c5111bfe2b1659 GIT binary patch literal 3554 zcma)9U3U{@5PmkFZQYhqnt*H~1zJhdN(F0yrVU@U5^ReEjDiZ?W|wAb(v*A&c;g)x z{)t|2*>lu$tn|n^{s4c1_x=s_nRhp7ImE;q_T8Cx-<@Y>o|)P5$KSvG4qzG^VfZu{ zCG(m6aNR7~Qw6)YWml?G4Ld)Tv-8tV7y%7~8)n0tDw>v@mw!79M%y;NTee=!mbq2(c?-- zb@U>n;n0$^X|L2vYj)+XxmL6_3@w%OW-(`09MQeaK&{|ZHN=-X1d`IwV>#8DxtXV# zkwnL{;|qN_fsgQ&dG9~w%6@ihW?DUvt1#T_Ec8ZX(u(F z>BV_Whw*`i6K_WQ+F>0Z3NgOY6Uop89T#zltd`1z3X*o$R!Ya5d+e#0PV2brs?S8d zs^glgvS@En?qBAyW zEOsxC`x^T1)Xe-h%jT9>gMQPZJ9F*a*~jYa2`jW(U#nG2X|SGBy;yU$itMkDK8yVJ)XEFxy6WA|4q2%%n86Oi$m&BLkA$jqnK29e$&Bf{Q?6I?_M#*6p-)Y% zv(j}qNoM_=a{=BtY$)+H@6JJ^bdDL`5Az8NfU8dJd-!-BIG%io{-m*s!DMU~L&^9q zhLe%NE}}p4sSn5GjCx-u#sEjwA+CcsLVIsxh?mS*Wr^nuYI0sY(Uc^<_>?5xh^NP8 z>?wcQ&7Lgma7&9)i@Mq#Mt|h%uDho=VSy<6 zag<ocI+J`xtI`@dI{3 zc+U$zgtN+yhAF)7+R=_Pbn&X;1$b@`GxJ`2vy{_bbn}#F0#qcpE20GbGoiptI1-Aj z&V;ymPULtbT%Z~Wb7Qt3JCVSFt$BAV=xv2|TDh4edEhwLahh2f

|+usXwmm*A93 zB8>?wU=quWCdW8d8H2+psyroBXWb}TIcwlL&r3;dDAI+22dV)5w0v8>b)@z@&j{&3 z;#|c?ltM&HW0ChTpL~oPUcUcS&w!l49H=B2F>6jKMRiljGUD#uth?tX&4>it-FbJ{ z&E6|$_hNBoC-@SXpIUi1%SHezp_hL2;}V83%VJEio#vQ{d3v1Y)5~11(6?(U_B4H? zXDVU}lq3?Vmt`;ZI4w!R`}zK;7yAv>G!napPq5_0x#rc?7{gQrzYPgemHRe((W~`s z1Oq#Mq0g^6(Ji~h17$bXqGHS|-(_`LJ58h&-16{N>6g^;q~xQCx!Ob&LG_jhs;yRE z%a#j!^8oB*3wF|j)$nO&G^>dwg4@YWG^-8TN*A=-ozV(SG!Yb<2r9Nh8?ndbRTV2-{WpRl z%1|t+HEOiu=Rp^Q+Z_-TIfi0Jtx=;LCu?00vK*#)-`kG$)_~as|y3Dl%zYz~91!yV8uY=4r88{L6|DoYf7#jb{ z4+zWud`zr)AusZ;4@qI{74m8XJ(o~r8I~pb{3Y!D0qv&yy8~&AwbEFi6(5{`0eh-o Ax&QzG literal 0 HcmV?d00001 diff --git a/bin/maze_game/init/Entities.class b/bin/maze_game/init/Entities.class new file mode 100644 index 0000000000000000000000000000000000000000..4789a8c4006b9d68a8edfcd5b5f1cf3c54803181 GIT binary patch literal 501 zcmZut%Sr=55UkF7HyaZZV~jU%KEUMHr$rBufG3%(L!7YLz-Cs6eOMD4iwQg+_yF}>6c zBV(mU$nGBu2)Xm=y)2?aXsi)*;i2lG2A5FiTA~9&-9sJ)LN!payhcLk7cvGTHb)s=2+w` zgOa@tT&|S4a>Thgx3Fa^W*Gl$Mf5qEZvJqA=6{M~Dc%x* MZL}Cj*s){UUoN9-_5c6? literal 0 HcmV?d00001 diff --git a/bin/maze_game/init/Mazes.class b/bin/maze_game/init/Mazes.class new file mode 100644 index 0000000000000000000000000000000000000000..82146b41138401678effae09621e86cf5a06a6ae GIT binary patch literal 750 zcmZvZTTc@~6vzM5%kFepV3{I_3KdjnQCX0S7zhdB@?ctcC?Tmz%(P7El5Lx8iza+0 z9*hqf68!*tDC3#wB=w;WJLflN&u#wa{_ou%02^3ykz$x^$s6^#DO)Ox+EFj8(6#F# z!w_7_uQH5fyBVI=uT-PQkg4o{IAWOkSRQ0)GFdwee76znDtip+V(FX`4my|0#Rx-w zNCw9!LstJ-^)QYJ7Xib}kif%4ep87LfjmPl?#RmuB^@)AisiwS)m{>{n>(eU!*M*Y zz1BFUExzHHvAE9h*y0Aqti?@^g2gS4d5dp3o>|=HcwzBf4h%~^vTzv2%TZgMT({~f zIg|BRF^F=fA>(tIMEY)>&aRQmLmIDqEQ6C|y)RLhH2&`ugT;`>UbSLV=80=s{Nh0a*-{ A{r~^~ literal 0 HcmV?d00001 diff --git a/bin/maze_game/init/Models.class b/bin/maze_game/init/Models.class new file mode 100644 index 0000000000000000000000000000000000000000..d072273517ed52e2a9d28d2b966348c38f899684 GIT binary patch literal 440 zcmZutO-sW-6r7i|Nt&cqtF;xpc=H3y#hXPCt*6u$l|oNt6PKEjG?2D}{wwiNQ1A!% zqr|s~U=bJgV|Hiez1h#Nw+{d(XqnImjYK@l(O4wXi>A@s>!$ZIo|z~S)+gdoc(Is{ zyc`?q zW;Se8U97<(813Al0`A2{83v)|M^kydNCKJNi6EAQx}Sz39*8VbIKQ-^qskTM57CU! zTxoJ8BKK(Dri(0;SCR5@isZ*CH1@cp&c8(1QFZyG!Gg(?P+@e$SPkbL_HYUJ6}1pZJOVa23Q&Z literal 0 HcmV?d00001 diff --git a/bin/maze_game/input/InputKeyboard.class b/bin/maze_game/input/InputKeyboard.class new file mode 100644 index 0000000000000000000000000000000000000000..1ce1069c30b41650b7d8673d56aeb0116d4d5adc GIT binary patch literal 1879 zcmaJ?+fEx-6kTH*k8K8H5}**r0n)TJhGqf@^a3U!n2W(&%C)2yGT2iyFuuq(Q0Qwv zp;DAQRDJ79RH-eLsFC^s{ewRCI~rA8=Xh*Ds<6a4`|PuCYwvZ2KmYyx4*(DFRE0}H zBxf9(TUjG#>Q=tEU(u6doimTN3q~oU!lNLxYaAH5ZRE51;`XkYuBh-T=qi-5x_!8t zwe_t1)uBF}n%bb-gkjs;MtU!)!lxjdGpxK_C=~UIQQp&&^UiUVCk4Ue!qVF6*4*Ug zd=xmz_PMz&DzJ0R_z|D{n6B=eEt#s{m2PWjhQ_>=9gB4}3DhYzAz|9a5!KPzUY768S+*_im08-XRM@n6qv#|L z)_j)DqG?nl68hBDYsHLFF;%=Tdt95~j%gRoQdvJR)B3uZ9?S&L4_$!1$M!@MiQaWT zHG>-N;{g-17$qSz!x}!2ny&-+2qP*!X0G$G&l{B;4Wo!NicvB0gHAO1KE$|+N3=el zoG4wxV@wcZk%-OG<;j})id8w%C*`&z4Mw~VzdinY`lr@!0+OnJPvN zvzSw$k*=#E|)RFKS{ zu}XX!Rw2*OS6YiE=CgugUMqi4*rVW!&L;U2alD6CK2spY-K09_ljLnVZRFGBFmDYf z1q;iNJ8H3HmdhqtA6O~um(u2xCAoX)72g$;L=V~Oh6@c)`PV6E&+h;Pk>ySr%bg^a zJ1NZF3m-ygq3<=G`sgoyjjy3>p5gkhX#bf<7dp6lX#~E8PN@M;d~A;625rP`XY33& zV(wFf#S#%qmsonv!`xsXQI&^}$j{tC2D#4c9n^`?S~U>fmh~&RgLj-H)AVuEBG481 z?t3(NUb&s|jR@`zv;k%ljn2hbALd*@3JB0GY+0CqZxe7o zM|z)Y96A!XhXtOV@}Gl^Asq3WAR68+n|kaZ44{Z*tgt6GW3JNHB^%cS?;C_w^oK&B zmJVL8VV$dB&0jR}agVn(ynyQd5gyO58VPOu0Dr7aB^M&0@tPcogjQ;DS0t3E$&w&d zEHOFw5fUNJ@M9eBIBxNKa|e^0+7wYFG0e}yC{nWi84{k!>*J1NLylYMKErN9<5dKcL?Y4F0QV>)?E{e2JSTA^^hzf|76eSi(7jy|5CZ*T`Z}w%i&6D=;Kx z%cfx){v0_o*>#5Kf>RMmFr3$*BEisJG;HyrZfy#0jc=NQAzgIJ++63LA??r^pABeI zP>|NpffP~s+Xkf>EdIBMJf)KAid5U8F!>$Nj~4AYcUY?*>fJ}>XC za5qfc_8a_4xPtpZ9UBZS_iMMpeX3{(BPxbZ^{cd3^M$41Dy|XCsT24@F=(gZ=&PP# z`z7BK+{&xC&d__@XmT5Nb-r$x72ze2VTdiQmS%=h7{$1(eu9`XO{(B$nt*(ET}Di5 zn1W7aan}`gg`q!F$esxf+4Bk9WQgPf?%NVM%`o{l?td~QaToVh++!Fy{)wu`-EE^> z)1QTp=iIKC!qf0T{(97^xm!|fUc)RN(xCWGvj~Rn%vrVh6dvJ;ipLCHf9arxdD#=y zl}$BmhE&O^du6d?$bo7<9_c9w#xTvFLOVt~DaVioAx38sDe{~nYm{!eV#*h2pXm`n z8=djMoj`lw0a-MOAw;KJf@0%`==>8B49=U&?)m35G6%`HrS2ckDm~W z?koFbD<{%w0Y?u>p}3GkzAoW1vGfJeOseU}KuDXTTWX3#CE3XuI!_3Sv;;bd}a_Jil-0D=04sgdLvw@ig=1%viEhwf3W9Y>ME}qDhYvo!9 H6fOP&R=4ZP literal 0 HcmV?d00001 diff --git a/bin/maze_game/mainloop/MainloopHandler.class b/bin/maze_game/mainloop/MainloopHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..00a2ca7554948f5ea7819d0e18deddf40a883d42 GIT binary patch literal 1953 zcmah}S##S|7(F+3qF5-+zCg&*HiT?MKnnpJS`uez5@#XKLc)?Nw(2OAC68=36W;g_ zyzs&U!((3>O4^|_`~ZFlzk=ahS(a_;89Za%@4L%6=UeXm>z_aV1aKFp3Yr9N<&5vm zldO?5^_*cjw(I8g&A@nII2qgY6hs9&&W$IAZW~Tk-#$Gz(?ta>0)ye1qEUFPuT@U& z(NoYWFcfYupO{Xux?@?o04icz%YIy-W!`eE;yr=L#N>fMG~s4U z6%n*+cmtY(PJz+?gHh3eZn?jQq!U%vMhfGT2QdirX^26U2M08~iMJ@+GqYBqXnG{9 z!FW9lL{RW{U81v|kw3H21${Lzf<&trM7x3!KW(p7WhGxoxFv^_Du&S>!!3*{xLvo| za`Gi6S$;Rn%Tw3zG8*2&xWJ9It)2b7la1x0#qEXNC4mtJUg2nPjJa-4T8_C@%AK0t zo^fiM0$oWrZP*8fXGuSpj26$Vg1}e}URZ(6`c5LK;yMZ2EtoO92VKEzU1y~(nbDkv z_wfNM?3UOdy-C0EELY$0ET@<%dZv+!x8e@T=x>O}aEK!XU)8l*gN+h*RVw{j!#7AU#ZpiiBz5MN?2KP} zd5yl)a3Uo~3q?0Cpr+iCmo`@{*=0SIx(3%`R#p=?c?~0ILNgRvLf%Javy~PvKEG}B zen6BKaDVCrZcM#G#}SRL-_bkuod0X|%kdQkk6vIX^oHq;2Hq8J(t1XSCcMktGTk9I%{yotyB&BuKE`$^2)JhlHl7hv!%QQDJj99H_Tj~ zO0Re(!Lv-IQnd6v!&xcXn-bbm$FB2+RWzK<__mRWFBqBr>`e*swr`j}6tU|ZvRJ5Xz3K3tyo463bdA_rqT-@4O&slN1XcV|jr3MC6T*M^_ zO*w0V&le1*WbBSRj=snD(WFSce!iq<9?j}SHw}^ZTPlJG38_zX*4Pgj_~I*Zdqc$#hzxHf3J!=nB-;7s-{>fIcEBvZ5B#~BO%0K$))5>#nH5i zq=5TO&bm_&t*w3I!tNuB#a~c>I;)~y5G1sHjFD%V(d6wkSr*FJmSt|5c0t0$Xbmk+ z5;NJg6v6{61n@oya@?B}mMT8LA_=_9FCm^RsaSS3dxBdZsko1iN$zMOL7&XToeFQs zv<&~)=a2uK`Z4mUf-KeoAdlNlMw-=2`RU5wsK|kX=UcOEn^1Y9i7t+tr^wizA_*vE zDD3ue*%QldzmT{n^Y)gLF(w(4AP5fih_NPbQHv;JIhw z%iTvy4kgzxPs6;IxGS+=&=m8$K+DfOd7yD^a3j>iixzsU#~akC6>FTrX`a~KBTw^H zPm$Pjw0NE(5PONULN23C_>^6r&GZJo4f3U!-4?Xf_>ENkUUuyz5sc%_Riyd{3lxtR z>9n0+2ft_;u~ZqoBV}A2ZDpk9>uqJc(|oJsk|uqmQombB ztde83kT7lTVvZF=kZ>E}p|@MO$5zPH-p6~@>Qb(TpvStOW1ioKtuOKLfO%A!AsP)_ zb7Nd^8`DsYAsV&9R*U-vtkREYDXClWEInaHD(?;>&~NxVPx~`vWaQPsVAqitqBcjZ zcXd#qwkp#Bp?&meK>_$PM75AW{Ta?{%0A9&b^FjXrE;fgb>i+j_~Zi$?XGD@ zUJI`FXufYT=IVsWv97yTr&R1t)xLFgPvP?($O4KAhlW@t*Z?1HvPHubtlua1N zEPujGLj8!qf5so6uQ7uk@GgGk&2NNVaQLA+ABRWq9rDGZ3*RBuDT%o{bb<6S#w+?- zB&cEh1dDr+@xI3fr4XZjg90UmvA={(sg9HZx$XUzPD24mvMk9G|2QmvV~&H4A`LwF F1EQ)^eGRW=|i8|^r6$2&a{)DerF|P6+2VU zoZWxV|DFH*m+$;X{{6$dlK|G@Ee&}B)`{?0`*3gggk3MC`VKy}CBvueqy|O6e=Ix{ zuI~@Wd+T={Ic7&v0_vt%JeFz{a8*@z3Meg!sO^Od9s_Qu0tM}{xV`h_i6eG$U-(GB zEl|{+h=lt)!^xQZ&Q2<+zSy8ZdHWYS&>-OHPlTh=rB;FJs`hDT_NJ1tcyB}XY^xhI z6#kFr8L)<8fzroKG@p$1NA08zlS}H8_F&>CTq_Kqt7U2m2J(b9~El^TbJ!5f$7fY~A!%~5T z(+TXe`v>ggVEvwK812lSoiy+ysss#~%PEb(+}WJ$ZuY{D8X0n}fV--@xtbv|A_H|O zpjT7%pm;RaZ^y|SS>MOA%Ai&Y2(PrZ*1$RhXl-zyKSusMIqSwVO~|zy3~WS@spVF^ zsXm8uZBntxz-EwxYNRim+)ArTRa?AEYL zpl~`1ZSj=dD>EO$9;Rv_oE)?{_XR9!)38sVc-n6%IVaJJz3_PWIAGu)y6A*d3FLLR z$=PlL&*C}yKhPgOV!)-Vq*fT7-sP4P6?ZCv|)6R0r3#B>EHF!OdECwk0R@JO7a#wj8zHZ4F^7i|NHm$240<#)a(^wnunO@U(4GWd~?k<<<-5)HFaG7tbU;;btphN4~HEame zF!M*#9}lZy*dt7jr86y~>Dpl}ZE9E3rT4J6YXbX&nx$Fp+vwy=xs7Kmt>QKgSz6_7 z9I-T6BbQVDpJO@Y5;9~i3tq}vSy;fkYZ)q0i}`Hvi}<_X39QFb1gYDGDr`qJGgHGx zwj9q8(ZiY^#cCvoyiVkgu>n8DCfsB{9>-SPM>8Iv6~E@n-{NU}jCTA5yYW}-C#O1v zh6ADy2gMS8*Wp>Q3M)k;mWx*Oh+Q}$IuQ}iAu1xUMGU#cxS@^|E9_#yHe(C;-Ab<9;4_}@2g!dU#LsraQi~-Wy&=a)w+t#hH90f7ecje zN@ePG%q#QHdB@RwS!!OCnwO}_pkIE3J{Kx;XXd^l=gv#qS3|YayxhUxJz&25%&*DJ zmNB;rnAas3Vh=e*rk&=`fHP>si)g`1yqsS~2hL#+hFQG}tnCPEb&;%i)#1zBOdQmP zY1hw+Um!v_HS$6E3`;azw2F%v{ww%eHvAyT!z{yJa|@juhd7Sh!K>2E+!l8!r^QLr zgVcN2=KqhKOOM-mV^%x7S2F&H<0Pr<*~ywoweP;V(-lz0(BpK;km)Y(GnJlzT4Snp zcks=i=G4s6Tq{{NOH=rATbg@iDBB53R+t|4u)ZGI5m$z?&17;k{i)MVD@M~l8&-s= zl#iybt(Y!MkhcQxebW0fZ;30U{Z(@FEw+cZ*%Get$iK}WRPVB7Ugyt>cX5cAUSbFE zBPY6}nFyRCM?);BJgzd!N$0rc(eiP;!Q#jUbrj#GR$;*o;5(Gu+^ZSirKEDljXZ`U z#5a)|vYa|~71={74_^b+&yml<@`SiW8mlDld2r;6^OOS1o90gHvW=!KVQmVvR z22+!wo1)wD$ik?WM;1o2JSlWV1Izmdh~ zXYq5g_=0Iy{QeyKg;{)27GIpjm*n8h9Q$*#_|hzXUKVfV_*0gHFVEsDviM2|AN0Bc zzA>09OrNPUtvwbmKoZd>OrPZ?5&t%<2~(>WefUFOcBWcB`tWiN5j)uzfcIFb8?4Ry zq{vO)VYf(taZ+P~_tFRK5_fSJ_wYLJpa+;_SAQTD;1{ADABdg!Q0&96cwc-d;nr&G|6#lkNZ*f6d%3Z9WKwFTgAYMQa&@yrAZPd;PKb*8IF-)2`A>ic+{OyzI zjMa`mcmSWn=Wsl`$pAmh%$}38=iBdGfB*e;3}6xK86+46+tw%X#ZW1TDh`Q%aOmIBZah%0Ssj@$S~jsw&A|tw_U@3Cp=PH^@RnF zVT>^3ZFfs}l16-34+85WF;Qew5{+?WBBF7QixSNhdgE|!PXq@Na)~1wK_)pa>&j@a%)&uY5j>>E{jiY6()EcLkV zc;d-nyD5T~63bAi`z_0DSb-z$_)-hsI@GY?`v2#?OgS8#PAIWcqh2(rW(NI*e;Bkx z&5_)?+LC#>Aef-8Qmg1tOORFx(G--XR>vM%1@fOG>zHPgAiZ7v310ny-gmBs!654vMzM)8Y+)R)Xlq`R_YS=pjIzXCER&VP zbFAPV)u1V!sFpdh8F>@ztCT8cTHQ=44jy@94u;i}E-b|_vvHZHIqNF!G<9j_3`h2a JV@*Z6{|^dmtgrw8 literal 0 HcmV?d00001 diff --git a/bin/maze_game/models/ModelPlayer.class b/bin/maze_game/models/ModelPlayer.class new file mode 100644 index 0000000000000000000000000000000000000000..ad621867051e9f9889e2174b88c266daa1ae43d1 GIT binary patch literal 611 zcmZvY%}T>S5Xb+UZj*jQyG^xz3tq$zuoo|))PvAd6oXm_9wgR9Bdx`>3i=K{Kz#tk zo1O#_A3*ex6lb;`Jb1`|GV`0+o&Uanzq|oh#)tz;V6qim>x1K{r7NxWk#2S>n;f>A z(UnddNP+VI9Rl`Rd=_`B0;#$Ax`5oE!5mV^x=6zoDERT2-nwWV>SQ-MY-$0|Z#SZ5 zJxXHEe~Yqv5_bfq{r~UjZ?Y=j9_wyhC*8OaYwDMC^ZPYf^*=skwb#3q>tsqmTnbqG zHG$kt`yy%RTFm#VKc1FOqss_0)SIFSz@k4|m(-!G!e>xSFFYgjWN?m@F=!x9>h>Eb z4p1gBhyqo3_=_@&;)9xgwZl|C2qk@KPX(dv6@$?6ydccDL8xr1D~Ex~Fi}}XD#t9( z;u this.pos.x) { + pos.x += 1; + } + + if(pos.x < this.pos.x) { + pos.x -= 1; + } + + if(pos.y > this.pos.y) { + pos.y += 1; + } + + if(pos.y < this.pos.y) { + pos.y -= 1; + } + } + + // Wall collisions + if(!Main.maze.collision(this.pos.x, pos.y, 1)) { + this.pos.y = pos.y; + } if(!Main.maze.collision(pos.x, this.pos.y, 1)) { + this.pos.x = pos.x; + } + } +} diff --git a/src/maze_game/entity/EntityPlayer.java b/src/maze_game/entity/EntityPlayer.java new file mode 100644 index 0000000..d22c740 --- /dev/null +++ b/src/maze_game/entity/EntityPlayer.java @@ -0,0 +1,49 @@ +package maze_game.entity; + +import static org.lwjgl.opengl.GL20.glGetUniformLocation; +import static org.lwjgl.opengl.GL20.glUniform2i; + +import maze_game.Main; +import maze_game.helpers.vec.Vec2d; +import maze_game.init.Mazes; +import maze_game.init.Models; + +public class EntityPlayer extends Entity +{ + public EntityPlayer() { + super(Models.MODEL_PLAYER); + } + + @Override + public void move(Vec2d pos) { + + pos = pos.add(this.pos); + + // Level teleportation + for(int i=0;i<10;i++) { + if(Main.maze.collision(pos, i + 4)) { + Main.maze = Mazes.MAZE[i]; + if(Main.maze.player_pos != null) + { + pos = Main.maze.player_pos.copy(); + + Main.window.entity_shader.use(); + + int glsl_maze_size = glGetUniformLocation(Main.window.entity_shader.program, "maze"); + glUniform2i(glsl_maze_size, Main.maze.width, Main.maze.height); + } + } + } + + pos = pos.subtract(this.pos); + + super.move(pos); + + // Death + if(Main.maze.collision(this.pos, 2)) { + Main.maze = Mazes.MAZE[0]; + this.pos = Main.maze.player_pos.copy(); + return; + } + } +} diff --git a/src/maze_game/graphics/GameWindow.java b/src/maze_game/graphics/GameWindow.java new file mode 100644 index 0000000..166534c --- /dev/null +++ b/src/maze_game/graphics/GameWindow.java @@ -0,0 +1,118 @@ +package maze_game.graphics; + +import static org.lwjgl.glfw.GLFW.*; +import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; +import static org.lwjgl.opengl.GL11.GL_FLOAT; +import static org.lwjgl.opengl.GL11.GL_TRIANGLES; +import static org.lwjgl.opengl.GL11.GL_UNSIGNED_INT; +import static org.lwjgl.opengl.GL11.glClear; +import static org.lwjgl.opengl.GL11.glClearColor; +import static org.lwjgl.opengl.GL11.glDrawElements; +import static org.lwjgl.opengl.GL20.glEnableVertexAttribArray; +import static org.lwjgl.opengl.GL20.glUniform4f; +import static org.lwjgl.opengl.GL20.glUseProgram; +import static org.lwjgl.opengl.GL20.glVertexAttribPointer; +import static org.lwjgl.opengl.GL30.glBindVertexArray; +import static org.lwjgl.opengl.GL33.*; + +import org.lwjgl.glfw.GLFW; +import org.lwjgl.opengl.GL; + +import maze_game.Main; +import maze_game.entity.Entity; +import maze_game.helpers.ResourceLoader; +import maze_game.init.Entities; +import maze_game.input.InputKeyboard; +import maze_game.mainloop.FpsCounter; +import maze_game.maze.Maze; +import maze_game.maze.MazeDrawer; + +public class GameWindow +{ + public GraphicsShader maze_shader; + public GraphicsShader entity_shader; + public long window; + + public GameWindow() + { + if(!glfwInit()) { + throw new RuntimeException("GLFW intialization failed"); + } + + // Setup OpenGL with the core profile + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE); + glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_FALSE); + + window = glfwCreateWindow(800, 600, "Maze Game", 0, 0); + + if(window == 0) { + glfwTerminate(); + throw new RuntimeException("GLFW window initialization failed"); + } + + glfwSetKeyCallback(window, InputKeyboard.INPUT_KEYBOARD); + + glfwMakeContextCurrent(window); + glfwShowWindow(window); + + GL.createCapabilities(); + glViewport(0, 0, 800, 600); + + // Load and compile the shader + maze_shader = new GraphicsShader("environment"); + entity_shader = new GraphicsShader("entity"); + + maze_shader.use(); + + Entity.glsl_pos = glGetUniformLocation(entity_shader.program, "pos"); + + entity_shader.use(); + + int glsl_maze_size = glGetUniformLocation(entity_shader.program, "maze"); + glUniform2i(glsl_maze_size, Main.maze.width, Main.maze.height); + } + + public void render() + { + int w[] = {0}; + int h[] = {0}; + + glfwGetFramebufferSize(window, w, h); + + double w_r = (double)w[0] / (double)h[0]; + double m_r = (double)Main.maze.width / (double)Main.maze.height; + int o_x = 0; + int o_y = 0; + + if(w_r < m_r) { + o_y = (int)(h[0] * w_r / m_r) - h[0]; + } + + if(w_r > m_r) { + o_x = (int)(w[0] / w_r * m_r) - w[0]; + } + + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + glViewport(-o_x/2, -o_y/2, w[0] + o_x, h[0] + o_y); + + maze_shader.use(); + + Main.maze.bind(); + glDrawArrays(GL_TRIANGLES, 0, Main.maze.s / 5); + + entity_shader.use(); + + for(Entity entity : Entities.entities) { + entity.render(); + } + + glfwSwapBuffers(window); + glfwPollEvents(); + + FpsCounter.fps += 1; + } +} diff --git a/src/maze_game/graphics/GraphicsHandler.java b/src/maze_game/graphics/GraphicsHandler.java new file mode 100644 index 0000000..5f845e4 --- /dev/null +++ b/src/maze_game/graphics/GraphicsHandler.java @@ -0,0 +1,25 @@ +package maze_game.graphics; + +import mainloop.task.IMainloopTask; +import maze_game.Main; + +public class GraphicsHandler implements IMainloopTask +{ + public static int mspf = 1000 / 60; + + @Override + public boolean MainLoopDelay(long millis) { + return millis > mspf; + } + + @Override + public boolean MainLoopRepeat() { + return true; + } + + @Override + public void MainLoopUpdate() { + Main.window.render(); + } + +} diff --git a/src/maze_game/graphics/GraphicsShader.java b/src/maze_game/graphics/GraphicsShader.java new file mode 100644 index 0000000..4f8ed5e --- /dev/null +++ b/src/maze_game/graphics/GraphicsShader.java @@ -0,0 +1,34 @@ +package maze_game.graphics; + +import org.lwjgl.opengl.GL33; + +import maze_game.helpers.ResourceLoader; + +public class GraphicsShader +{ + public int program; + + public GraphicsShader(String id) { + program = ResourceLoader.loadShader(id); + } + + public void use() { + GL33.glUseProgram(program); + } + + public void setInt(int v) { + GL33.glUniform1i(program, v); + } + + public void setFloat(float v) { + GL33.glUniform1f(program, v); + } + + public void setIntv(int[] v) { + GL33.glUniform1iv(program, v); + } + + public void setFloatv(float[] v) { + GL33.glUniform1fv(program, v); + } +} diff --git a/src/maze_game/helpers/MathHelpers.java b/src/maze_game/helpers/MathHelpers.java new file mode 100755 index 0000000..2e496e0 --- /dev/null +++ b/src/maze_game/helpers/MathHelpers.java @@ -0,0 +1,112 @@ +package maze_game.helpers; + +import maze_game.helpers.vec.Vec2d; +import maze_game.helpers.vec.Vec3d; + +public class MathHelpers +{ + public static final double FallSpeed = 0.00098; + + public static double squared(double x) { + return x*x; + } + + public static double pow(int c, double x) + { + double res = 1; + + for(int i=0;i b) return a; + else return b; + } + + public static double smallest(double a, double b) + { + if(a < b) return a; + else return b; + } +} diff --git a/src/maze_game/helpers/ResourceLoader.java b/src/maze_game/helpers/ResourceLoader.java new file mode 100644 index 0000000..d51791e --- /dev/null +++ b/src/maze_game/helpers/ResourceLoader.java @@ -0,0 +1,86 @@ +package maze_game.helpers; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.glfw.GLFW; + +import static org.lwjgl.opengl.GL33.*; + +public class ResourceLoader +{ + public static byte[] loadResource(String name) + { + try + { + InputStream in = ResourceLoader.class.getResourceAsStream(name); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + byte buffer[] = new byte[1024]; + int size = 0; + + while((size = in.read(buffer)) != -1) { + out.write(buffer, 0, size); + } + + return out.toByteArray(); + } + + catch(IOException e) { + e.printStackTrace(); + return new byte[0]; + } + } + + public static int loadShader(String name) + { + int vsh = glCreateShader(GL_VERTEX_SHADER); + int fsh = glCreateShader(GL_FRAGMENT_SHADER); + + byte[] vsh_source = loadResource("/resources/shader/" + name + ".vsh"); + byte[] fsh_source = loadResource("/resources/shader/" + name + ".fsh"); + + StringBuilder vsh_sb = new StringBuilder(new String(vsh_source)); + StringBuilder fsh_sb = new StringBuilder(new String(fsh_source)); + glShaderSource(vsh, vsh_sb); + glShaderSource(fsh, fsh_sb); + glCompileShader(vsh); + glCompileShader(fsh); + int vsh_success[] = new int[1]; + int fsh_success[] = new int[1]; + + glGetShaderiv(vsh, GL_COMPILE_STATUS, vsh_success); + glGetShaderiv(fsh, GL_COMPILE_STATUS, fsh_success); + + if(vsh_success[0] == 0) { + System.err.println("ERROR:SHADER:VERTEX:" + name + ":" + glGetShaderInfoLog(vsh)); + System.exit(1); + } + + if(fsh_success[0] == 0) { + System.err.println("ERROR:SHADER:FRAGMENT:" + name + ":" + glGetShaderInfoLog(fsh)); + System.exit(1); + } + + int program = glCreateProgram(); + glAttachShader(program, vsh); + glAttachShader(program, fsh); + glLinkProgram(program); + + int success[] = {0}; + glGetProgramiv(program, GL_LINK_STATUS, success); + + if(success[0] == 0) { + System.err.println("ERROR:PROGRAM:LINKING:" + name + ":" + glGetProgramInfoLog(program)); + System.exit(1); + } + + glDeleteShader(vsh); + glDeleteShader(fsh); + + return program; + } +} diff --git a/src/maze_game/helpers/range/Range2i.java b/src/maze_game/helpers/range/Range2i.java new file mode 100755 index 0000000..e64d333 --- /dev/null +++ b/src/maze_game/helpers/range/Range2i.java @@ -0,0 +1,17 @@ +package maze_game.helpers.range; + +public class Range2i +{ + public int mx; + public int my; + + public Range2i(int mx, int my) + { + this.mx = mx; + this.my = my; + } + + public int maxValue() { + return mx * my; + } +} diff --git a/src/maze_game/helpers/range/Range3i.java b/src/maze_game/helpers/range/Range3i.java new file mode 100755 index 0000000..a0089c6 --- /dev/null +++ b/src/maze_game/helpers/range/Range3i.java @@ -0,0 +1,19 @@ +package maze_game.helpers.range; + +public class Range3i +{ + public int mx; + public int my; + public int mz; + + public Range3i(int mx, int my, int mz) + { + this.mx = mx; + this.my = my; + this.mz = mz; + } + + public int maxValue() { + return mx * my * mz; + } +} diff --git a/src/maze_game/helpers/range/Range4i.java b/src/maze_game/helpers/range/Range4i.java new file mode 100755 index 0000000..722dc47 --- /dev/null +++ b/src/maze_game/helpers/range/Range4i.java @@ -0,0 +1,21 @@ +package maze_game.helpers.range; + +public class Range4i +{ + public int mx; + public int my; + public int mz; + public int mm; + + public Range4i(int mx, int my, int mz, int mm) + { + this.mx = mx; + this.my = my; + this.mz = mz; + this.mm = mm; + } + + public int maxValue() { + return mx * my * mz * mm; + } +} diff --git a/src/maze_game/helpers/vec/Vec2d.java b/src/maze_game/helpers/vec/Vec2d.java new file mode 100755 index 0000000..d97da94 --- /dev/null +++ b/src/maze_game/helpers/vec/Vec2d.java @@ -0,0 +1,74 @@ +package maze_game.helpers.vec; + +import maze_game.helpers.MathHelpers; + +public class Vec2d +{ + public double x; + public double y; + + public Vec2d(double x, double y) + { + this.x = x; + this.y = y; + } + + public double distance(Vec2d other) { + return MathHelpers.distance2d(x, y, other.x, other.y); + } + + public static double distance(Vec2d v1, Vec2d v2) { + return v1.distance(v2); + } + + public boolean equal(Vec2d other) { + return x == other.x && y == other.y; + } + + public Vec2d add(Vec2d other) { + return new Vec2d(this.x + other.x, this.y + other.y); + } + + public Vec2d subtract(Vec2d other) { + return new Vec2d(this.x - other.x, this.y - other.y); + } + + public Vec2d multiply(Vec2d other) { + return new Vec2d(this.x * other.x, this.y * other.y); + } + + public Vec2d divide(Vec2d other) { + return new Vec2d(this.x / other.x, this.y / other.y); + } + + public Vec2d add(double v) { + return new Vec2d(this.x + v, this.y + v); + } + + public Vec2d subtract(double v) { + return new Vec2d(this.x - v, this.y - v); + } + + public Vec2d multiply(double v) { + return new Vec2d(this.x * v, this.y * v); + } + + public Vec2d divide(double v) { + return new Vec2d(this.x / v, this.y / v); + } + + public Vec2d copy() { + return new Vec2d(x, y); + } + + public double squareDistance(Vec2d other) + { + double dx = MathHelpers.positive(other.x - x); + double dy = MathHelpers.positive(other.y - y); + return MathHelpers.biggest(dx, dy); + } + + public Vec2i toInt() { + return new Vec2i(MathHelpers.floor(x), MathHelpers.floor(y)); + } +} diff --git a/src/maze_game/helpers/vec/Vec2i.java b/src/maze_game/helpers/vec/Vec2i.java new file mode 100755 index 0000000..7932045 --- /dev/null +++ b/src/maze_game/helpers/vec/Vec2i.java @@ -0,0 +1,100 @@ +package maze_game.helpers.vec; + +import maze_game.helpers.MathHelpers; +import maze_game.helpers.range.Range2i; + +public class Vec2i +{ + public int x; + public int y; + + public Vec2i(int x, int y) + { + this.x = x; + this.y = y; + } + + public double distance(Vec2i other) { + return MathHelpers.distance2d(x, y, other.x, other.y); + } + + public static double distance(Vec2i v1, Vec2i v2) { + return v1.distance(v2); + } + + public int getId(Range2i range) + { + int x = MathHelpers.mod(this.x, range.mx); + int y = MathHelpers.mod(this.y, range.my); + + int id = 0; + int m = 1; + + id += x; + m = range.mx; + id += y*m; + + return id; + } + + public static Vec2i fromId(Range2i range, int id) + { + int x = MathHelpers.mod(id, range.mx); + id -= x; + id /= range.mx; + int y = MathHelpers.mod(id, range.my); + + return new Vec2i(x, y); + } + + public boolean equal(Vec2i other) { + return x == other.x && y == other.y; + } + + public Vec2i add(Vec2i other) { + return new Vec2i(this.x + other.x, this.y + other.y); + } + + public Vec2i subtract(Vec2i other) { + return new Vec2i(this.x - other.x, this.y - other.y); + } + + public Vec2i multiply(Vec2i other) { + return new Vec2i(this.x * other.x, this.y * other.y); + } + + public Vec2i divide(Vec2i other) { + return new Vec2i(this.x / other.x, this.y / other.y); + } + + public Vec2i add(int v) { + return new Vec2i(this.x + v, this.y + v); + } + + public Vec2i subtract(int v) { + return new Vec2i(this.x - v, this.y - v); + } + + public Vec2i multiply(int v) { + return new Vec2i(this.x * v, this.y * v); + } + + public Vec2i divide(int v) { + return new Vec2i(this.x / v, this.y / v); + } + + public Vec2i copy() { + return new Vec2i(x, y); + } + + public double squareDistance(Vec2i other) + { + int dx = MathHelpers.positive(other.x - x); + int dy = MathHelpers.positive(other.y - y); + return MathHelpers.biggest(dx, dy); + } + + public Vec2d toDouble() { + return new Vec2d(x, y); + } +} diff --git a/src/maze_game/helpers/vec/Vec3d.java b/src/maze_game/helpers/vec/Vec3d.java new file mode 100755 index 0000000..715622a --- /dev/null +++ b/src/maze_game/helpers/vec/Vec3d.java @@ -0,0 +1,80 @@ +package maze_game.helpers.vec; + +import maze_game.helpers.MathHelpers; + +public class Vec3d +{ + public double x; + public double y; + public double z; + + public Vec3d(double x, double y, double z) + { + this.x = x; + this.y = y; + this.z = z; + } + + public double distance(Vec3d other) { + return MathHelpers.distance3d(x, y, z, other.x, other.y, other.z); + } + + public static double distance(Vec3d v1, Vec3d v2) { + return v1.distance(v2); + } + + public boolean equal(Vec3d other) { + return x == other.x && y == other.y && z == other.z; + } + + public Vec3d add(Vec3d other) { + return new Vec3d(this.x + other.x, this.y + other.y, this.z + other.z); + } + + public Vec3d subtract(Vec3d other) { + return new Vec3d(this.x - other.x, this.y - other.y, this.z - other.z); + } + + public Vec3d multiply(Vec3d other) { + return new Vec3d(this.x * other.x, this.y * other.y, this.z * other.z); + } + + public Vec3d divide(Vec3d other) { + return new Vec3d(this.x / other.x, this.y / other.y, this.z / other.z); + } + + public Vec3d add(double v) { + return new Vec3d(this.x + v, this.y + v, this.z + v); + } + + public Vec3d subtract(double v) { + return new Vec3d(this.x - v, this.y - v, this.z - v); + } + + public Vec3d multiply(double v) { + return new Vec3d(this.x * v, this.y * v, this.z * v); + } + + public Vec3d divide(double v) { + return new Vec3d(this.x / v, this.y / v, this.z / v); + } + + public Vec3d copy() { + return new Vec3d(x, y, z); + } + + public double squareDistance(Vec3d other) + { + double dx = MathHelpers.positive(other.x - x); + double dy = MathHelpers.positive(other.y - y); + double dz = MathHelpers.positive(other.z - z); + + if(dx > dy) return dx; + if(dy > dz) return dy; + else return dz; + } + + public Vec3i toInt() { + return new Vec3i(MathHelpers.floor(x), MathHelpers.floor(y), MathHelpers.floor(z)); + } +} diff --git a/src/maze_game/helpers/vec/Vec3i.java b/src/maze_game/helpers/vec/Vec3i.java new file mode 100755 index 0000000..04b3dec --- /dev/null +++ b/src/maze_game/helpers/vec/Vec3i.java @@ -0,0 +1,112 @@ +package maze_game.helpers.vec; + +import maze_game.helpers.MathHelpers; +import maze_game.helpers.range.Range3i; + +public class Vec3i +{ + public int x; + public int y; + public int z; + + public Vec3i(int x, int y, int z) + { + this.x = x; + this.y = y; + this.z = z; + } + + public double distance(Vec3i other) { + return MathHelpers.distance3d(x, y, z, other.x, other.y, other.z); + } + + public static double distance(Vec3i v1, Vec3i v2) { + return v1.distance(v2); + } + + public int getId(Range3i range) + { + int x = MathHelpers.mod(this.x, range.mx); + int y = MathHelpers.mod(this.y, range.my); + int z = MathHelpers.mod(this.z, range.mz); + + int id = 0; + int m = 1; + + id += x; + m = range.mx; + id += y*m; + m *= range.my; + id += z*m; + + return id; + } + + public static Vec3i fromId(Range3i range, int id) + { + int x = MathHelpers.mod(id, range.mx); + id -= x; + id /= range.mx; + int y = MathHelpers.mod(id, range.my); + id -= y; + id /= range.my; + int z = MathHelpers.mod(id, range.mz); + + return new Vec3i(x, y, z); + } + + public boolean equal(Vec3i other) { + return x == other.x && y == other.y && z == other.z; + } + + public Vec3i add(Vec3i other) { + return new Vec3i(this.x + other.x, this.y + other.y, this.z + other.z); + } + + public Vec3i subtract(Vec3i other) { + return new Vec3i(this.x - other.x, this.y - other.y, this.z - other.z); + } + + public Vec3i multiply(Vec3i other) { + return new Vec3i(this.x * other.x, this.y * other.y, this.z * other.z); + } + + public Vec3i divide(Vec3i other) { + return new Vec3i(this.x / other.x, this.y / other.y, this.z / other.z); + } + + public Vec3i add(int v) { + return new Vec3i(this.x + v, this.y + v, this.z + v); + } + + public Vec3i subtract(int v) { + return new Vec3i(this.x - v, this.y - v, this.z - v); + } + + public Vec3i multiply(int v) { + return new Vec3i(this.x * v, this.y * v, this.z * v); + } + + public Vec3i divide(int v) { + return new Vec3i(this.x / v, this.y / v, this.z / v); + } + + public Vec3i copy() { + return new Vec3i(x, y, z); + } + + public int squareDistance(Vec3i other) + { + int dx = MathHelpers.positive(other.x - x); + int dy = MathHelpers.positive(other.y - y); + int dz = MathHelpers.positive(other.z - z); + + if(dx > dy) return dx; + if(dy > dz) return dy; + else return dz; + } + + public Vec3d toDouble() { + return new Vec3d(x, y, z); + } +} diff --git a/src/maze_game/helpers/vec/Vec4d.java b/src/maze_game/helpers/vec/Vec4d.java new file mode 100755 index 0000000..4ae094c --- /dev/null +++ b/src/maze_game/helpers/vec/Vec4d.java @@ -0,0 +1,88 @@ +package maze_game.helpers.vec; + +import maze_game.helpers.MathHelpers; + +public class Vec4d +{ + public double x; + public double y; + public double z; + public double m; + + public Vec4d(double x, double y, double z, double m) + { + this.x = x; + this.y = y; + this.z = z; + this.m = m; + } + + public double distance(Vec4d other) { + return Math.sqrt( + MathHelpers.squared(this.x - other.x) + + MathHelpers.squared(this.y - other.y) + + MathHelpers.squared(this.z - other.z) + + MathHelpers.squared(this.m - other.m)); + } + + public static double distance(Vec4d v1, Vec4d v2) { + return v1.distance(v2); + } + + public boolean equal(Vec4d other) { + return x == other.x && y == other.y && z == other.z && m == other.m; + } + + public Vec4d add(Vec4d other) { + return new Vec4d(this.x + other.x, this.y + other.y, this.z + other.z, this.m + other.m); + } + + public Vec4d subtract(Vec4d other) { + return new Vec4d(this.x - other.x, this.y - other.y, this.z - other.z, this.m - other.m); + } + + public Vec4d multiply(Vec4d other) { + return new Vec4d(this.x * other.x, this.y * other.y, this.z * other.z, this.m * other.m); + } + + public Vec4d divide(Vec4d other) { + return new Vec4d(this.x / other.x, this.y / other.y, this.z / other.z, this.m / other.m); + } + + public Vec4d add(double v) { + return new Vec4d(this.x + v, this.y + v, this.z + v, this.m + v); + } + + public Vec4d subtract(double v) { + return new Vec4d(this.x - v, this.y - v, this.z - v, this.m - v); + } + + public Vec4d multiply(double v) { + return new Vec4d(this.x * v, this.y * v, this.z * v, this.m * v); + } + + public Vec4d divide(double v) { + return new Vec4d(this.x / v, this.y / v, this.z / v, this.m / v); + } + + public Vec4d copy() { + return new Vec4d(x, y, z, m); + } + + public double squareDistance(Vec4d other) + { + double dx = MathHelpers.positive(other.x - x); + double dy = MathHelpers.positive(other.y - y); + double dz = MathHelpers.positive(other.z - z); + double dm = MathHelpers.positive(other.m - m); + + if(dx > dy) return dx; + if(dy > dz) return dy; + if(dz > dm) return dz; + else return dm; + } + + public Vec4i toInt() { + return new Vec4i(MathHelpers.floor(x), MathHelpers.floor(y), MathHelpers.floor(z), MathHelpers.floor(m)); + } +} diff --git a/src/maze_game/helpers/vec/Vec4i.java b/src/maze_game/helpers/vec/Vec4i.java new file mode 100755 index 0000000..14f8b76 --- /dev/null +++ b/src/maze_game/helpers/vec/Vec4i.java @@ -0,0 +1,125 @@ +package maze_game.helpers.vec; + +import maze_game.helpers.MathHelpers; +import maze_game.helpers.range.Range4i; + +public class Vec4i { + public int x; + public int y; + public int z; + public int m; + + public Vec4i(int x, int y, int z, int m) + { + this.x = x; + this.y = y; + this.z = z; + this.m = m; + } + + public double distance(Vec4i other) { + return Math.sqrt( + MathHelpers.squared(this.x - other.x) + + MathHelpers.squared(this.y - other.y) + + MathHelpers.squared(this.z - other.z) + + MathHelpers.squared(this.m - other.m)); + } + + public static double distance(Vec4i v1, Vec4i v2) { + return v1.distance(v2); + } + + public int getId(Range4i range) + { + int x = MathHelpers.mod(this.x, range.mx); + int y = MathHelpers.mod(this.y, range.my); + int z = MathHelpers.mod(this.z, range.mz); + int m = MathHelpers.mod(this.m, range.mm); + + int id = 0; + int mu = 1; + + id += x; + mu = range.mx; + id += y*mu; + mu *= range.my; + id += z*mu; + mu *= range.mz; + id += m*mu; + + return id; + } + + public static Vec4i fromId(Range4i range, int id) + { + int x = MathHelpers.mod(id, range.mx); + id -= x; + id /= range.mx; + int y = MathHelpers.mod(id, range.my); + id -= y; + id /= range.my; + int z = MathHelpers.mod(id, range.mz); + id -= z; + id /= range.mz; + int m = MathHelpers.mod(id, range.mm); + + return new Vec4i(x, y, z, m); + } + + public boolean equal(Vec4i other) { + return x == other.x && y == other.y && z == other.z; + } + + public Vec4i add(Vec4i other) { + return new Vec4i(this.x + other.x, this.y + other.y, this.z + other.z, this.m + other.m); + } + + public Vec4i subtract(Vec4i other) { + return new Vec4i(this.x - other.x, this.y - other.y, this.z - other.z, this.m - other.m); + } + + public Vec4i multiply(Vec4i other) { + return new Vec4i(this.x * other.x, this.y * other.y, this.z * other.z, this.m * other.m); + } + + public Vec4i divide(Vec4i other) { + return new Vec4i(this.x / other.x, this.y / other.y, this.z / other.z, this.m / other.m); + } + + public Vec4i add(int v) { + return new Vec4i(this.x + v, this.y + v, this.z + v, this.m + v); + } + + public Vec4i subtract(int v) { + return new Vec4i(this.x - v, this.y - v, this.z - v, this.m - v); + } + + public Vec4i multiply(int v) { + return new Vec4i(this.x * v, this.y * v, this.z * v, this.m * v); + } + + public Vec4i divide(int v) { + return new Vec4i(this.x / v, this.y / v, this.z / v, this.m / v); + } + + public Vec4i copy() { + return new Vec4i(x, y, z, m); + } + + public int squareDistance(Vec4i other) + { + int dx = MathHelpers.positive(other.x - x); + int dy = MathHelpers.positive(other.y - y); + int dz = MathHelpers.positive(other.z - z); + int dm = MathHelpers.positive(other.m - m); + + if(dx > dy) return dx; + if(dy > dz) return dy; + if(dz > dm) return dz; + else return dm; + } + + public Vec4d toDouble() { + return new Vec4d(x, y, z, m); + } +} diff --git a/src/maze_game/init/Entities.java b/src/maze_game/init/Entities.java new file mode 100644 index 0000000..789c5d9 --- /dev/null +++ b/src/maze_game/init/Entities.java @@ -0,0 +1,12 @@ +package maze_game.init; + +import java.util.ArrayList; + +import maze_game.Main; +import maze_game.entity.Entity; +import maze_game.helpers.vec.Vec3d; + +public class Entities +{ + public static ArrayList entities = new ArrayList(); +} diff --git a/src/maze_game/init/Mazes.java b/src/maze_game/init/Mazes.java new file mode 100644 index 0000000..758a51a --- /dev/null +++ b/src/maze_game/init/Mazes.java @@ -0,0 +1,20 @@ +package maze_game.init; + +import maze_game.maze.Maze; +import maze_game.maze.MazeDrawer; + +public class Mazes +{ + public static final Maze[] MAZE = { + MazeDrawer.loadMazeF("maze0"), + MazeDrawer.loadMazeF("maze1"), + MazeDrawer.loadMazeF("maze2"), + MazeDrawer.loadMazeF("maze3"), + MazeDrawer.loadMazeF("maze4"), + MazeDrawer.loadMazeF("maze5"), + MazeDrawer.loadMazeF("maze6"), + MazeDrawer.loadMazeF("maze7"), + MazeDrawer.loadMazeF("maze8"), + MazeDrawer.loadMazeF("maze9"), + }; +} diff --git a/src/maze_game/init/Models.java b/src/maze_game/init/Models.java new file mode 100644 index 0000000..d264c55 --- /dev/null +++ b/src/maze_game/init/Models.java @@ -0,0 +1,9 @@ +package maze_game.init; + +import maze_game.models.Model; +import maze_game.models.ModelPlayer; + +public class Models +{ + public static final Model MODEL_PLAYER = new ModelPlayer(); +} diff --git a/src/maze_game/input/InputKeyboard.java b/src/maze_game/input/InputKeyboard.java new file mode 100644 index 0000000..34d4abc --- /dev/null +++ b/src/maze_game/input/InputKeyboard.java @@ -0,0 +1,78 @@ +package maze_game.input; + +import org.lwjgl.glfw.GLFWKeyCallbackI; +import static org.lwjgl.glfw.GLFW.*; + +import mainloop.task.IMainloopTask; +import maze_game.Main; +import maze_game.helpers.MathHelpers; +import maze_game.helpers.vec.Vec2d; + +public class InputKeyboard implements GLFWKeyCallbackI, IMainloopTask +{ + public static final InputKeyboard INPUT_KEYBOARD = new InputKeyboard(); + + boolean key_w = false; + boolean key_a = false; + boolean key_s = false; + boolean key_d = false; + + @Override + public boolean MainLoopDelay(long millis) { + return millis > 1; + } + + @Override + public boolean MainLoopRepeat() { + return true; + } + + @Override + public void MainLoopUpdate() + { + Vec2d direction = new Vec2d(0, 0); + + if(key_w) { + direction.y += 1; + } + + if(key_a) { + direction.x -= 1; + } + + if(key_s) { + direction.y -= 1; + } + + if(key_d) { + direction.x += 1; + } + + if(direction.x != 0 || direction.y != 0) { + double angle = Math.atan2(direction.x, direction.y); + Main.player.move(MathHelpers.moveTowards2(0.01, angle)); + } + } + + public void invoke(long window, int key, int scancode, int action, int mods) + { + boolean pressed = ! ( action == GLFW_RELEASE ); + + if(key == GLFW_KEY_W) { + key_w = pressed; + } + + if(key == GLFW_KEY_A) { + key_a = pressed; + } + + if(key == GLFW_KEY_S) { + key_s = pressed; + } + + if(key == GLFW_KEY_D) { + key_d = pressed; + } + } + +} diff --git a/src/maze_game/mainloop/FpsCounter.java b/src/maze_game/mainloop/FpsCounter.java new file mode 100644 index 0000000..4a0bc8c --- /dev/null +++ b/src/maze_game/mainloop/FpsCounter.java @@ -0,0 +1,25 @@ +package maze_game.mainloop; + +import mainloop.task.IMainloopTask; +import maze_game.graphics.GraphicsHandler; + +public class FpsCounter implements IMainloopTask +{ + public static int fps = 0; + + @Override + public boolean MainLoopDelay(long millis) { + return millis > 1000; + } + + @Override + public boolean MainLoopRepeat() { + return true; + } + + @Override + public void MainLoopUpdate() { + System.out.println("FPS: " + fps + ", " + 1000 / GraphicsHandler.mspf); + fps = 0; + } +} diff --git a/src/maze_game/mainloop/MainloopHandler.java b/src/maze_game/mainloop/MainloopHandler.java new file mode 100644 index 0000000..ad678fc --- /dev/null +++ b/src/maze_game/mainloop/MainloopHandler.java @@ -0,0 +1,70 @@ +package maze_game.mainloop; + +import org.lwjgl.glfw.GLFW; + +import mainloop.event.IMainloopEvent; +import mainloop.manager.MainloopManager; +import mainloop.task.IMainloopTask; +import maze_game.Main; +import maze_game.graphics.GraphicsHandler; +import maze_game.input.InputKeyboard; + +public class MainloopHandler implements IMainloopTask, IMainloopEvent +{ + public MainloopManager mainloop; + + public MainloopHandler() + { + mainloop = new MainloopManager(this); + mainloop.register(this); + + mainloop.register(new GraphicsHandler()); + mainloop.register(new FpsCounter()); + + mainloop.register(InputKeyboard.INPUT_KEYBOARD); + } + + @Override + public void onClose() { + System.out.println("Mainloop closed"); + } + + @Override + public void onEarly() { + GraphicsHandler.mspf -= 1; + if(GraphicsHandler.mspf < 1) { + GraphicsHandler.mspf = 1; + } + } + + @Override + public void onLate() { + GraphicsHandler.mspf += 1; + if(GraphicsHandler.mspf > 1000) { + GraphicsHandler.mspf = 1000; + } + } + + @Override + public void onStart() { + + } + + @Override + public boolean MainLoopDelay(long millis) { + return millis > 10; + } + + @Override + public boolean MainLoopRepeat() { + return true; + } + + @Override + public void MainLoopUpdate() { + GLFW.glfwPollEvents(); + if(GLFW.glfwWindowShouldClose(Main.window.window)) { + mainloop.stop(); + } + } +} diff --git a/src/maze_game/maze/Maze.java b/src/maze_game/maze/Maze.java new file mode 100644 index 0000000..8e6773e --- /dev/null +++ b/src/maze_game/maze/Maze.java @@ -0,0 +1,82 @@ +package maze_game.maze; + +import static org.lwjgl.opengl.GL11.GL_FLOAT; +import static org.lwjgl.opengl.GL20.glEnableVertexAttribArray; +import static org.lwjgl.opengl.GL20.glVertexAttribPointer; + +import org.lwjgl.opengl.GL33; + +import maze_game.helpers.MathHelpers; +import maze_game.helpers.vec.Vec2d; +import maze_game.helpers.vec.Vec2i; + +public class Maze +{ + public int width; + public int height; + public int[] maze; + public Vec2d player_pos; + private int vao = -1; + public int s; + + public void bind() { + + if(vao == -1) { + this.init(); + } + + GL33.glBindVertexArray(vao); + } + + public void init() + { + float[] verticies = MazeDrawer.drawMazeVerticies(maze, width, height); + + int vao = GL33.glGenVertexArrays(); + int vbo = GL33.glGenBuffers(); + + GL33.glBindVertexArray(vao); + GL33.glBindBuffer(GL33.GL_ARRAY_BUFFER, vbo); + GL33.glBufferData(GL33.GL_ARRAY_BUFFER, verticies, GL33.GL_STATIC_DRAW); + + glVertexAttribPointer(0, 2, GL_FLOAT, false, Float.BYTES * 5, 0); + glEnableVertexAttribArray(0); + + glVertexAttribPointer(1, 3, GL_FLOAT, false, Float.BYTES * 5, 2 * Float.BYTES); + glEnableVertexAttribArray(1); + + this.vao = vao; + this.s = verticies.length; + } + + public boolean collision(Vec2d pos, int tile) { + return this.collision(pos.x, pos.y, tile); + } + + public boolean collision(double px, double py, int tile) + { + double c = 0.01; + int x1 = MathHelpers.floor(px + c) + 0; + int y1 = MathHelpers.floor(py + c) + 0; + int x2 = MathHelpers.floor(px - c) + 1; + int y2 = MathHelpers.floor(py - c) + 1; + + if( + x1 < 0 || y1 < 0 || x1 >= width || y1 >= height || + x2 < 0 || y2 < 0 || x2 >= width || y2 >= height + ) { + return false; + } + + if( + maze[y1 * width + x1] == tile || + maze[y2 * width + x1] == tile || + maze[y2 * width + x2] == tile || + maze[y1 * width + x2] == tile + ) { + return true; + } + + return false; + } +} diff --git a/src/maze_game/maze/MazeDrawer.java b/src/maze_game/maze/MazeDrawer.java new file mode 100644 index 0000000..adde269 --- /dev/null +++ b/src/maze_game/maze/MazeDrawer.java @@ -0,0 +1,203 @@ +package maze_game.maze; + +import static org.lwjgl.opengl.GL11.GL_FLOAT; +import static org.lwjgl.opengl.GL20.glEnableVertexAttribArray; +import static org.lwjgl.opengl.GL20.glVertexAttribPointer; + +import org.lwjgl.opengl.GL33; + +import maze_game.helpers.ResourceLoader; +import maze_game.helpers.vec.Vec2d; + +public class MazeDrawer +{ + public static Maze loadMazeF(String filename) { + return loadMaze(new String(ResourceLoader.loadResource("/resources/maze/" + filename + ".txt"))); + } + + public static Maze loadMaze(String data) + { + String[] rows = data.split("\n"); + + int width = 0; + int height = 0; + + for(String row : rows) + { + int l = row.length(); + + if(l == 0) { + continue; + } + + if(l > width) { + width = l; + } + + height += 1; + } + + Vec2d player_pos = null; + int maze[] = new int[width * height]; + int it = 0; + + for(int r=rows.length-1;r>=0;r-=1) + { + String row = rows[r]; + + for(int i=0;i 3 && m < 14) { + color[0] = 0.61f; + color[1] = 0.64f; + color[2] = 0.3f; + } + + // Teleport + if(m == 3) { + color[0] = 0.2f; + color[1] = 0.39f; + color[2] = 0.17f; + } + + // Lava + if(m == 2) { + color[0] = 0.82f; + color[1] = 0.23f; + color[2] = 0.1f; + } + + return color; + } + + public static float[] drawMazePositions(Maze maze) { + return drawMazePositions(maze.maze, maze.width, maze.height); + } + + public static float[] drawMazeVerticies(Maze maze) { + return drawMazeVerticies(maze.maze, maze.width, maze.height); + } + + public static float[] drawMazePositions(int[] maze, int width, int height) + { + float[] colors = new float[maze.length * 3]; + + for(int x=0;x