From d75ea2427c8ad204a4c035ea0e266abf291ba137 Mon Sep 17 00:00:00 2001 From: koneko <67551503+koneko@users.noreply.github.com> Date: Sat, 18 Jan 2025 14:01:18 +0100 Subject: [PATCH 1/3] render range preview above cells --- src/classes/game/Grid.ts | 26 ++++++++++++++++---------- src/classes/game/TowerManager.ts | 1 - 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/classes/game/Grid.ts b/src/classes/game/Grid.ts index 5b3da79..377988e 100644 --- a/src/classes/game/Grid.ts +++ b/src/classes/game/Grid.ts @@ -18,7 +18,6 @@ export class Cell extends GameObject { public g: PIXI.Graphics; public hasTowerPlaced: boolean = false; public clickDetector: PIXI.Graphics; - public rangePreview: PIXI.Graphics; constructor(type: TerrainType, row: number, column: number, isPath: boolean) { super(); @@ -39,9 +38,7 @@ export class Cell extends GameObject { interactive: true, }); // ? TODO: make range preview 1 global graphics obj, child. fix - this.rangePreview = new PIXI.Graphics({ - zIndex: 10, - }); + this.g = new PIXI.Graphics({ zIndex: 5, }); @@ -49,7 +46,6 @@ export class Cell extends GameObject { this.clickDetector.fill({ color: 0xff0000, alpha: 0 }); this.container.addChild(this.clickDetector); this.container.addChild(this.g); - this.container.addChild(this.rangePreview); this.clickDetector.on('pointerup', (e) => { Engine.Grid.onGridCellClicked(row, column); }); @@ -57,12 +53,12 @@ export class Cell extends GameObject { Engine.GameScene.events.emit(GridEvents.CellMouseOver, this); }); this.clickDetector.on('pointerleave', (e) => { - this.rangePreview.clear(); + Engine.Grid.rangePreview.clear(); }); Engine.GameScene.events.on(TowerEvents.TowerPlacedEvent, (_, row, col) => { if (row == this.row && col == this.column) { this.hasTowerPlaced = true; - this.rangePreview.clear(); + Engine.Grid.rangePreview.clear(); } }); Engine.GameScene.events.on(TowerEvents.TowerSoldEvent, (_, row, col) => { @@ -74,9 +70,13 @@ export class Cell extends GameObject { public showRangePreview(invalid, range) { let color = 0xffffff; if (invalid) color = 0xff0000; - this.rangePreview.clear(); - this.rangePreview.circle(Engine.GridCellSize / 2, Engine.GridCellSize / 2, range * Engine.GridCellSize); - this.rangePreview.fill({ color: color, alpha: 0.3 }); + Engine.Grid.rangePreview.clear(); + Engine.Grid.rangePreview.circle( + this.column * Engine.GridCellSize + Engine.GridCellSize / 2, + this.row * Engine.GridCellSize + Engine.GridCellSize / 2, + range * Engine.GridCellSize + ); + Engine.Grid.rangePreview.fill({ color: color, alpha: 0.3 }); } public checkIfCantPlace() { return ( @@ -104,6 +104,7 @@ export class Cell extends GameObject { export class Grid extends GameObject { private gameMap: GameMapDefinition; private cells: Cell[] = []; + public rangePreview: PIXI.Graphics; public creeps: Creep[] = []; public gridShown: boolean = false; @@ -115,6 +116,7 @@ export class Grid extends GameObject { this.bb.y = 0; this.bb.width = Engine.GridCellSize * Engine.GridColumns; this.bb.height = Engine.GridCellSize * Engine.GridRows; + Engine.GameMaster.currentScene.stage.addChild(this.container); let background = new PIXI.Sprite(GameAssets.MissionBackgrounds[missionIndex]); @@ -130,6 +132,10 @@ export class Grid extends GameObject { this.cells.push(cell); } } + this.rangePreview = new PIXI.Graphics({ + zIndex: 10, + }); + this.container.addChild(this.rangePreview); } public toggleGrid(force?: 'hide' | 'show') { this.cells.forEach((cell) => { diff --git a/src/classes/game/TowerManager.ts b/src/classes/game/TowerManager.ts index ea19e29..c5f2d29 100644 --- a/src/classes/game/TowerManager.ts +++ b/src/classes/game/TowerManager.ts @@ -27,7 +27,6 @@ export default class TowerManager { if (this.isPlacingTower) { let cantPlace = cell.checkIfCantPlace(); if (cantPlace) { - cell.rangePreview.clear(); cell.showRangePreview(true, this.selectedTower.stats.range); this.previewSprite.tint = 0xff0000; } else { From 0f1c32e868a8ee14deed320a48688ed8bfe551c8 Mon Sep 17 00:00:00 2001 From: koneko <67551503+koneko@users.noreply.github.com> Date: Sat, 18 Jan 2025 22:07:11 +0100 Subject: [PATCH 2/3] tooltip initial thoughts --- docs/assets.md | 3 +- public/assets/gui/frame_04.png | Bin 0 -> 14648 bytes .../assets/gui/{slot_02.PNG => frame_inv.png} | Bin public/assets/gui/gem_amount.png | Bin 0 -> 3284 bytes public/assets/gui/gem_amount_0.png | Bin 0 -> 2243 bytes public/assets/gui/gem_amount_1.png | Bin 0 -> 3045 bytes public/assets/gui/gem_amount_2.png | Bin 0 -> 3195 bytes public/assets/gui/gem_amount_3.png | Bin 0 -> 2950 bytes public/assets/gui/gem_amount_4.png | Bin 0 -> 3049 bytes public/assets/gui/gem_amount_5.png | Bin 0 -> 3053 bytes public/assets/gui/gem_amount_6.png | Bin 0 -> 3197 bytes src/classes/Assets.ts | 14 ++- src/classes/Bastion.ts | 2 + src/classes/game/Grid.ts | 9 +- src/classes/game/TowerManager.ts | 3 + src/classes/gui/Tooltip.ts | 110 ++++++++++++++++-- src/classes/gui/TowerTab.ts | 26 ++++- src/main.ts | 4 + src/scenes/Game.ts | 3 + 19 files changed, 157 insertions(+), 17 deletions(-) create mode 100755 public/assets/gui/frame_04.png rename public/assets/gui/{slot_02.PNG => frame_inv.png} (100%) create mode 100644 public/assets/gui/gem_amount.png create mode 100644 public/assets/gui/gem_amount_0.png create mode 100644 public/assets/gui/gem_amount_1.png create mode 100644 public/assets/gui/gem_amount_2.png create mode 100644 public/assets/gui/gem_amount_3.png create mode 100644 public/assets/gui/gem_amount_4.png create mode 100644 public/assets/gui/gem_amount_5.png create mode 100644 public/assets/gui/gem_amount_6.png diff --git a/docs/assets.md b/docs/assets.md index 8050bb1..3af6d02 100644 --- a/docs/assets.md +++ b/docs/assets.md @@ -1,4 +1,5 @@ # Assets List of assets used in the project, all purchased. -https://assetstore.unity.com/packages/2d/gui/icons/gui-megapack-101517 +https://assetstore.unity.com/packages/2d/gui/icons/gui-megapack-101517 +https://magory.itch.io/ultimate-gem-collections diff --git a/public/assets/gui/frame_04.png b/public/assets/gui/frame_04.png new file mode 100755 index 0000000000000000000000000000000000000000..7828160c8c607261fc17b65922f85b43981c4f67 GIT binary patch literal 14648 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 S#>w>n0000v%`BId^h=L zW@k>jXKp$7+`An*w3l`dw0q$H?184%uKb!cYj#EF)?f?p4_MgL)bwX-+fmY2xC5x* zEQG%Ux`XAQN206?*A2i@@IKfCtO19CzrjlIJLm;ggFnEg39s)vg4c1@i*4nsx_YVj zj$jDb1zZODfbBsy&=qW0l;Oxa9uy+ZFH%&w5JBI8k3l!Eim$Z{{0LS6ziPvUijPLf zj-U{S7UBSmnu$U4!BQ$}C2s=f7xk4Yyf%p6--F2wd$R}uRPs77qO!95J_$@H(h11A z7VNLxT+arl6;X#=GElx9xDOnWR!N`PGQdW;6jU%FXAdy3^f-}!Cf9R|baIrfC>#c6 zgYNZ|^KL9St_TB>aVIFv3e9#VPB@zD6`)g;@r@FpXgW9xY#6E-?>7L~hv-5!!SASl zc%7EE8}IG_`-WuYevj~e;9js#;`u09(AsY|iy}@Tg4eEQSE?%_v1uaLtNl26_0{A< zs7=0iR>AO$2K!~@E9>hs;NLdnfHL|Mp}jTMR->z6LD&q49s^$oiK_{g@yJSAdS8xKnh>IUD{ij`li)Y3 z&R!5QJn6#@W|;&)KN;93a|c`So(%2=E}k+M_yz&P^31$WG1q|8K~q)%(4PmK0-L9* zyd~jx5Y!2Fp-d&=*NNF?A{cfDhvlgNJX0I}@|Cqjo`Ya;CP?#6QU^cCu~8obB7>Y0 zGP!zfzncc{xIB&v=|iU7@g}f&h_;3!9)kCXATLD5*oOk={NsZRYb$>P^dn;Fv(hC_ z?ax&`nb@H}2N)kzb)&QaYBi(gLPt-~IZ=2D*P4SF@1{Zf8hARBWf_Q_fxt(wyaikX z1i7I(0L+H)Td*=J^8~|`ls;%Ye;06dXU3+b@cRee-yR?Fdw*3T4$x0(uz}a6KO5rw@8x>Y1_2$ zl^0O)pDG&IETIxT2E-;k zT))ROy^vvzzBk_xlXy*St!Z7rs41rW5<}EVG_L(a#R0pjrKC9^whP!&a*w_tYcsx& z>58`4s@9$6fbAoduYfLhvNKXg44Jb)%xt8SsvOnGEbt)$b1h9{YL$WJGiaR&LM7Ev zX%3Jurns~;SJ>9Y5ZE&Zp<;J+y|7M6b3o9Wgr6oXU2Npa)rBn0_}()JFeZuCAKisHB^c zPBkVY%(b_y0g`+`7oI&+WUXRkp?gc{27`{=&%=hAQ#kKdg;tCv4ITwUOUk+53)};m zx1`gGOJ`u_wK)singxC41@;6zfGMxK+vU8!w61*+ya1Z#O0MSA&8h_F`osxlgD+?; z2cXM+2X~HI3cpR(n7Q&=wOh=y2_XkO4pA2gL8iU^#0f*WnvPnpen7sbPg2hX_`$&7 zsDHfBIKLfa{zu=`g%H` zJq8j7Zf5|y_I&8)rRss$9T@w(eQ6FjBgUXgnxrKR;5w_wmVhi%;tzm-}M5`1Cn zj;fPh22X;RWo9jh9tppvH==abBTAb4MO@uL&0OHS1=uR%3k){`kEH|$!8EB!OYqc2 zF8-2C_&sN6Ys$PwsSNl$uXu5-4^eY_JYn$2iMvBHB9e|(en5sz1)z4 z5$2J&*rjqguk&)Q+#!62fGhKiBk;Jl>Apc`$5k;T{kgYeLKbPzj|UB%>xDmaTmg>< zv)mU9nj3X`BiWere9)^1y)Z^_qIn0d&b>iH>JTj9o%4BA(P0oi2NuQXjdDOqGXfvw z-X*Z(LfwKPdqeO6h*_%Ell2HMZG9n?j`&wW z7#=bN8MlSxBwgj;kgP)9qs)bp6-;#k&kdvugo@JVSTelE2kFH-*Dc2Xh3E?kQISm? zI6_x-Bc4qu(imiI0&Y%|$upP4I~1ue=ztOdNe*x)Q(z#I> R)Vu%y002ovPDHLkV1g~(Al(1} literal 0 HcmV?d00001 diff --git a/public/assets/gui/gem_amount_1.png b/public/assets/gui/gem_amount_1.png new file mode 100644 index 0000000000000000000000000000000000000000..936deb97381b77a983f2f61dd339b3ecd87a96c8 GIT binary patch literal 3045 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 literal 0 HcmV?d00001 diff --git a/public/assets/gui/gem_amount_2.png b/public/assets/gui/gem_amount_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a98bb3e828e5fd321d946c75d11d331e294436ea GIT binary patch literal 3195 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 literal 0 HcmV?d00001 diff --git a/public/assets/gui/gem_amount_3.png b/public/assets/gui/gem_amount_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d1cbf01517063bcda9b5625b42fe4c78612f474a GIT binary patch literal 2950 zcmV;13wiX3P)6dr1j|7#y-G%58Bx5~l{e2b;6~u|8JRknP&DQ$ zTCx{dtENS&wR89d@C;Z6RBzw^4pei=5jWk=%>)|*HL2RpS4evt9E2v^JF*l;VL<1< z2EGkmC=Ht<`3iUr+zl=Vp8@Xx)4|GM4X^@Gt@|k2LYi8&CAbnS2^vz?4C{Cn%m&j& z>BCTEsdNMIJ+L>}4BQ-qu#~6M;c##XSbeApLLthp1hxlPgJr;um+57GTo2Tk*M_KU zPjD{it32YcGC6S4(bo+ z2l%c4#Hv7p>Uyssdm~V5b_EyLb-?yehXO6A=P%f4(&zE2{h7`0e>VxC_8Wyi0Gz|U z^|}p_|0HmtW!sc1=cVky;6mU=DoT92y)p$pQDh{28=za>o+x-4I1)@9qVu1nj7wl| zt`19~yhczVIEBVh_z(fzsHMeyKC^Ki&k&kp#BRFm)Fi+6T z2PztHWTdO>0=n60m91%ImJO&W>;6DLzLDsVBX$t@Ja9koAkd!t z7AyjeoSl%|1nICi;@bhw52_Jm&k!C0^TD;?Xkc23qBbBVfIMR{Wr|zl4sQbV<;2JvY?}A(wr)BK;vTZ$aERF4lIdm$&EL-B&N2!QEiQFReP$HK`EhGDC!z(vtMoQUplYmbHqz9mm;m0I5@q;qRL7;z5w4|*${NYNnarY08oh16 zEa1}T3NXDQ4Ap#Ra05K%@ce1mn`jS`s}Xq=Qd&?j_oO8$1M<8dcxc%vxom>%z>mRV z;0aTeo+hEU?d9n?#FnW>kjE(UfU%9)fU<>c;_KFOvsA@xzcZ>zUll(JsQRY>1Eu9r zan2j6b9y*+TxwI~bae+gj$#6Eo;DH{yH>k)*T(8nJes~cZGw6)CZ9{+F2HG1Y{#_? zP8p|*d2*(JTl#^eaGVXGV;ZK7>Y~4V--qve0v!@PK@UrIC%<9n&Z!jscBylxcaQB0 z6=^qYi-t63|6=&urFa}wjiB-Mf#prhOS)>e5EyIk?*aH`JYaRwZtPqFfnf-LD{$*L z9u!`pD(y7z0QKjEcNl92-?Sx8mwF<@RX|JIBi^?K-vv9?mC|4W!`Hni@I+ClM+05H zfMNW9Yv6gIAupHOTH?Dq%5hY+0lKVz37vP2xrsRm=^1Q@QczP*jVyb@LdK>ypYi-p#`clF!W^@x*T;$l~ofwt1}!mA#wOW zI^Q+IalE|kE{kXi6nS;7$*{=md-@T#iK49Nrg+RHDfhW8Vs#Ty$50fw>hd+6~ z1rEvTd}+>{Ng=PLR6|i&e1ax;R^O^T`PTtXArCpKS78)_b6;&ZFx1i59`dXYPN@@A z?KQbjz^$mKL#H#hYJ;HUm5)oMSLO5(oO3?)7(WU;WU;)PCs!FaP+DnK(g=||y_sNh z;AYGSZ>(+ZJnsajfnR~Kl%1h%-zT3(<%?r^llKH+U;_`ANrQ)|&wgp>h=$X!nvHc| zVI4YG1~E0d?jc+zOjiiPy8%u&4>4k)FvD4Y02hL50)HOOcZX@a>%IcJBPFOFvpRy& zZon&X(XBG+M}hJ^!RmZ1FI~mA>UFnj8Gp<3{!o8T{ITB!%6PW~QsCm}?rG z^J4``-!U{ar&FOtpuIjoo z^K9O|xpQBYE>3HV9TwMMi`(J0&UdGa&}O({@sQQyt%YulA$jWQW$iV{uYK^4^!6OJ zZzTYQK?UBn_zBFt5zd`@MllqcOtOyvl`!X1aDv@?_myLnfH1N$BPtwi-8+KV= zQUFB;D)j<_dxw4*-j4vgcHJQOdHKqtvmWto48k3sdzkDtcb<{Ty{L3C(1mr&IS+Jx zSJ%!1r=8lMx_e=&m2VL1eCt&p#zYk){V?G2=e61aYo054co}Kd1=l;&lk`fC%cuvS z24TIftIIqWOP_Nn(^z#U0thNOD+s^?4IA(BW`x-~+y~f!)NecJGG-Y3QBcGu?WlUL wZ{ek<`{;c2bSPKGlldkkFe!ma3G^lKUtG9Jpo2;@HUIzs07*qoM6N<$f=6+Sh5!Hn literal 0 HcmV?d00001 diff --git a/public/assets/gui/gem_amount_4.png b/public/assets/gui/gem_amount_4.png new file mode 100644 index 0000000000000000000000000000000000000000..96363d5066e6e87b7cdf563897a8564a0995ae6c GIT binary patch literal 3049 zcmVU0~CvbW#8!!5kx?cMUk+TUBrl@h~kEO zL_u1>D5xz(5M)yn6qiI}B1$A`fsh~x2qkE$R$63{)E0{%SSb6}miqZTXMW7@zPazt zeZN=y!`~#|+;{JtIdjgrXU?2CGjGC#@iMM~aSi-GYhdW57JlW*m9M4GjlrwI3*g3~ zp`mAAYCd9r16Ke7UI6ji!Fu2UutDf-Ev~D9zk@r$M6ePZ0G5I0z|&wOumU^-UK!f@ zehn}OW!><Jfz82|U|p~_Sbb28L+eN|5ORKzL6s9B^lz{LtP7U& zwHAY=;0fSYtt|=!b_DNqn1uVT`aD0Dhr?iC3LUcoVCsBuQ2Z)f*9T{oe5D}h23)@Z z7K6vZ&0yDD`%v!#Tu&V{|yTPY>DIo~&khu;#4`O+aA78BU7nJ%I zpY!`u;DdvZp)VSAz6JO$IJo9Z$)uL?vRns2_yf7l11l2Y{kgO%9QQkclOnCq{^MMa z@1^9vgllRkL0m5p!)S zK~$69q)nS3^s%&iGtgA$gX(yHlxJTDT1FRnp3MZCH7OwR4M$P;yncACl`Sx_Pbm|X zu{(u!SAmB?I^O;L2sjsf7`zwgTZ{pA2@3fP*OS{QJy?Q4*>}Kjo3`1y;me)Sr|?s0 zcLUJG)1npJ3El%Xl~J%8*d6Q-42JYGKLh*qBLwY?Mf5d>-2D|A9|9c1IDkhgLRfCTgTZ17q?7S}-Z2YFm?iDkHciuQhxGXdR6_RQ!le zuyH2H5e+hYmg^Bk{ZdIs^sZ74sk;d{8$6T|oJXDUe?8c}lxB?}4o9tLd!U#9RZwU) z(yY>;?hnAhjXY4v7+cTnoPT5uGx`MMfuDc}!Ez<76u-KWo?~zl=sDh-7z^#U<2n~S z8plf-olT4nx`vTShH6>C()C6v-^vRku(P?&1y=$C3=ERW0L zUxQ1)d^><<6Q4cb+a6w?pwiZ0%}{xBuA9|0r2byKI|kegCKY9#Xw)_D^2~Vt5@59U zSkQj;i|g=oa$3dY_{F^rszA%JoLZZ4#11KaEduDkU8NokI#D6luGOW_a~9CWF`83w z!`b72sjX3ca`PCt1zZGf0;aG!WvpL5(g}(@jQePD@@dNLZr=HoUjx}mHSa}N9dl^;aGkKLA4uw5s z9u;q23go?(p|YL~eWpq_38KUGgP0_>Pc2j>nN&R;zVB5rp-7{vWPL!+S=bVSOSp(m zjLzl9Jkz;2FKhk^vm@9UxC68e@Qdi36*je;C`|RL+{Q`W35H=m)TvxE?^jFH3m{DB^^dpg^U*c z#k)EMT0?r(5IOg;vvGh5(TpwnE+1zK9nJ^YDWE8Kty}{Bz#d%!kwknG=%ON20 zsp(%^S=8w1^(9Tkq2aJ;RDcyrisRS_aa9&)lQdPX-}z0YLuVHqY*W#STrV^#pi!Hc zol~2UVPCnrCQg(0Dj>!bny^;q*@LtgM0I`HOdl@kyQacXJ^;a-Pbc>XNe|`yfxz{G zF~1uf`%_=9yDEw?MLJC9Wnz9q?p}+a$d_?}v(Bheb%J~HwrhGrNH-;&n*IXL4*^k! zkn3ziP@Y{oNDTxBXw(@MV1(#YI#Q@(fMjf8o^cjD)K1~NGmkK8Z?TJCDqI2fjxYFa zuHHmQXG=O)WE7Zrbt80OI)IitMTwG3ruB%3B+^{fb@4<%Jz5O1Rus7{YM~ztz(3l3&^q2XCjtO)99LSyv;Q5-s(ym|zLF$TSU9-YIp?w25F);BM4Q!`wOCyXRnT zPX}yt*j2*1M2~Ow_;6sF&U=UUHMMV@OKXxYf6WbOZHCvT$i5n$#Xhd0|93QYn5h5{ z-{GPPw8<6_6` zZ#wi`oL%0h@Xq@`trNbOCPM57JQ7#BR34#C8|US0HYUdabv;s(9;h(orqWs!+PJrQ zSe@y&CFXc`7x>~f4XOVL(CS<-_1$Ss&lNZ%S{2%RsAI1Z;fu}+Yx=+p@N9^lSVA~( z>{9lcmP2QcL|WtjJLu1pcu}G58B{cTeQQa-MGA;LL+}cIy99QVqGy2-&jYx4DOsv^ zXwk;SO}hQnNymetL@n)go~FlcDiOX(hU|Mf@pP#Epl49Qd#6AHn&N(_Yar&77mHbD z10VPPniOsb-q(SuCfZ%^>B!?S3Yb*_&kdvugj&(2{>H%5Bp$4C_4f<=0QwSBV>w&)_H=nG21+X{81P8jS3uV=;@QbG4Pnaq12!VI&0xDHT&rh5ha8*tahe1FVODyVjDi0pBg r`3V1~zBD}EXj}v18W`6=qJjSaHXMYDpIZhn00000NkvXXu0mjfP<6!z literal 0 HcmV?d00001 diff --git a/public/assets/gui/gem_amount_5.png b/public/assets/gui/gem_amount_5.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c3d8145f5542381c479f3b2fa8d7fb07cf328a GIT binary patch literal 3053 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 (this.Frame01Texture = texture)), this.Load('/assets/gui/frame_02.png').then((texture) => (this.Frame02Texture = texture)), this.Load('/assets/gui/frame_03.png').then((texture) => (this.Frame03Texture = texture)), + this.Load('/assets/gui/frame_04.png').then((texture) => (this.Frame04Texture = texture)), + this.Load('/assets/gui/frame_inv.png').then((texture) => (this.FrameInventory = texture)), this.Load('/assets/gui/background_01.png').then((texture) => (this.FrameBackground = texture)), this.Load('/assets/gui/background_02.png').then((texture) => (this.FrameTowerTab = texture)), this.Load('/assets/gui/frame_violet.png').then((texture) => (this.VioletBackground = texture)), @@ -83,6 +89,7 @@ export default class GameAssets { this.Load('/assets/gui/heart.png').then((texture) => (this.HealthTexture = texture)), this.Load('/assets/gui/money.png').then((texture) => (this.GoldTexture = texture)), this.Load('/assets/gui/wave.png').then((texture) => (this.WaveTexture = texture)), + this.Load('/assets/gui/sword_02.png').then((texture) => (this.SwordsTexture = texture)), this.Load('/assets/gui/icons/play.png').then((texture) => (this.PlayIconTexture = texture)), this.Load('/assets/gui/icons/pause.png').then((texture) => (this.PauseIconTexture = texture)), this.Load('/assets/gui/icons/exclamation.png').then((texture) => (this.ExclamationIconTexture = texture)), @@ -91,13 +98,18 @@ export default class GameAssets { this.LoadMissions(), this.LoadTowers(), this.LoadCreeps(), + this.LoadGemIcons(), ]); - t.destroy(); this.text.destroy(); // Set this.text = true to disallow calling GameAssets.LoadAssets() again this.text = true; } + private static async LoadGemIcons() { + for (let i = 0; i < 7; i++) { + this.GemAmountIcons[i] = await this.Load(`/assets/gui/gem_amount_${i}.png`); + } + } private static async LoadCreeps() { const res = await fetch('/assets/json/Creeps.json'); diff --git a/src/classes/Bastion.ts b/src/classes/Bastion.ts index bfad197..508e463 100644 --- a/src/classes/Bastion.ts +++ b/src/classes/Bastion.ts @@ -23,6 +23,8 @@ export class Engine { public static GridCellSize: number = 64; public static GridColumns: number = 25; public static GridRows: number = 17; + public static MouseX: number = 0; + public static MouseY: number = 0; } export default class GameMaster { diff --git a/src/classes/game/Grid.ts b/src/classes/game/Grid.ts index 377988e..81a09d9 100644 --- a/src/classes/game/Grid.ts +++ b/src/classes/game/Grid.ts @@ -8,6 +8,7 @@ import { TowerEvents } from './Tower'; export enum GridEvents { CellMouseOver = 'cellmouseover', + CellMouseLeave = 'cellmouseleave', } export class Cell extends GameObject { @@ -47,12 +48,14 @@ export class Cell extends GameObject { this.container.addChild(this.clickDetector); this.container.addChild(this.g); this.clickDetector.on('pointerup', (e) => { - Engine.Grid.onGridCellClicked(row, column); + if (Engine.TowerManager.isPlacingTower) Engine.Grid.onGridCellClicked(row, column); + else this.OpenSelectedTowerPanel(); }); this.clickDetector.on('pointerenter', (e) => { Engine.GameScene.events.emit(GridEvents.CellMouseOver, this); }); this.clickDetector.on('pointerleave', (e) => { + Engine.GameScene.events.emit(GridEvents.CellMouseLeave, this); Engine.Grid.rangePreview.clear(); }); Engine.GameScene.events.on(TowerEvents.TowerPlacedEvent, (_, row, col) => { @@ -78,6 +81,10 @@ export class Cell extends GameObject { ); Engine.Grid.rangePreview.fill({ color: color, alpha: 0.3 }); } + public OpenSelectedTowerPanel() { + if (this.hasTowerPlaced) { + } + } public checkIfCantPlace() { return ( this.hasTowerPlaced || this.isPath || this.type == TerrainType.Path || this.type == TerrainType.Restricted diff --git a/src/classes/game/TowerManager.ts b/src/classes/game/TowerManager.ts index c5f2d29..7267015 100644 --- a/src/classes/game/TowerManager.ts +++ b/src/classes/game/TowerManager.ts @@ -38,6 +38,9 @@ export default class TowerManager { this.previewSprite.texture = this.selectedTower.texture; } }); + Engine.GameScene.events.on(GridEvents.CellMouseLeave, (cell: Cell) => { + this.previewSprite.texture = null; + }); } public ResetChooseTower() { this.selectedTower = null; diff --git a/src/classes/gui/Tooltip.ts b/src/classes/gui/Tooltip.ts index 28cdb15..29c4c06 100644 --- a/src/classes/gui/Tooltip.ts +++ b/src/classes/gui/Tooltip.ts @@ -1,6 +1,7 @@ import * as PIXI from 'pixi.js'; import GuiObject from '../GuiObject'; import GameAssets from '../Assets'; +import { Engine } from '../Bastion'; // ! TODO NEXT! @@ -8,23 +9,112 @@ export default class Tooltip extends GuiObject { private bounds: PIXI.Rectangle; private tooltipSprite: PIXI.NineSliceSprite; + public titleText: PIXI.Text; + public costText: PIXI.Text; + public previewSprite: PIXI.Sprite; + private gemAmountSprite: PIXI.Sprite; + constructor(bounds: PIXI.Rectangle) { super(false); this.bounds = bounds; - this.container.x = this.bounds.x; - this.container.y = this.bounds.y; + this.container.x = -500; + this.container.y = -500; this.tooltipSprite = new PIXI.NineSliceSprite({ - texture: GameAssets.FrameTowerTab, - leftWidth: 1000, - topHeight: 1000, - rightWidth: 1000, - bottomHeight: 1000, + texture: GameAssets.Frame04Texture, + leftWidth: 200, + topHeight: 200, + rightWidth: 200, + bottomHeight: 200, }); - this.tooltipSprite.x = 0; - this.tooltipSprite.y = 0; this.tooltipSprite.width = this.bounds.width; this.tooltipSprite.height = this.bounds.height; - this.container.addChild(this.tooltipSprite); + + this.titleText = new PIXI.Text({ + x: 87, + y: 34, + text: 'Something went wrong if you see this.', + style: { + fill: 0xffffff, + dropShadow: true, + }, + }); + this.titleText.anchor.set(0, 0.5); + this.container.addChild(this.titleText); + + this.previewSprite = new PIXI.Sprite({ + x: 27, + y: 30, + width: 50, + height: 50, + }); + + this.container.addChild(this.previewSprite); + let frameSprite = new PIXI.NineSliceSprite({ + texture: GameAssets.Frame02Texture, + leftWidth: 150, + topHeight: 150, + rightWidth: 150, + bottomHeight: 150, + roundPixels: true, + height: 64, + width: 64, + x: 20, + y: 20, + }); + this.container.addChild(frameSprite); + + this.costText = new PIXI.Text({ + x: 113, + y: 40, + text: 'Something went wrong if you see this.', + style: { + fill: 'gold', + fontWeight: 'bold', + dropShadow: true, + }, + }); + this.container.addChild(this.costText); + const goldSprite = new PIXI.Sprite({ + texture: GameAssets.GoldTexture, + x: 82, + y: 40, + width: 36, + height: 34, + }); + + this.container.addChild(goldSprite); + + this.gemAmountSprite = new PIXI.Sprite({ + texture: GameAssets.GemAmountIcons[0], + x: 300, + y: 20, + width: 64, + height: 64, + }); + + this.container.addChild(this.gemAmountSprite); + + Engine.GameMaster.currentScene.stage.addChild(this.container); + } + public SetContent(title, spriteTexture, damage: number, cost: number, gemSlotsAmount: number) { + this.titleText.text = title; + this.previewSprite.texture = spriteTexture; + this.gemAmountSprite.texture = GameAssets.GemAmountIcons[gemSlotsAmount]; + this.costText.text = cost; + } + public Show(x, y) { + this.container.alpha = 1; + if (x + this.container.width > Engine.app.canvas.width) { + this.container.x = x - this.container.width; + } else { + this.container.x = x; + } + this.container.y = y; + } + public Hide() { + this.container.alpha = 0; + this.container.x = -500; + this.container.y = -500; } } diff --git a/src/classes/gui/TowerTab.ts b/src/classes/gui/TowerTab.ts index e412796..6df83ca 100644 --- a/src/classes/gui/TowerTab.ts +++ b/src/classes/gui/TowerTab.ts @@ -3,6 +3,7 @@ import GuiObject from '../GuiObject'; import GameAssets from '../Assets'; import { Engine } from '../Bastion'; import { TowerEvents } from '../game/Tower'; +import { TowerDefinition } from '../Definitions'; class TowerButton extends GuiObject { private frameSprite: PIXI.NineSliceSprite; @@ -46,11 +47,27 @@ class TowerButton extends GuiObject { Engine.GameScene.events.on(TowerEvents.TowerPlacedEvent, (name) => { this.resetTint(); }); - this.container.onpointerenter = (e) => { - // add on mouse over info (banner next to sidebar) + this.container.onmousemove = (e) => { + if (Engine.TowerManager.isPlacingTower) return; + let definition: TowerDefinition; + GameAssets.Towers.forEach((item) => { + if (item.name == towerName) { + definition = item; + } + }); + Engine.GameScene.tooltip.SetContent( + this.towerName, + definition.texture, + definition.stats.damage, + definition.stats.cost, + definition.stats.gemSlotsAmount + ); + Engine.GameScene.tooltip.Show(Engine.MouseX, Engine.MouseY); }; - this.container.onpointerleave = (e) => {}; + this.container.onpointerleave = (e) => { + Engine.GameScene.tooltip.Hide(); + }; } public onClick(e: PIXI.FederatedPointerEvent): void { if (Engine.TowerManager.isPlacingTower && Engine.TowerManager.selectedTower.name != this.towerName) { @@ -59,6 +76,7 @@ class TowerButton extends GuiObject { } if (this.frameSprite.tint == 0x00ff00) this.frameSprite.tint = 0xffffff; else this.frameSprite.tint = 0x00ff00; + Engine.GameScene.tooltip.Hide(); Engine.TowerManager.ToggleChoosingTowerLocation(this.towerName); } public resetTint() { @@ -102,7 +120,7 @@ export default class TowerTab extends GuiObject { ); this.towerButtons.push( new TowerButton( - 0, + 3, 1, 70, 70, diff --git a/src/main.ts b/src/main.ts index 3b70666..fac0057 100644 --- a/src/main.ts +++ b/src/main.ts @@ -55,6 +55,10 @@ import GameUIConstants from './classes/GameUIConstants'; Engine.NotificationManager.update(ticker.elapsedMS); Engine.AnimationManager.update(ticker.elapsedMS); }); + app.canvas.addEventListener('pointermove', function (event) { + Engine.MouseX = ((event.clientX - app.canvas.offsetLeft) / app.canvas.offsetWidth) * 1920; + Engine.MouseY = ((event.clientY - app.canvas.offsetTop) / app.canvas.offsetHeight) * 1080; + }); Engine.GameMaster.changeScene(new MainScene()); let params = new URLSearchParams(location.href); if (params.entries().next().value[1] == 'game') Engine.GameMaster.changeScene(new GameScene('Mission 1')); diff --git a/src/scenes/Game.ts b/src/scenes/Game.ts index be16af2..65cdda4 100644 --- a/src/scenes/Game.ts +++ b/src/scenes/Game.ts @@ -12,6 +12,7 @@ import MissionStats from '../classes/game/MissionStats'; import TowerManager from '../classes/game/TowerManager'; import { MissionPickerScene } from './MissionPicker'; import GameUIConstants from '../classes/GameUIConstants'; +import Tooltip from '../classes/gui/Tooltip'; enum RoundMode { Purchase = 0, @@ -27,6 +28,7 @@ export class GameScene extends Scene { public ticker: PIXI.Ticker; public changeRoundButton: Button; public sidebar: Sidebar; + public tooltip: Tooltip; private currentRound: number = 0; private isWaveManagerFinished: boolean = false; private playerWon: boolean = false; @@ -71,6 +73,7 @@ export class GameScene extends Scene { this.MissionStats.earnGold(playerAward); }); this.sidebar = new Sidebar(GameUIConstants.SidebarRect); + this.tooltip = new Tooltip(new PIXI.Rectangle(0, 0, 400, 200)); this.changeRoundButton = new Button(GameUIConstants.ChangeRoundButtonRect, '', ButtonTexture.Button01, true); this.changeRoundButton.container.removeFromParent(); this.sidebar.container.addChild(this.changeRoundButton.container); From 56137fa3c0596575c332c7d873e0d5b82043fd93 Mon Sep 17 00:00:00 2001 From: koneko <67551503+koneko@users.noreply.github.com> Date: Sat, 18 Jan 2025 23:48:21 +0100 Subject: [PATCH 3/3] tooltips final --- src/classes/Assets.ts | 4 ++ src/classes/gui/Tooltip.ts | 136 ++++++++++++++++++++++-------------- src/classes/gui/TowerTab.ts | 41 ++++++----- src/scenes/Game.ts | 2 +- 4 files changed, 113 insertions(+), 70 deletions(-) diff --git a/src/classes/Assets.ts b/src/classes/Assets.ts index a31d9c8..85ff4cb 100644 --- a/src/classes/Assets.ts +++ b/src/classes/Assets.ts @@ -13,6 +13,7 @@ export default class GameAssets { public static VioletBackground: PIXI.Texture; public static RedBackground: PIXI.Texture; public static GreenBackground: PIXI.Texture; + public static BlueBackground: PIXI.Texture; public static Button01Texture: PIXI.Texture; public static Button02Texture: PIXI.Texture; public static ButtonSmallTexture: PIXI.Texture; @@ -20,6 +21,7 @@ export default class GameAssets { public static GoldTexture: PIXI.Texture; public static WaveTexture: PIXI.Texture; public static SwordsTexture: PIXI.Texture; + public static TitleTexture: PIXI.Texture; public static PlayIconTexture: PIXI.Texture; public static PauseIconTexture: PIXI.Texture; @@ -86,10 +88,12 @@ export default class GameAssets { this.Load('/assets/gui/frame_violet.png').then((texture) => (this.VioletBackground = texture)), this.Load('/assets/gui/frame_red.png').then((texture) => (this.RedBackground = texture)), this.Load('/assets/gui/frame_green.png').then((texture) => (this.GreenBackground = texture)), + this.Load('/assets/gui/frame_blue.png').then((texture) => (this.BlueBackground = texture)), this.Load('/assets/gui/heart.png').then((texture) => (this.HealthTexture = texture)), this.Load('/assets/gui/money.png').then((texture) => (this.GoldTexture = texture)), this.Load('/assets/gui/wave.png').then((texture) => (this.WaveTexture = texture)), this.Load('/assets/gui/sword_02.png').then((texture) => (this.SwordsTexture = texture)), + this.Load('/assets/gui/title01.png').then((texture) => (this.TitleTexture = texture)), this.Load('/assets/gui/icons/play.png').then((texture) => (this.PlayIconTexture = texture)), this.Load('/assets/gui/icons/pause.png').then((texture) => (this.PauseIconTexture = texture)), this.Load('/assets/gui/icons/exclamation.png').then((texture) => (this.ExclamationIconTexture = texture)), diff --git a/src/classes/gui/Tooltip.ts b/src/classes/gui/Tooltip.ts index 29c4c06..763176a 100644 --- a/src/classes/gui/Tooltip.ts +++ b/src/classes/gui/Tooltip.ts @@ -9,9 +9,10 @@ export default class Tooltip extends GuiObject { private bounds: PIXI.Rectangle; private tooltipSprite: PIXI.NineSliceSprite; - public titleText: PIXI.Text; - public costText: PIXI.Text; - public previewSprite: PIXI.Sprite; + private titleText: PIXI.Text; + private costText: PIXI.Text; + private damageText: PIXI.Text; + private gemAmount: PIXI.Text; private gemAmountSprite: PIXI.Sprite; constructor(bounds: PIXI.Rectangle) { @@ -28,80 +29,113 @@ export default class Tooltip extends GuiObject { }); this.tooltipSprite.width = this.bounds.width; this.tooltipSprite.height = this.bounds.height; - this.container.addChild(this.tooltipSprite); this.titleText = new PIXI.Text({ - x: 87, - y: 34, - text: 'Something went wrong if you see this.', - style: { + x: this.tooltipSprite.width / 2, + y: -20, + zIndex: 5, + style: new PIXI.TextStyle({ fill: 0xffffff, - dropShadow: true, - }, + stroke: { + color: 0x000000, + width: 2, + }, + }), }); - this.titleText.anchor.set(0, 0.5); - this.container.addChild(this.titleText); + this.titleText.anchor.set(0.5, 0); + let title = new PIXI.Sprite({ + x: this.tooltipSprite.width / 2, + y: -20, + width: 250, + height: 40, + texture: GameAssets.TitleTexture, + }); + title.anchor.set(0.5, 0); - this.previewSprite = new PIXI.Sprite({ - x: 27, - y: 30, - width: 50, + const costSprite = new PIXI.Sprite({ + texture: GameAssets.GoldTexture, + x: 10, + y: 20, + width: 56, height: 50, }); - - this.container.addChild(this.previewSprite); - let frameSprite = new PIXI.NineSliceSprite({ - texture: GameAssets.Frame02Texture, - leftWidth: 150, - topHeight: 150, - rightWidth: 150, - bottomHeight: 150, - roundPixels: true, - height: 64, - width: 64, - x: 20, - y: 20, - }); - this.container.addChild(frameSprite); - this.costText = new PIXI.Text({ - x: 113, - y: 40, + x: 54, + y: 26, + zIndex: 5, text: 'Something went wrong if you see this.', style: { fill: 'gold', fontWeight: 'bold', - dropShadow: true, + stroke: { + color: 0x000000, + width: 5, + }, }, }); - this.container.addChild(this.costText); - const goldSprite = new PIXI.Sprite({ - texture: GameAssets.GoldTexture, - x: 82, - y: 40, - width: 36, - height: 34, - }); - this.container.addChild(goldSprite); + this.damageText = new PIXI.Text({ + x: 54, + y: 65, + zIndex: 5, + text: 'Something went wrong if you see this.', + style: { + fill: 'red', + fontWeight: 'bold', + stroke: { + color: 0x000000, + width: 5, + }, + }, + }); + const damageSprite = new PIXI.Sprite({ + texture: GameAssets.SwordsTexture, + x: 22, + y: 70, + width: 32, + height: 32, + }); this.gemAmountSprite = new PIXI.Sprite({ texture: GameAssets.GemAmountIcons[0], - x: 300, - y: 20, - width: 64, - height: 64, + x: 22, + y: 110, + width: 32, + height: 32, + }); + this.gemAmount = new PIXI.Text({ + x: 54, + y: 108, + zIndex: 5, + text: 'Something went wrong if you see this.', + style: { + fill: 'white', + fontWeight: 'bold', + stroke: { + color: 0x000000, + width: 5, + }, + }, }); + this.container.addChild(this.tooltipSprite); + this.container.addChild(title); + this.container.addChild(costSprite); + this.container.addChild(damageSprite); this.container.addChild(this.gemAmountSprite); + this.container.addChild(this.costText); + this.container.addChild(this.titleText); + this.container.addChild(this.damageText); + this.container.addChild(this.gemAmount); Engine.GameMaster.currentScene.stage.addChild(this.container); } - public SetContent(title, spriteTexture, damage: number, cost: number, gemSlotsAmount: number) { + public SetContent(title, damage: number, cost: number, gemSlotsAmount: number) { this.titleText.text = title; - this.previewSprite.texture = spriteTexture; + this.gemAmount.text = `Has ${gemSlotsAmount} Gem slots.`; this.gemAmountSprite.texture = GameAssets.GemAmountIcons[gemSlotsAmount]; - this.costText.text = cost; + this.costText.text = `Costs ${cost} gold.`; + this.damageText.text = `Deals ${damage} base damage.`; } public Show(x, y) { this.container.alpha = 1; diff --git a/src/classes/gui/TowerTab.ts b/src/classes/gui/TowerTab.ts index 6df83ca..e5b2901 100644 --- a/src/classes/gui/TowerTab.ts +++ b/src/classes/gui/TowerTab.ts @@ -49,34 +49,39 @@ class TowerButton extends GuiObject { }); this.container.onmousemove = (e) => { if (Engine.TowerManager.isPlacingTower) return; - let definition: TowerDefinition; - GameAssets.Towers.forEach((item) => { - if (item.name == towerName) { - definition = item; - } - }); - Engine.GameScene.tooltip.SetContent( - this.towerName, - definition.texture, - definition.stats.damage, - definition.stats.cost, - definition.stats.gemSlotsAmount - ); - Engine.GameScene.tooltip.Show(Engine.MouseX, Engine.MouseY); + this.ShowTooltip(); }; this.container.onpointerleave = (e) => { Engine.GameScene.tooltip.Hide(); }; } + private ShowTooltip() { + let definition: TowerDefinition; + GameAssets.Towers.forEach((item) => { + if (item.name == this.towerName) { + definition = item; + } + }); + Engine.GameScene.tooltip.SetContent( + this.towerName, + definition.stats.damage, + definition.stats.cost, + definition.stats.gemSlotsAmount + ); + Engine.GameScene.tooltip.Show(Engine.MouseX, Engine.MouseY); + } public onClick(e: PIXI.FederatedPointerEvent): void { if (Engine.TowerManager.isPlacingTower && Engine.TowerManager.selectedTower.name != this.towerName) { Engine.GameScene.sidebar.towerTab.resetTint(); Engine.TowerManager.ResetChooseTower(); } - if (this.frameSprite.tint == 0x00ff00) this.frameSprite.tint = 0xffffff; - else this.frameSprite.tint = 0x00ff00; Engine.GameScene.tooltip.Hide(); + if (this.frameSprite.tint == 0x00ff00) { + this.frameSprite.tint = 0xffffff; + this.ShowTooltip(); + } else this.frameSprite.tint = 0x00ff00; + Engine.TowerManager.ToggleChoosingTowerLocation(this.towerName); } public resetTint() { @@ -115,7 +120,7 @@ export default class TowerTab extends GuiObject { this.container, GameAssets.RedBackground, 'Basic Tower', - GameAssets.HammerIconTexture + GameAssets.Towers[0].texture ) ); this.towerButtons.push( @@ -127,7 +132,7 @@ export default class TowerTab extends GuiObject { this.container, GameAssets.GreenBackground, 'Circle Tower', - GameAssets.HomeIconTexture + GameAssets.Towers[1].texture ) ); } diff --git a/src/scenes/Game.ts b/src/scenes/Game.ts index 65cdda4..e313420 100644 --- a/src/scenes/Game.ts +++ b/src/scenes/Game.ts @@ -73,7 +73,7 @@ export class GameScene extends Scene { this.MissionStats.earnGold(playerAward); }); this.sidebar = new Sidebar(GameUIConstants.SidebarRect); - this.tooltip = new Tooltip(new PIXI.Rectangle(0, 0, 400, 200)); + this.tooltip = new Tooltip(new PIXI.Rectangle(0, 0, 350, 160)); this.changeRoundButton = new Button(GameUIConstants.ChangeRoundButtonRect, '', ButtonTexture.Button01, true); this.changeRoundButton.container.removeFromParent(); this.sidebar.container.addChild(this.changeRoundButton.container);