From 913a455e6d1f622bae9ed2a93db745412520ac09 Mon Sep 17 00:00:00 2001 From: Valerie Date: Mon, 23 May 2022 15:18:39 -0400 Subject: [PATCH] primarily the mouse capture area changes. --- idea.md | 6 +- res/textures.png | Bin 8269 -> 7199 bytes src/main/java/xyz/valnet/engine/App.java | 10 +- src/main/java/xyz/valnet/engine/Game.java | 8 ++ .../java/xyz/valnet/engine/math/Vector4f.java | 4 + .../valnet/engine/scenegraph/GameObject.java | 2 +- .../xyz/valnet/engine/scenegraph/IScene.java | 3 + .../valnet/engine/scenegraph/ITickable.java | 2 +- .../java/xyz/valnet/hadean/HadeanGame.java | 39 +++--- src/main/java/xyz/valnet/hadean/Layers.java | 20 +++ src/main/java/xyz/valnet/hadean/Tile.java | 2 +- .../valnet/hadean/gameobjects/BottomBar.java | 21 ++-- .../xyz/valnet/hadean/gameobjects/Log.java | 3 + .../xyz/valnet/hadean/gameobjects/Pawn.java | 6 +- .../valnet/hadean/gameobjects/Selection.java | 78 ++++++++---- .../hadean/gameobjects/SelectionUI.java | 116 +++++++++++++----- .../valnet/hadean/gameobjects/Terrain.java | 2 +- .../xyz/valnet/hadean/gameobjects/Tree.java | 10 +- .../hadean/gameobjects/tabs/ArchitectTab.java | 6 +- .../hadean/gameobjects/tabs/MenuTab.java | 18 +++ .../java/xyz/valnet/hadean/input/Button.java | 75 +++++++++-- .../xyz/valnet/hadean/input/GOButton.java | 63 ++++++++++ .../valnet/hadean/input/IMouseListener.java | 13 ++ .../xyz/valnet/hadean/input/SimpleButton.java | 4 +- .../xyz/valnet/hadean/scenes/GameScene.java | 63 +++++++++- .../xyz/valnet/hadean/scenes/MenuScene.java | 38 ++++-- .../java/xyz/valnet/hadean/util/Assets.java | 2 + 27 files changed, 493 insertions(+), 121 deletions(-) create mode 100644 src/main/java/xyz/valnet/hadean/Layers.java create mode 100644 src/main/java/xyz/valnet/hadean/input/GOButton.java create mode 100644 src/main/java/xyz/valnet/hadean/input/IMouseListener.java diff --git a/idea.md b/idea.md index b8f5f0b..bbcd86a 100644 --- a/idea.md +++ b/idea.md @@ -19,4 +19,8 @@ null instead of the IWorker's current job. to is when the worker knows it can move on to another action. A Worker may also tell a job board, that it no longer -wishes to do work, and the job will be released. \ No newline at end of file +wishes to do work, and the job will be released. + +# IMouseCaptureArea + +its just a name, but reframe current mouse shit to it. \ No newline at end of file diff --git a/res/textures.png b/res/textures.png index 7e4aff3a5ef248160b34fcc5b3109c5de30040ec..3d743c5bccf2f3e0e2d2a9f0f3e7c1f31883a94d 100644 GIT binary patch literal 7199 zcmeHMXHe74xBi7*M6e55l!A0^<;-XIu7>XPlQy>5)!=&{^@KC6VoYBGI(++ zUFm!L4fkVZP4@(+gKB0+j8 z`WTBQ;nNj-Fr#xQ)Eo-?9EsdE$KW!8FuNGTa-o+Lo%m`C=*XjsD1Q4Bho@PkO@|>P zU*89^aRRyA^~Veb{>@B}i!7H!0*s|U@R4^V;tT>CCN3wmManJr(j)Y{ajK54Cyiq6 z+=DWq;$HYsF>06w!U*lE%bauQ+3cFO8JcrK^4m8)aPtl{lHy}VM3uYwo*{JO&YEUa z1w!5z>L-4lx9C2kz|EY@1)^ONv{`vDKp29(&~JX=uWtJ)kBPd8K$)evbQ=y8R8p3Y ztJ&+rZzQ#77OBoOsX$a}k>2>&8LrTUI)$;dq%V<>j0v(u2E1-KB+kELrLm{QN#-UA zAD2uROIHd=$J3mkJ2Q@8*BG?5SutCIeOL!bkKD?Av?k`h`5#oCBf1LZE${ccS$NQP z^l{hsw`04*%>h6R-3x(i>p%ci?PbdQ+2qX0Z<5w%PM`3jM=an>H7fT>6u%*F&tQe~ z_;$tf>`YJVwv&kofX7>qRq5F_I||` znY7${MDY6)oK49&$eyA%G1t5jKmkfFn@Il>mM*^-ej+LbG#_}=Uz+98oGg8zMbG-o zWMU_x9c)3Um7D%Hb*hird8nx!)$DefP@bc=#!VWA4O?r=&{?}wfrhW#m?kDAn!rc5 zO#XuT6}IuEjtyc!GK{cQxYo0~tbHpYkZAm^!L>Q0B`$=y7Q>}f!>%Mf|Afa4@Lk48 zLi@iICT;Y3z4G0m&l|t}O(cfql{;)?GRa@4@}C!e-)j#c(n_T`6X^xut;lh01i*-Y z`V_m}C99XFSMJKstHzCGxgbmiB)R#tw)L z|3C^*>!X!k8D`3pTJ#+gTPfz|HCTL#D?Yu(=3U=i-*1a2 zS}pGm*+{TPNZY|Vk%6)cch5S0{eg-VH#Bx`Fk1_9K~IeoX!kfb(wb8_+VSPzTFp0# zqPF-()ZDo_M%|_tl@CVkuVgeJg3u|e*9J&1qp^OWLV840>ckV9eXQ$C{X$wL@<9JKpqD8rk>f<;nd1$kVJg?wv3;J5fOP3& z2T7k5YFXK)74FuumgnP8jmF>CSN^i2;HPsq-!OGl%Ypxn$ATs?jgCw-v3zFhrC5#I zZi^>vhEf#B`l+#<*iLbh;13ET{{A7fdUp^OZr@rKp-;$%P#E=87H4=C_xMy zbHXsu^z7_2lz&z!ft!xJve=ZJ^X1OM)my0HRn`aea6fI4iikWcPGV&qP zAdM}c=95-w=}h4+{U-7+@9uGvL3uJ)03{fLAGDyvA8VSfS%?ewtxt33=q0e)3vZ`3@ z)7_$tjsq}}&wW6T`uwWbPacTpM3<*UnX{Xg{G3s8E`dEt6~50I&jbX_eCF0(c(-DT1|8FGw+f1Y zrOPg6_epYH-v)BXDr^5pw;@=M{TLVvBG!r(>+$sLPJUlxS(-hph>+Ps%%pBb!pQeD z+?<%P3&%0>Sj92QuC9f#eyF)UqtJ4j3tfT<%WNIia(4oMv7V(}aXnNz!4n*X+YLR5 zGD>+QY7CMGVPMkSFZ?_*`QCoqi({T%yk~tm$D{x)*^J0SR%<1*0_sgZEr^w8;K0ww;Mv=;<)h29%tN{*eI5=w2l;NS z_yf^?z?m759WL440l)+0Ut7R89X9U_P|pVT6!hE)F!S`B%E1{IQy^rCnAMTez}~0R zXKe25(gIIqYIN3XMkOe4myAx~1{-*rsgeivB1Tibb~Gkm<7R+C%xcnI%&K4XT5)L0 zk#*ky)MFw@xM?C*@xRAP?vXnSYCL69EHks}BP187hcor@knA?Pi8NBz$zQ8eIr*M6&LrBSrNli(&do6#D75voNEu!lVeXOl z$M}1r0!vj?*6LQix)332eAbFuFrgm56gu+>MBBKeTXX)Y34S~$@*jDi%y(9+<0T=V zco0@A(GX^rsH@OF<;hV2_I*^uM;RV3YsldMN7sBRVQMTO+|I1-5)j{ z;I(x)zqg1cY9#ya8hO>JkaD7B+}Vlt*?QXG3vaon&v**;$E{A*NLRy(uf00uWBGek z3do=dpy=(=H85Y)7**0W4+*{O&RD45efY;DAn*uyA9&;646BZKW6iB6?Vq*UM{{3E8 z{Lv!;RaI5!au?&{vnQg}ebe`s*vBA><9u5#k}N>^y7VXfp8&n&trKx-tr-Pk*OhAT z6?G17?)q?eCoTJL$|-3#ILDy!;D)}guGTlB_|#O6R0N`CdxRm~2h(JzC)hXFzR>KW zM(3j%FSwR>&nYYV4x#nHOv1V9VRrd*4?yBrkysrcycep*ZPhXQ8hfk63fnG`hs`i^ zry_R)EFDwMSsqw2Ldv5$fbuhnweM(m#-oyV&%38b;tkx+uA@+PyR>Gfkt_5L^F7Kq z5+9Ep>QkxWSxZeXwU%|iDez@f#r%39vzVfJqRJ&^HKv+-uvO7Q!4Fex2JBVmE=~q` zaew);oM?6Sr3}}S6+B;lixZu|#h1?-IB}?6v!n0-aaM9lG!h*zCt(<$lG2BJ&uAh+ z=gIr(_bfj8S8iJi@A0KgPAT`w@HjMnd!nz(zQdCW@c6?|AtG}e^MiiYa@ew ztyZkEsQnag$gyQ9cz}A6ib$&oAo(HQIe1pvHGIuTO~SQu=%<-Lk@~n%QDUdU{WT`s zaNYAX7Q>zrBu#LRSyO~Z$jE2%3Ma|22)&!enceT%-={Mub-)RQsw0IeCX-XX2~*>y zR$#;qujIAgMq2e>-?yKfBG#}X4?E8?m|e@^EU#uy_XWZhHN1c!@@x9AcOZLTf_{dK zBPU3LZd$4IZW&>Chwi@Ks>9ZCX+O89mS?5=O_`c`IjXDIpT>32ob_L-LGc|=EE_t8 zv?r3D@|p_t{Q_G@36W#j3^jg8+EVhwhaRwF8JnO1<_Z+GtX2oh_D_foUzr({OI*w_91~VqizR>&ns|e7ln0GiLy$2O}%Vzlf1>?OVa2?ICy&6 z@agGkdyjV=8!3-x$=@X+;i-tMq~%~o?0W3S3tpHMWL?s!0Af)2MYB7Yg_~6C(KyMR z9Xk=#M+9evDpSyr)#QP^$1q~$?>aAQ-mJit&%xLt>SyUCR*M=~MZSX`b_Yxfv)Cgk z9{P5;ndh;IjY8m)_Wm@9R|l#|Rm|2WK11>obojvxS&xpqXx2@}Y(u3App$hIw8^X# ztWp_2&iW~}c;L@!S3Yc9n%=pCrXDi+F*5h64(ypNV4K=qsb^l5#n1wnJXz|~T&(jzX9yj}@ z52`%#YCRBo4BM$q)IHUyS?4%&P=>BQba|z^wtF`FCpTl^RrmV~+X-CxV zptMs;5RS+PqK;RN8Q`<{OFPuOFf_Ql3komRm%>g8xQ(;)b{!|8xjyu_8dSDX-7sqq z!{4(Iku=?@X-fa(F49-W$~v<+NYxfD+!X%_fz~N7@*&Xs9%O}5h_0^`DaR}Ih8@sd z#_We3atasKRKr>nxv9T{Y0JZ&RSBS03cbbkxtM)u?~5cly!JJaayRGnxGmP~k z(1H9HB5V6qFsJYCTr1wC89h9=~Q21@>Q8It|<;&BmQmn`MOgk?*EKqR#fUesKkx)ujwt z1vZYUO1<$?YhE7|^RowWlADwvp{LUu!NKfy@S8Im4g)4AS%HlmeriWK+6RfIwE*hbudv==S=_zlN!frdVy9H&o}D8=;pmXc~X2wgd+t=!Nqkx>(H z=r?oX=;C1Dv{B>;AEgQW=8nOvS9O#&#B_aXI@r+N^Fr5TUA*e7=ETn=7S!u5JJ17c zagUYwMKdn`j7UncHg7rGOE{&4VUYIFUwYCz?6({DXX9FAYz}Y#-d_g?1k=dhq@s~c zRwS+_)Q2nSgJS4LOKBvm3AT`Cd?88U(IXyWI6PIpk3|6zA98sS02v;mwav=-WoqdUkuyCyJ$j zuIX(AW!Jme0+uToJ0C0<9cqm;sw z%OOIqJK5=1m$r{bzq&H zGjgRvjvF-0v&sJEaN!ML9DNqU=g^D6p`Oust35;B5h~| zj0QP#cdXD3+b-;J)ynq7U*ggVeU_V-6$I@iDa?hu+B819PtvWKayGfzPd3eZx%Zs# zT?zotw3=Mh)9YjOF$`T=$rJPOHGyLfl45Z7NpZwIC>!cV==#9D$M%G;w}?Y4)ueX^ zYbWwUza#jLr9EzZ5d}+IyHMxE(JfB9%{y#_gu?o)>p`zK1!Z&Z)!7isBRsr-tFHU= zDX~iv?e#NPq-flSHR`0Z??$lrkU z{V}+3G!ARp<#L4WgUKInwGrMXI%(rNW48B+G!Z$bEX{e(x-55_OlL9E&^5&o>;2mGPO1+>J!DeJ3V?GHss{aj}h z4Q43n%O#FSkNBk#oVoMFeQ6pBe%Bvrtd!VJ$ki2l*v`}AeBB|(D49Us;w#mLBX4iL zst0w@#KmOi*T($mj~{a@=Ap=D?wOUhC|b;&Sc-OZ2` zzDVDy(GjM|16?AC77Oh_A4vuI$Mhas8NS28I5@XbBw;%NQ&LR+Z;ExM28Eh;vfx2B znE3$Yq1V+ZX@1=A#@|EEYRDI!TXA2P5KfIV7Xs3S`t ztJ_+jc1Z>^ra>A)FKkA;{_H3+zHKU%i+*6Wg}EMxCVf-s+pR9Bs`k~ATKZ^`j9hWF zTuUFhEz2UkKyY`wlkQ^JZ_5Qg+MiH=erE$ishX|B-jO{ml-Hl!&#k43Uz^@{j{9&2 z%@U?BYN}|wgZs5@S+pl^H^CZu{L|(8_)k{FTe`+peq+Y|R+ef_H^~jN0h+xFjp|UZ zmR~|K_1ZHn7gzwfqqnDD^i^3pYU0kCA!_ie17k0#m3EB|9@^cpD#R3gKk)98H+$Pb zh-l{yB4FxNd4iZbv9WG0ZN8e}Ey(TV=hj8_{r`@-`1s=r04B-wK{De zcSl*XILUDRFnPeW$Q=u$J(~es7H#3gHUIRnxqtV zw7B73ae}0Pzk0%602>7}2WC-f>#P`NXp|4v<~4u-l-E&={yhs|iI^W^lE7;WA&Bba zefEsQC0CkBz(BU3omwe7e_=J5Dc_Cn7zDvT$z~2$IBY-uT`6WaP1mloeWln`Q$9Q+ z38_hgyppZ=`ShM$oW;p_=st$^1o~im@g=X)?s&sC%h_!$)eTiv8UBScZ0}@Nz5Gu8 zZ5}iR8!DspcL2(6b2NYp51PL`FfO+3a28Nr-2c}8p3UEZ!Bn20#c=wa!+R-KqknmU zMfr{>g~QvjA=_mQPUwM&NuL*Mj!Q`DqwQ8@OigH7Ao$v>4KPo=#|6|qKj8&LhSWty z)KPT|RN$ZQazL^!s*7&FYT9uTS;ccEr?PsRR&_w!)IFieh0V1+wMn1xs zD&v=_LJ#)BF0B2cc(dA;U?>;hTSg`2^la?MGa7Urd%SxStQRLke+XjamBw2_+s>62 zQY{ToxU4r;k{iNj3KZoVZXDmZ{&CH9&prc8E(<=QKj;4)(tRZfuG+IqL04)E+a2OL z-3P>iuMD4_V4%TF*)ThcXw^L|sYEcZ>7#sTV9PG8(z88Pc`u6FJ#M5C`D)lSBfBk8 z&^{?Oz?f2R>vPF<8JD*Cg^;`%?N#Op%q}YKEuQ)ZFS*$`_qfooz1;7#Wn4sfwrVLH zIfH9ZB6I>}P9-EFbAmAH4bAe^3=Sx-IUYI0iCc_<&oB*FB7 zEZZ&xgpud6_Ek1bL$v+_ixv6EDPb;bJo3kVN3n6)8v060m^g0G0%+LPgeBX6H#@eA ze67N^ODG`1Hu5G2|M$86ljn68Z#`nu9fM*i7NM^c>H47)QRn`T(4DQW=BLZ}eLuO8 zJqesoaNyjD*CuejDP;*m;t3J95DHxNa~NZgYI*JFXhhk!g);s7^L z=HD60o;@O{;C5H)lA%t#hz9kd4=0TjP@86a69^VHsqi6)zI|ctG7l~>=`ZS%rcNyO z4v_@Wzvq`OBoja9OHgEr12W%Ry7xnoE zA{4PYI_I{R`-^x!q;WiVP}hQ|FHo kcmBWpuN}yByn{QFVep@IZ+wG0|I`Dtp6IEStJuByFVtKuL;wH) literal 8269 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
ss#;c8XTRRoDz4e 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 3) return; if(button == GLFW_MOUSE_BUTTON_LEFT) { mouseLeft = action == 1; return; } if(button == GLFW_MOUSE_BUTTON_RIGHT) { mouseRight = action == 1; return; } diff --git a/src/main/java/xyz/valnet/engine/Game.java b/src/main/java/xyz/valnet/engine/Game.java index 21d5163..4ba06a1 100644 --- a/src/main/java/xyz/valnet/engine/Game.java +++ b/src/main/java/xyz/valnet/engine/Game.java @@ -47,4 +47,12 @@ public abstract class Game { } public abstract void updateViewMatrix(Matrix4f matrix); + + public final void mouseDown(int button) { + scene.mouseDown(button); + } + + public final void mouseUp(int button) { + scene.mouseUp(button); + } } diff --git a/src/main/java/xyz/valnet/engine/math/Vector4f.java b/src/main/java/xyz/valnet/engine/math/Vector4f.java index 6e7d28f..b4b2e4a 100644 --- a/src/main/java/xyz/valnet/engine/math/Vector4f.java +++ b/src/main/java/xyz/valnet/engine/math/Vector4f.java @@ -26,4 +26,8 @@ public class Vector4f { return "(" + this.x + ", " + this.y + ", " + this.z + ", " + this.w + ")"; } + public boolean contains(float x, float y) { + return x >= this.x && x < this.x + this.z && y >= this.y && y < this.y + this.w; + } + } diff --git a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java index 682685c..809ea78 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java @@ -31,7 +31,7 @@ public class GameObject implements IRenderable, ITickable { public void render() {} @Override - public void tick(float dTime) {} + public void update(float dTime) {} public void start() {} diff --git a/src/main/java/xyz/valnet/engine/scenegraph/IScene.java b/src/main/java/xyz/valnet/engine/scenegraph/IScene.java index cd61300..7dddf66 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/IScene.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/IScene.java @@ -4,6 +4,9 @@ public interface IScene { public void render(); public void update(float dTime); + public void mouseDown(int button); + public void mouseUp(int button); + public void enable(); public void disable(); } diff --git a/src/main/java/xyz/valnet/engine/scenegraph/ITickable.java b/src/main/java/xyz/valnet/engine/scenegraph/ITickable.java index 9af77f9..fbbc58d 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/ITickable.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/ITickable.java @@ -1,5 +1,5 @@ package xyz.valnet.engine.scenegraph; public interface ITickable { - public void tick(float dTime); + public void update(float dTime); } diff --git a/src/main/java/xyz/valnet/hadean/HadeanGame.java b/src/main/java/xyz/valnet/hadean/HadeanGame.java index 5ec4452..585d4d8 100644 --- a/src/main/java/xyz/valnet/hadean/HadeanGame.java +++ b/src/main/java/xyz/valnet/hadean/HadeanGame.java @@ -31,31 +31,31 @@ public class HadeanGame extends Game { renderDebugInfo(); } - private Runtime runtime = Runtime.getRuntime(); - private static Vector4f fontColor = new Vector4f(0, 1, 1, 1); + // private Runtime runtime = Runtime.getRuntime(); + // private static Vector4f fontColor = new Vector4f(0, 1, 1, 1); private void renderDebugInfo() { - long allocated = runtime.totalMemory(); - long max = runtime.maxMemory(); + // long allocated = runtime.totalMemory(); + // long max = runtime.maxMemory(); - Assets.flat.pushColor(Vector4f.black); - Assets.font.drawString("FPS: " + Math.round(averageFPS) + "/" + measuredFPS + " | AVG/MEASURED", 1, 1); - Assets.font.drawString("Mouse: <" + App.mouseX + ", " + App.mouseY + ">", 1, 17); - Assets.font.drawString("MEMORY: " + (int)((allocated / (double)max) * 100) + "% (" + (allocated / (1024 * 1024)) + "/" + (max / (1024 * 1024)) + "MB)", 1, 33); - Assets.font.drawString("IPATHABLE", 1, 49); - Assets.font.drawString("", 1, 65); - Assets.font.drawString("", 1, 81); + // Assets.flat.pushColor(Vector4f.black); + // Assets.font.drawString("FPS: " + Math.round(averageFPS) + "/" + measuredFPS + " | AVG/MEASURED", 1, 1); + // Assets.font.drawString("Mouse: <" + App.mouseX + ", " + App.mouseY + ">", 1, 17); + // Assets.font.drawString("MEMORY: " + (int)((allocated / (double)max) * 100) + "% (" + (allocated / (1024 * 1024)) + "/" + (max / (1024 * 1024)) + "MB)", 1, 33); + // Assets.font.drawString("IPATHABLE", 1, 49); + // Assets.font.drawString("", 1, 65); + // Assets.font.drawString("", 1, 81); - Assets.flat.swapColor(fontColor); - Assets.font.drawString("FPS: " + Math.round(averageFPS) + "/" + measuredFPS + " | AVG/MEASURED", 0, 0); - Assets.font.drawString("Mouse: <" + App.mouseX + ", " + App.mouseY + ">", 0, 16); - Assets.font.drawString("MEMORY: " + (int)((allocated / (double)max) * 100) + "% (" + (allocated / (1024 * 1024)) + "/" + (max / (1024 * 1024)) + "MB)", 0, 32); - Assets.font.drawString("IPATHABLE", 0, 48); - Assets.font.drawString("", 0, 64); - Assets.font.drawString("", 0, 80); + // Assets.flat.swapColor(fontColor); + // Assets.font.drawString("FPS: " + Math.round(averageFPS) + "/" + measuredFPS + " | AVG/MEASURED", 0, 0); + // Assets.font.drawString("Mouse: <" + App.mouseX + ", " + App.mouseY + ">", 0, 16); + // Assets.font.drawString("MEMORY: " + (int)((allocated / (double)max) * 100) + "% (" + (allocated / (1024 * 1024)) + "/" + (max / (1024 * 1024)) + "MB)", 0, 32); + // Assets.font.drawString("IPATHABLE", 0, 48); + // Assets.font.drawString("", 0, 64); + // Assets.font.drawString("", 0, 80); - Assets.flat.popColor(); + // Assets.flat.popColor(); } // receive the updated matrix every frame for the actual window. @@ -63,5 +63,4 @@ public class HadeanGame extends Game { public void updateViewMatrix(Matrix4f matrix) { Assets.flat.setMatrices(matrix); } - } diff --git a/src/main/java/xyz/valnet/hadean/Layers.java b/src/main/java/xyz/valnet/hadean/Layers.java new file mode 100644 index 0000000..e1953c2 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/Layers.java @@ -0,0 +1,20 @@ +package xyz.valnet.hadean; + +public class Layers { + private static int current = 0; + public static int getMax() { + return current; + } + + public static final int BACKGROUND = current ++; + public static final int TILES = current ++; + public static final int GROUND = current ++; + public static final int AIR = current ++; + public static final int MARKERS = current ++; + public static final int SELECTION_IDENTIFIERS = current ++; + public static final int AREA_SELECT_BOX = current ++; + public static final int GENERAL_UI = current ++; + public static final int GENERAL_UI_INTERACTABLE = current ++; + public static final int BOTTOM_BAR = current ++; + +} diff --git a/src/main/java/xyz/valnet/hadean/Tile.java b/src/main/java/xyz/valnet/hadean/Tile.java index b108340..4fa685e 100644 --- a/src/main/java/xyz/valnet/hadean/Tile.java +++ b/src/main/java/xyz/valnet/hadean/Tile.java @@ -40,7 +40,7 @@ public class Tile extends GameObject { } @Override - public void tick(float dTime) { + public void update(float dTime) { for(ITileThing thing : stuff) { if(thing.shouldRemove()) { toRemove.add(thing); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/BottomBar.java b/src/main/java/xyz/valnet/hadean/gameobjects/BottomBar.java index d049aea..2223e8c 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/BottomBar.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/BottomBar.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.Layers; import xyz.valnet.hadean.input.Button; import xyz.valnet.hadean.input.IButtonListener; import xyz.valnet.hadean.input.SimpleButton; @@ -21,11 +22,11 @@ public class BottomBar extends GameObject implements IButtonListener { @Override public void start() { items.clear(); - btnItemTable.clear(); + clearButtons(); } public void registerButton(IBottomBarItem newItem) { - btnItemTable.clear(); + clearButtons(); items.add(newItem); int n = items.size(); @@ -35,9 +36,9 @@ public class BottomBar extends GameObject implements IButtonListener { int r = (int)(((i + 1) / (float) n) * screenWidth); int w = r - l; - Button btn = new SimpleButton(item.getTabName(), l, 576 - bottomBarHeight, w, bottomBarHeight); - + Button btn = new SimpleButton(item.getTabName(), l, 576 - bottomBarHeight, w, bottomBarHeight, Layers.BOTTOM_BAR); btn.registerClickListener(this); + add(btn); btnItemTable.put(btn, item); @@ -45,17 +46,11 @@ public class BottomBar extends GameObject implements IButtonListener { } } - @Override - public void render() { + private void clearButtons() { for(Button btn : btnItemTable.keySet()) { - btn.draw(); - } - } - @Override - public void tick(float dTime) { - for(Button btn : btnItemTable.keySet()) { - btn.update(); + remove(btn); } + btnItemTable.clear(); } @Override diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Log.java b/src/main/java/xyz/valnet/hadean/gameobjects/Log.java index d4f94d0..657d1de 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Log.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Log.java @@ -1,7 +1,9 @@ package xyz.valnet.hadean.gameobjects; +import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.Layers; import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Assets; @@ -23,6 +25,7 @@ public class Log extends GameObject implements ITileThing, ISelectable { @Override public void render() { + Drawing.setLayer(Layers.GROUND); camera.draw(Assets.log, x, y); } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java b/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java index 650db6e..ca215d4 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java @@ -26,13 +26,13 @@ import xyz.valnet.hadean.util.Assets; public class Pawn extends GameObject implements ISelectable { - private float x = 0.5f, y = 0.5f; + private float x = 0.5f + (int)(Math.random() * Terrain.WORLD_SIZE), y = 0.5f + (int)(Math.random() * Terrain.WORLD_SIZE); private float counter = 0; private Path path; - private final float invocationThreshold = 50 + (float)(Math.random() * 20); + private final float invocationThreshold = 100 + (float)(Math.random() * 50); private Camera camera; private Terrain terrain; @@ -108,7 +108,7 @@ public class Pawn extends GameObject implements ISelectable { } @Override - public void tick(float dTime) { + public void update(float dTime) { // then, try to do work! if(currentJob != null && currentJob.hasWork()) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java b/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java index 2d96b7b..018770f 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java @@ -4,14 +4,17 @@ import java.util.ArrayList; import java.util.List; import xyz.valnet.engine.App; +import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.Layers; +import xyz.valnet.hadean.input.IMouseListener; import xyz.valnet.hadean.util.Assets; import static xyz.valnet.engine.util.Math.lerp; -public class Selection extends GameObject { +public class Selection extends GameObject implements IMouseListener { public Vector2f initialCoords; private Camera camera; @@ -37,30 +40,14 @@ public class Selection extends GameObject { private List toRemove = new ArrayList(); @Override - public void tick(float dTime) { + public void update(float dTime) { if(animation < animationMax) animation ++; if(animation > animationMax) animation = animationMax; - // TODO at some point, this will need to be blocked by other things on top. like a ui over the scene should make selections like, not happen?! - if(App.mouseRight) { - Vector2f currentMouseCoords = new Vector2f(App.mouseX, App.mouseY); - if(initialCoords == null) { - initialCoords = currentMouseCoords; - } - } else { - if(initialCoords != null) { - - makeSelection(new Vector4f( - initialCoords.x, - initialCoords.y, - App.mouseX, - App.mouseY - )); - - initialCoords = null; - } - } + // if(!active) return; + // if any of our selection just RANDOMLY isnt in the scene anymore, well + // stop selecting it dumbass for(ISelectable selectable : selected) { if(selectable instanceof GameObject) { if(!((GameObject)selectable).inScene()) { @@ -84,6 +71,7 @@ public class Selection extends GameObject { Vector4f box = thing.getWorldBox(); Vector2f min = camera.world2screen(box.x - p, box.y - p); Vector2f max = camera.world2screen(box.z + p, box.w + p); + Drawing.setLayer(Layers.SELECTION_IDENTIFIERS); Assets.selectedFrame.draw((int)min.x, (int)min.y, (int)(max.x - min.x), (int)(max.y - min.y)); thing.selectedRender(); } @@ -151,4 +139,52 @@ public class Selection extends GameObject { return !( aLeftOfB || aRightOfB || aAboveB || aBelowB ); } + + private boolean active = false; + + @Override + public void mouseEnter() { + active = true; + } + + @Override + public void mouseLeave() { + active = false; + } + + @Override + public Vector4f getBox() { + return new Vector4f(0, 0, 1000, 1000); + } + + @Override + public int getLayer() { + return 0; + } + + @Override + public boolean mouseDown(int button) { + if(!active) return false; + if(button == 0) { + if(initialCoords == null) { + initialCoords = new Vector2f(App.mouseX, App.mouseY); + } + } + return false; + } + + @Override + public void mouseUp(int button) { + if(initialCoords != null && button == 0) { + + makeSelection(new Vector4f( + initialCoords.x, + initialCoords.y, + App.mouseX, + App.mouseY + )); + + initialCoords = null; + } + } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java index efbb684..5fda511 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java @@ -4,14 +4,17 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.Layers; import xyz.valnet.hadean.input.Button; import xyz.valnet.hadean.input.IButtonListener; +import xyz.valnet.hadean.input.IMouseListener; import xyz.valnet.hadean.input.SimpleButton; import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Assets; -public class SelectionUI extends GameObject implements ISelectionChangeListener, IButtonListener { +public class SelectionUI extends GameObject implements ISelectionChangeListener, IButtonListener, IMouseListener { private String name = ""; private int count = 0; @@ -21,10 +24,13 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, private HashMap> narrowBuckets = new HashMap>(); private static final Button[] ACTIONS_BUTTONS_NULL = new Button[] {}; - + private Button[] actionButtons = ACTIONS_BUTTONS_NULL; private Selection selectionManager; + private final int width = 300, height = 200; + private final int padding = 10; + private final int actionButtonSize = 100; // this will be null normally, but set if // a button has been pressed to update the selection. @@ -42,7 +48,7 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, public void render() { if(selected.isEmpty()) return; - Assets.uiFrame.draw(10, 366, 300, 200); + Assets.uiFrame.draw(10, 576 - BottomBar.bottomBarHeight - height - padding, width, height); // int i = 0; // for(String name : selectedTypes.keySet()) { @@ -53,54 +59,53 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, if(selectedTypes.size() == 1) { - Assets.font.drawString("" + count + "x " + name, 26, 376); + Assets.font.drawString("" + count + "x " + name, 26, 576 - BottomBar.bottomBarHeight - height); if(count == 1) { String details = selected.get(0).details(); - Assets.font.drawString(details, 26, 376 + 32); - } - - for(Button btn : actionButtons) { - btn.draw(); + Assets.font.drawString(details, 26, 576 - BottomBar.bottomBarHeight - height + 32); } } else { - for(Button btn : narrowButtons.values()) { - btn.draw(); - } } } @Override - public void tick(float dTime) { + public void update(float dTime) { if(newSelection != null) { selectionManager.updateSelection(newSelection); newSelection = null; } if(selectedTypes.size() == 1) { - for(Button btn : actionButtons) { - btn.update(); - } } else { - for(Button btn : narrowButtons.values()) { - btn.update(); - } } } private HashMap buttonActionMap = new HashMap(); + private void addNarrowButton(String str, Button btn) { + narrowButtons.put(str, btn); + add(btn); + } + + private void clearNarrowButtons() { + for(GameObject obj : narrowButtons.values()) { + remove(obj); + } + narrowButtons.clear(); + } + @Override public void selectionChanged(List selected) { this.selected = selected; selectedTypes.clear(); - narrowButtons.clear(); + clearNarrowButtons(); narrowBuckets.clear(); buttonActionMap.clear(); - actionButtons = ACTIONS_BUTTONS_NULL; + setActionButtons(ACTIONS_BUTTONS_NULL); for(ISelectable selectable : selected) { String name = selectable.getClass().getName(); String[] splitName = name.split("\\."); @@ -114,27 +119,41 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, btn.setText("" + items.size() + "x " + shortName); count ++; } else { - Button btn = new SimpleButton("1x " + shortName, 20, 376 + 30 * selectedTypes.size(), 280, 24); + Button btn = new SimpleButton("1x " + shortName, 20, 576 - BottomBar.bottomBarHeight - height + 30 * selectedTypes.size(), width - padding * 2, 24, Layers.GENERAL_UI_INTERACTABLE); btn.registerClickListener(this); selectedTypes.put(name, 1); - narrowButtons.put(name, btn); + addNarrowButton(name, btn); List list = new ArrayList(); list.add(selectable); narrowBuckets.put(btn, list); count = 1; this.name = shortName; - if(actionButtons == ACTIONS_BUTTONS_NULL) { - Action[] actions = selectable.getActions(); - Button[] actionButtons = new Button[actions.length]; - for(int i = 0; i < actions.length; i ++) { - actionButtons[i] = new SimpleButton(actions[i].name, 320 + i * 110, 466, 100, 100); - actionButtons[i].registerClickListener(this); - buttonActionMap.put(actionButtons[i], actions[i]); - } - this.actionButtons = actionButtons; - } } } + if(selectedTypes.size() == 1) { + // TODO this should only pull common actions to all elements, but rn just pulls the first things actions + Action[] actions = selected.get(0).getActions(); + Button[] actionButtons = new Button[actions.length]; + for(int i = 0; i < actions.length; i ++) { + actionButtons[i] = new SimpleButton(actions[i].name, width + padding * 2 + i * (actionButtonSize + padding), 576 - padding - actionButtonSize - BottomBar.bottomBarHeight, actionButtonSize, actionButtonSize, Layers.GENERAL_UI_INTERACTABLE); + actionButtons[i].registerClickListener(this); + buttonActionMap.put(actionButtons[i], actions[i]); + } + setActionButtons(actionButtons); + } + if(selectedTypes.size() <= 1) { + clearNarrowButtons(); + } + } + + private void setActionButtons(Button[] buttons) { + for(Button btn : this.actionButtons) { + remove(btn); + } + this.actionButtons = buttons; + for(Button btn : this.actionButtons) { + add(btn); + } } @Override @@ -148,4 +167,35 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, } } } + + @Override + public void mouseEnter() { + + } + + @Override + public void mouseLeave() { + + } + + @Override + public boolean mouseDown(int button) { + return false; + } + + @Override + public void mouseUp(int button) { + + } + + @Override + public Vector4f getBox() { + if(selected.isEmpty()) return Vector4f.zero; + return new Vector4f(10, 576 - BottomBar.bottomBarHeight - height - padding, width, height); + } + + @Override + public int getLayer() { + return Layers.GENERAL_UI; + } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java index e7adc50..ad279c5 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java @@ -4,7 +4,6 @@ import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.hadean.Tile; import xyz.valnet.hadean.pathfinding.IPathable; -// TODO SPLIT PATHABLES. | implements IPathable, the thing that has callbacks for interfacing with a pathfinder. public class Terrain extends GameObject implements IPathable { public static final int WORLD_SIZE = 24; @@ -32,6 +31,7 @@ public class Terrain extends GameObject implements IPathable { return tiles[x][y]; } + // TODO implement directionality. even the pathfinder doesnt give this info... @Override public boolean isWalkable(int x, int y, int fromX, int fromY) { if(!isOutOfBounds(x, y)) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Tree.java b/src/main/java/xyz/valnet/hadean/gameobjects/Tree.java index 21efdd9..94fee9d 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Tree.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Tree.java @@ -1,14 +1,15 @@ package xyz.valnet.hadean.gameobjects; +import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.Layers; import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Assets; public class Tree extends GameObject implements ITileThing, ISelectable, IWorkable { private Camera camera; - private Terrain terrain; private boolean chopFlag = false; @@ -21,15 +22,16 @@ public class Tree extends GameObject implements ITileThing, ISelectable, IWorkab public void start() { camera = get(Camera.class); - terrain = get(Terrain.class); } @Override public void render() { Assets.flat.pushColor(new Vector4f(1 - getProgress(), 1 - getProgress(), 1 - getProgress(), 1.0f)); + Drawing.setLayer(Layers.AIR); camera.draw(Assets.tree, x - 1, y - 2, 3, 3); Assets.flat.popColor(); if(hasWork()) { + Drawing.setLayer(Layers.MARKERS); camera.draw(Assets.lilAxe, x, y); } } @@ -76,7 +78,7 @@ public class Tree extends GameObject implements ITileThing, ISelectable, IWorkab } protected float choppage = 0; - protected int strength = 500; + protected int strength = 5000; private float getProgress() { return (choppage / (float) strength); @@ -94,7 +96,7 @@ public class Tree extends GameObject implements ITileThing, ISelectable, IWorkab } @Override - public void tick(float dTime) { + public void update(float dTime) { if(choppage >= strength) { return; } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/ArchitectTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/ArchitectTab.java index ac061ff..0698d3f 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/ArchitectTab.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/ArchitectTab.java @@ -37,11 +37,13 @@ public class ArchitectTab extends Tab implements ISelectionChangeListener { public void start() { super.start(); selection = get(Selection.class); - selection.subscribe(this); + if(selection != null) { + selection.subscribe(this); + } } @Override - public void tick(float dTime) { + public void update(float dTime) { progress = lerp(progress, opened ? 1 : 0, 0.05f); } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/MenuTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/MenuTab.java index 17f5c30..642ac0a 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/MenuTab.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/MenuTab.java @@ -11,5 +11,23 @@ public class MenuTab extends Tab { public String getTabName() { return "Menu"; } + + // @Override + // public void tick(float dTime) { + // } + + // @Override + // public void render() { + // } + + // @Override + // public void start() { + // super.start(); + // add(new GOButton() + // .setDimensions(200, 300, 100, 100, 50)); + // add(new GOButton() + // .setDimensions(250, 350, 100, 100, 55)); + + // } } diff --git a/src/main/java/xyz/valnet/hadean/input/Button.java b/src/main/java/xyz/valnet/hadean/input/Button.java index 66d509e..3eba980 100644 --- a/src/main/java/xyz/valnet/hadean/input/Button.java +++ b/src/main/java/xyz/valnet/hadean/input/Button.java @@ -2,15 +2,16 @@ package xyz.valnet.hadean.input; import static xyz.valnet.engine.util.Math.lerp; -import xyz.valnet.engine.App; +import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Tile9; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4i; +import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.hadean.util.Assets; -public class Button { +public class Button extends GameObject implements IMouseListener { - private final int x, y, width, height; + private int x, y, width, height; private String text; protected Tile9 frame; protected Tile9 frameHover; @@ -24,7 +25,9 @@ public class Button { protected float activeVPad = 0.1f; protected float activeHPad = 0.0f; - public Button(Tile9 frame, String text, int x, int y, int w, int h) { + protected int layer; + + public Button(Tile9 frame, String text, int x, int y, int w, int h, int l) { this.x = x; this.y = y; width = w; @@ -34,6 +37,7 @@ public class Button { this.frameHover = frame; setText(text); box = new Vector4i(x, y, w, h); + layer = l; } public void setText(String text) { @@ -43,7 +47,9 @@ public class Button { textHeight = measuredText.y; } - public void draw() { + @Override + public void render() { + Drawing.setLayer(layer); if(state == HOVER) { frameHover.draw(box.x, box.y, box.z, box.w); } else if(state == ACTIVE) { @@ -61,7 +67,16 @@ public class Button { Assets.flat.popColor(); } + // public void draw(int x, int y, int w, int h) { + // this.x = x; + // this.y = y; + // width = w; + // height = h; + // render(); + // } + private boolean hovered = false; + private boolean mouseDown = false; private int state = 0; private final static int IDLE = 0; @@ -73,14 +88,16 @@ public class Button { private IButtonListener listener = null; public void update() { + update(1); + } + + @Override + public void update(float dTime) { box.x = x - (int)hPad; box.y = y - (int)vPad; box.z = width + ((int)hPad) * 2; box.w = height + ((int)vPad) * 2; - hovered = App.mouseX >= box.x && App.mouseX <= box.x + box.z && App.mouseY >= box.y && App.mouseY <= box.y + box.w; - boolean mouseDown = App.mouseLeft; - float desiredVPad = 0, desiredHPad = 0; if(state == HOVER) { @@ -132,4 +149,46 @@ public class Button { public void registerClickListener(IButtonListener listener) { this.listener = listener; } + + @Override + public void mouseEnter() { + hovered = true; + } + + @Override + public void mouseLeave() { + hovered = false; + } + + @Deprecated + // this should only be used when its not added to a scene (with gameobjects!), + // which increasingly should NOT be the case. + public void setMouseCoords(float x, float y) { + hovered = x >= box.x && x <= box.x + box.z && y >= box.y && y <= box.y + box.w; + } + + @Override + public boolean mouseDown(int button) { + if(button == 0) { + mouseDown = true; + } + return false; + } + + @Override + public void mouseUp(int button) { + if(button == 0) { + mouseDown = false; + } + } + + @Override + public Vector4f getBox() { + return new Vector4f(x, y, width, height); + } + + @Override + public int getLayer() { + return layer; + } } diff --git a/src/main/java/xyz/valnet/hadean/input/GOButton.java b/src/main/java/xyz/valnet/hadean/input/GOButton.java new file mode 100644 index 0000000..12ce414 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/input/GOButton.java @@ -0,0 +1,63 @@ +package xyz.valnet.hadean.input; + +import xyz.valnet.engine.graphics.Drawing; +import xyz.valnet.engine.math.Vector4f; +import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.util.Assets; + +public class GOButton extends GameObject implements IMouseListener { + + private boolean hovered = false; + public int layer = 1; + public int x, y, w, h; + + public GOButton setDimensions(int x, int y, int w, int h, int l) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.layer = l; + return this; + } + + @Override + public void render() { + Drawing.setLayer(layer); + if(hovered) { + Assets.uiFrameLight.draw(x, y, w, h); + } else { + Assets.uiFrame.draw(x, y, w, h); + } + } + + @Override + public void mouseEnter() { + hovered = true; + } + + @Override + public void mouseLeave() { + hovered = false; + } + + @Override + public boolean mouseDown(int button) { + return false; + } + + @Override + public void mouseUp(int button) { + + } + + @Override + public Vector4f getBox() { + return new Vector4f(x, y, w, h); + } + + @Override + public int getLayer() { + return layer; + } + +} diff --git a/src/main/java/xyz/valnet/hadean/input/IMouseListener.java b/src/main/java/xyz/valnet/hadean/input/IMouseListener.java new file mode 100644 index 0000000..7a0fc58 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/input/IMouseListener.java @@ -0,0 +1,13 @@ +package xyz.valnet.hadean.input; + +import xyz.valnet.engine.math.Vector4f; + +public interface IMouseListener { + public void mouseEnter(); + public void mouseLeave(); + public boolean mouseDown(int button); + public void mouseUp(int button); + + public Vector4f getBox(); + public int getLayer(); +} diff --git a/src/main/java/xyz/valnet/hadean/input/SimpleButton.java b/src/main/java/xyz/valnet/hadean/input/SimpleButton.java index 2bb3c39..fb67262 100644 --- a/src/main/java/xyz/valnet/hadean/input/SimpleButton.java +++ b/src/main/java/xyz/valnet/hadean/input/SimpleButton.java @@ -4,8 +4,8 @@ import xyz.valnet.hadean.util.Assets; public class SimpleButton extends Button { - public SimpleButton(String text, int x, int y, int w, int h) { - super(Assets.uiFrame, text, x, y, w, h); + public SimpleButton(String text, int x, int y, int w, int h, int l) { + super(Assets.uiFrame, text, x, y, w, h, l); this.activeHPad = 0f; this.activeVPad = 0f; diff --git a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java index 7e0eae1..800f89b 100644 --- a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java +++ b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java @@ -1,8 +1,10 @@ package xyz.valnet.hadean.scenes; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import xyz.valnet.engine.App; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.IScene; import xyz.valnet.hadean.gameobjects.BottomBar; @@ -13,6 +15,16 @@ import xyz.valnet.hadean.gameobjects.SelectionUI; import xyz.valnet.hadean.gameobjects.Terrain; import xyz.valnet.hadean.gameobjects.tabs.ArchitectTab; import xyz.valnet.hadean.gameobjects.tabs.MenuTab; +import xyz.valnet.hadean.input.IMouseListener; + +// TODO BIG IDEAS +// have caches of types that ill need (Like IMouseListener) +// and the add method, simply puts things into the newObjects +// then at the beginning of each frame, they are all loaded. +// then, even userspace scenes can add all their objects in +// one fell swoop and the timings will be maintained +// IE: all objects will be linked and able to be `get`ed +// at their start call! :D public class GameScene implements IScene { @@ -22,6 +34,8 @@ public class GameScene implements IScene { private List removeObjects = new ArrayList(); // private List renderables = new ArrayList(); + private IMouseListener hoveredMouseListener = null; + // specific public T get(Class clazz) { @@ -52,6 +66,7 @@ public class GameScene implements IScene { @Override public void update(float dTime) { + // ADD OBJECTS if(!newObjects.isEmpty()) { List added = new ArrayList(); @@ -66,6 +81,7 @@ public class GameScene implements IScene { } } + // REMOVE OBJECTS if(!removeObjects.isEmpty()) { for(GameObject obj : removeObjects) { objects.remove(obj); @@ -73,8 +89,38 @@ public class GameScene implements IScene { removeObjects.clear(); } + // TICK OBJECTS for(GameObject obj : objects) { - obj.tick(dTime); + obj.update(dTime); + } + + // DO MOUSE UPDATES! + List mouseListeners = getAll(IMouseListener.class); + mouseListeners.sort(new Comparator() { + @Override + public int compare(IMouseListener a, IMouseListener b) { + int al = a.getLayer(); + int bl = b.getLayer(); + return al < bl ? 1 : bl < al ? -1 : 0; + } + }); + for(IMouseListener listener : mouseListeners) { + boolean currentlyEntered = listener.getBox().contains(App.mouseX, App.mouseY); + if(currentlyEntered) { + if(listener != hoveredMouseListener) { + if(hoveredMouseListener != null) { + hoveredMouseListener.mouseLeave(); + } + hoveredMouseListener = listener; + listener.mouseEnter(); + } + break; + } else if(listener == hoveredMouseListener) { + // this is the one that is currently hovered, but it isnt! + // turn that shit OFF + hoveredMouseListener.mouseLeave(); + hoveredMouseListener = null; + } } } @@ -84,6 +130,7 @@ public class GameScene implements IScene { for(int i = 0; i < 5; i ++) { objects.add(new Pawn()); } + objects.add(new Camera()); objects.add(new Selection()); objects.add(new SelectionUI()); @@ -117,5 +164,19 @@ public class GameScene implements IScene { public boolean inScene(GameObject gameObject) { return objects.contains(gameObject); } + + @Override + public void mouseDown(int button) { + for(IMouseListener iml : getAll(IMouseListener.class)) { + iml.mouseDown(button); + } + } + + @Override + public void mouseUp(int button) { + for(IMouseListener iml : getAll(IMouseListener.class)) { + iml.mouseUp(button); + } + } } diff --git a/src/main/java/xyz/valnet/hadean/scenes/MenuScene.java b/src/main/java/xyz/valnet/hadean/scenes/MenuScene.java index fcaa5a5..797d0ae 100644 --- a/src/main/java/xyz/valnet/hadean/scenes/MenuScene.java +++ b/src/main/java/xyz/valnet/hadean/scenes/MenuScene.java @@ -1,7 +1,9 @@ package xyz.valnet.hadean.scenes; +import xyz.valnet.engine.App; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.IScene; +import xyz.valnet.hadean.Layers; import xyz.valnet.hadean.input.Button; import xyz.valnet.hadean.input.IButtonListener; import xyz.valnet.hadean.util.Assets; @@ -10,10 +12,10 @@ import static xyz.valnet.hadean.HadeanGame.Hadean; public class MenuScene implements IScene, IButtonListener { - private Button btnNewGame = new Button(Assets.frame, "New Game", 50, 200, 128, 32); - private Button btnLoadGame = new Button(Assets.frame, "Load Game", 50, 240, 128, 32); - private Button btnOptions = new Button(Assets.frame, "Options", 50, 280, 128, 32); - private Button btnQuit = new Button(Assets.frame, "Quit", 50, 320, 128, 32); + private Button btnNewGame = new Button(Assets.frame, "New Game", 50, 200, 128, 32, Layers.GENERAL_UI); + private Button btnLoadGame = new Button(Assets.frame, "Load Game", 50, 240, 128, 32, Layers.GENERAL_UI); + private Button btnOptions = new Button(Assets.frame, "Options", 50, 280, 128, 32, Layers.GENERAL_UI); + private Button btnQuit = new Button(Assets.frame, "Quit", 50, 320, 128, 32, Layers.GENERAL_UI); public MenuScene() { btnNewGame.registerClickListener(this); @@ -30,18 +32,22 @@ public class MenuScene implements IScene, IButtonListener { @Override public void render() { Assets.flat.pushColor(green); - btnNewGame.draw(); + btnNewGame.render(); Assets.flat.swapColor(cyan); - btnLoadGame.draw(); + btnLoadGame.render(); Assets.flat.swapColor(yellow); - btnOptions.draw(); + btnOptions.render(); Assets.flat.swapColor(red); - btnQuit.draw(); + btnQuit.render(); Assets.flat.popColor(); } @Override public void update(float dTime) { + btnNewGame.setMouseCoords(App.mouseX, App.mouseY); + btnLoadGame.setMouseCoords(App.mouseX, App.mouseY); + btnOptions.setMouseCoords(App.mouseX, App.mouseY); + btnQuit.setMouseCoords(App.mouseX, App.mouseY); btnNewGame.update(); btnLoadGame.update(); btnOptions.update(); @@ -74,5 +80,21 @@ public class MenuScene implements IScene, IButtonListener { public void disable() { } + + @Override + public void mouseDown(int button) { + btnNewGame.mouseDown(button); + btnLoadGame.mouseDown(button); + btnOptions.mouseDown(button); + btnQuit.mouseDown(button); + } + + @Override + public void mouseUp(int button) { + btnNewGame.mouseUp(button); + btnLoadGame.mouseUp(button); + btnOptions.mouseUp(button); + btnQuit.mouseUp(button); + } } diff --git a/src/main/java/xyz/valnet/hadean/util/Assets.java b/src/main/java/xyz/valnet/hadean/util/Assets.java index 49b6818..44b2932 100644 --- a/src/main/java/xyz/valnet/hadean/util/Assets.java +++ b/src/main/java/xyz/valnet/hadean/util/Assets.java @@ -29,6 +29,7 @@ public class Assets { public static final Sprite rocks; public static final Sprite log; public static final Sprite lilAxe; + public static final Sprite haulArrow; public static final SimpleShader flat; @@ -49,6 +50,7 @@ public class Assets { rocks = new Sprite(atlas, 64, 104, 8, 8); log = new Sprite(atlas, 48, 96, 16, 16); lilAxe = new Sprite(atlas, 64, 88, 16, 16); + haulArrow = new Sprite(atlas, 80, 88, 16, 16); Map charset = new HashMap();