From e5f3c4b3e1238f6d81f674ccad60df39b2d3f3a4 Mon Sep 17 00:00:00 2001 From: clmaisonha Date: Mon, 15 Jun 2020 20:26:33 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20plusieurs=20sprite=20de=20bouton?= =?UTF-8?q?=20(Poubelle,=20Edition,=20Plus)=20-=20Gestion=20des=20boutons?= =?UTF-8?q?=20-=20Gestion=20de=20l'action=20s=C3=A9lectionn=C3=A9=20=20-?= =?UTF-8?q?=20Quand=20on=20clique=20sur=20une=20action,=20celle-ci=20prend?= =?UTF-8?q?=20une=20teinte=20jaune=20et=20les=20boutons=20d'=C3=A9ditions?= =?UTF-8?q?=20apparaissent=20(Poubelle=20et=20Edition)=20-=20Le=20bouton?= =?UTF-8?q?=20d'ajout=20apparait=20uniquement=20lorsqu'on=20clique=20qur?= =?UTF-8?q?=20une=20action=20qui=20peut=20ajouter=20d'autre=20actions=20(C?= =?UTF-8?q?ondition=20par=20exemple)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/assets/buttons/bin.png | Bin 0 -> 9438 bytes Code/assets/buttons/pencil.png | Bin 0 -> 10617 bytes Code/assets/buttons/plus.png | Bin 0 -> 6279 bytes Code/public/js/app.min.js | 2 +- Code/public/js/class.min.js | 2 +- Code/src/js/Init.js | 4 +- Code/src/js/classes/Boot.js | 4 + Code/src/js/classes/Game.js | 112 ++++++++++++++++++++++----- Code/src/js/classes/RectangleNode.js | 57 +++++++++++++- Image/plus.png | Bin 0 -> 3835 bytes 10 files changed, 157 insertions(+), 24 deletions(-) create mode 100644 Code/assets/buttons/bin.png create mode 100644 Code/assets/buttons/pencil.png create mode 100644 Code/assets/buttons/plus.png create mode 100644 Image/plus.png diff --git a/Code/assets/buttons/bin.png b/Code/assets/buttons/bin.png new file mode 100644 index 0000000000000000000000000000000000000000..04fbb4f1a8331ccf630a17631f5a6a1d19452060 GIT binary patch literal 9438 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 literal 0 HcmV?d00001 diff --git a/Code/assets/buttons/pencil.png b/Code/assets/buttons/pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..dd071f0d0d4675c641d2d79917bd3cfa8e30c7f3 GIT binary patch literal 10617 zcmcI~2UL^mvUU&)RX~b>ln|u%5+IRY1XNIZ6$ubJNoZ1}i!_lgARrwl)PnxXmK z9dJMz0+Ez)$Dz#a&@NCjw3Q7;3btO;0E60CNWt{rYJzGw1+=w|il-A=%Trz3+|$k+ zVF8nohDy34fdU7#3kvG)V2^P|x=X=+=|zI~rdWYImRtSSK_T z&M(GiE+i@p6-V$3i3uWvMR}pZfOL8OjuA@kWWyIPYA9pgg^=lA%#SE1ci}; zf`5prfe^AlxuE{3u*iQE##-1|di=Md7UoDxtdj!@IM~JkWrY^NVXS_wrly8e#W=g5 zFy?4gMJX6CmEXq30*SB?H4}oP1^L9#;%0op!lJ@_5(rTgpRlD6LPS(dP!ug__SgN2 zSaa9Y!#}|M1;%HHExVRYn zFKxG-Y(Ofa?EkLy)G7<0Q9?`zZYGQn;}aLR6y>u-h$8ql-(<4S( z!2Y~!^H2QrpIP*WS~qJnQ2K8U{|_-|tfh+^$_XuJ1$_G7gqFa+GTj+<|KA%fC~RRV z3J{1-Oc*7`2Nx9;O5b=N9|1S&|5&SD^|L2DP=~8oR6vhe-@Kyl! zzu1Zd0&Za;CeDX4M@#UDh>MEwnF%7q`Gm}c#1Q6aL1FOwuQU9oTlsrV{hw~d9E-V+ zcKTaL;ZRN}P%+R>&QdT-C#(Y$g~Qp~n4?bPPvAbr;!hy{9nnx1Ec74w`!8K)fp)U_ z+xh=}mER^n|39wx-$vVi1}Fa}P5v*ANZ_;%{*nFy{}mbj_^kMcAFrRD%&+=_{AU;- z_#eg}C^$%fjK8t+e}-y*tdITQqT^}I{Mz{62*F>M0LwUi`@3pA74#jIHaXhZ%gk7mYKJ4U+QZyE89qD zI6CJCzW%h~zr+qbW~QcAaeuo#M4SXyo^#NO_&_kQrvvRseQ`UcE5ukY*vA%Zb!qR5%!#U(S8eAiRY`$XuKM*&{2D_wfaNMTJ z64PIp;DWQ1BkA9Myea^_yP5tKSw*DXcIMI~kEJm?Bwv0=z^1*cMUTwQD^+zqv1dTg zFnI|UPXR;Hi+RKbjV@j46HLs%6L>J}uzj}IrqClUC>7$#R;rsNce#A*R)f#aQo|xD z8X9iHl=KM`XCBg;DRntHyv@zc?QataA3xrDNghwUz!`$VTdUhOQH5-FJ(kz!rAc@l zK!I1k|M|)vSFW?5PwBn#mkL&LBk+npN(K(&*T zFi>4+P=3B%*>F;$PwzM9O#^p04FD8<1HkU90*AsZ8SqL#89(WhDAv^ zp;>)lVzV6_*&30Yfl(*tQ+(t-K{BkWm=+zSn}==>YTXvHjvC0o%N@0^)QGT=h*zO` z{Aj2^??K9SPPo)X!YnDJheu4KOYXfYWCPDdTQobD5@TwtU3q`T1nC+PL(k}w9d$ps z;B)3yFEYcNRa&jNZ15FJZ5c6!9kSuRQ>P<)fn#K!jno%Te;faSfBnU_pYcI?6!(0q zAl`nCuV#GIn$cZrY-tDk`(2!-TebL@rvY8U|vusrfx?!EG+Cao7TKBHVgY-()0*~?tj%sx~{Z5 zBEI|v_bK4^xOK8PR+pg6qT^Bo142Go%)xr##S_ext|;h8@m=!|aa=?!sa{*E=gF8p zhEelC)~_Tzxgu`a97IaQ(n7OoS5kLg0&87;R8f4dq4<*7*U>T(CdtIwTFFZ6%-U=6 zjEoF!mUv!+rj?-rq2#V`21GyFZtUgtV&k{+nwl{$*g;gBJ9o~6xUbg3dARs)!OPHv z1q&vhJ(Pml@pVE%!jl3wCtw6b)L}f1hR?7!Ux$auYeQ~pYiqQ^CKko=IjV>Doov2RP*8lGssYLHF@%EEYYTzU)YNQh z^v5ro_*Q8AwtwTxRb?&Kwg|>7)mV1FJ4qpQyHD9=X`{J#c<|E;3vYdRQn*N>;a$+7a3h+R1yssxLuH+9~Ku!mF9cHNnT#Qy{l`- zQxHa#*C>}hI;tNN6I1J18h*c#t4;L&xAE4G&qTcAgCzE5Bd3!?UV3i4E3pX?do_BG zu>JUl9epNL;7qc2ifmjnw&4ZK35L1wc;<4N-*ijvOn>i{bmyzgwBH`KNPR*IQk7n- zQNgB9`XdE`O|%Mx;P{?8gQ?_@Cw_ddYTpb{k|Gfd)G(quYdt9*9XAO)CKncx(w{06 zM@g8jM$Ad$J;>Z$vUlg-`QW2g~wx3gKpD z+0~L1K}aEdjwApMOx3tusjCaK^-UtMRVCPua@5qkR5f+~N-!C-<)@}37VN_(5k!IP zdPVIl%<-uRXZDl*9^a**g3H7-yipNXzS`=XCb_z)Uyt+h*|#vy?WK36sAeFLu;zL_ z&a8awK7}b_A#Aknfp~##(Ok`X{XkuJh^9PYI=Pe5X&E!Z);$IA$z6YSzY{xE4QFFx zyUxrk2<}Og_D0Ga@3EGZl~vO?u1z8`v$9B~CJMO3vqHj_CaMGk>i05TYD-I_&Joi@ zJ$#lk^aVcpq#>zki1Zk`Shbe8PAwzO+;jGG1Y$prH}1m#SUQ ze)Vc#SMno@AjWI=Hx5=yZhkQ{H#exTrhwdx=lujULsAgVK^Ga3?h8eW&X2UUwN-Ql zO&cMp-aibMQwOsyXBkAi_HZ`Z6P(go?Ep7DmU9vyu6+yE6wSe83Ehi}i)EN8 zWI9G)QD2{Sb)@8i=|rVNcJ?4|oMT1E zJ70;^@68c+6fRCWwlQAi;INx!tqKVbCrN_aea5^}7m^q+Fx^_{xRsdxV{NkBDspWw zeiC*)lBuht!Lwpp{&E#HtfZn%{R0CwW3O@qw!T~pTA-Ejk?cwq*JBva`T!Ww z-n#F}YV1ckHmY}1Gda*S?;p?R+zx+yqXS|f)O|iA8QC|dGi)7GG;Yqffl6Wtvh~+h z$}fY=jjhI5M&)e>LQg~sG8-~RLnGI6F3#kNoIr4`ri_6%&X>=kopKyfBpPwyHG^SM z;WWXSCj%0C6UNz=hm3lR{^@be2IadVV`}WC>;YH}=srzI^y0f%6ZD-9)S!mC#aTf@ zl*sFD6N@{MGk*94-9%%4KdQMdNYaYEjCJxWd)Iow@8t39(jwLndaLzfy5&jXkZb^1 zDkGJX1kWoZ^v#P=!f^!>r&la%{n=@~G1&Rbnv=E1lk8A zXaLX=jTzpg+l*Ic^tn*SV3xDCKddj^Xjxw7wr(Pe%ctBGfvZTvza1JrHGdyYN5UXM z?)Pn?>L!!;`Hl;hZs``da+|D`&T+kc`!+@|omCJOm|i{8lwX?_nII zjFFv=iH?5fkADH;P}K*xyO6`UXye8~RF%Eh1Ov0x0Ne8N@}&3f6eOHhNFLtG$i$@X z<0EbA?%i&LcapjA!Fr;SFU@N!bS3F?SMtq!cXf5+qub7VWkeX$<=#$f5Wg4o>=_pq ze!6*EL^wU1sAj5oeB{&5-I>e6*7l($k$#0_co~IKE=%OlM67&3ub^SMB`F{=mH>8) zYwoLsNx(F9(0PiaiH~pU>e2vQ#hWcCsW;o-TJ$T8Tm_Zs!%|05MmUI! zxjWz-F((&SMs{`}fRc{j{oRI>I+w`N1LXa$i5a3t#ZeyLKRfPipk(vX7peC^H}Ub> zdaVKgI6Am3)g4MsSr_|MY47TWa_bPK$26*|(E0g!YLm5lzCYoYyV7ZYiqTXyOdXP)LZ8-PIE1UjZ&TDm){RkqrJBKlwDSbNpU^GE!9nw zXun8mVXJNi^;D`R;)}XyBm>gH{a569_ZCqB}`$y zfOH`0bpKk`c9be!#jB{@o_4&=(e>S^(jG6+iEhP2h;8emNDqYbhe{l4cbCgDjCX0r zO^B_nRDQvE0(9hy_f8HHR+0=E}oN`ObDl|`}_O-vu4m0k_+9m#R`fuMhHU@ z)Kss@mhN1lq(X-B|^~P z_<`?V(tOp`)i3Im&=&_Cb&O;*>NhTPL?7_q>R%%-UNlonpH9XAT$OV(>ydg z7r%0$1^P9NMx~hb>#=3i;m#K$f=h_WDUELG=M?YbF8R-B)EsK<$F4T22l5F?<3}9M zWu%^^!pS|9u5Fn(r>#JaOf+*Jp=|Urh3@FlLEFX1<%Z1%+wb{psM|hf5nXD|J=kcG zWm2F`$&)9Dlpakc85B9sS{ut9=(gaS7INNOqS?-y79JJf_vh@y+7-1m430^b*67gJeOE|)sac$MI9LRKACh6X@}=A! zP9D6WF0(N^ecpSIDdC`3I7+?I*HL@JZiLaF+iOSyKxp`{cVz zGi9jYhlRqIgXxit6rn-V3+G|ykv7m$d&LLzRdUR)AIdXl4m=PIz>bl&9sfM+=;=xL zq3`^juWAy&!5OzH*MyStGQtcl*W!a+(t^mtwVKG>G#|rpo^HAe7a2@Jy$Rz(dIx5c zIkJ26ysq{3PT!w>NG6)VI7~YfSM!L;- z>p2rr6FlZD0e$ko3pHwDibX0as*TUd*aP946Mpa53x<%F^jB9_4g$P+`f;}MP})bpw$_x9`X<^OH8Cyl6^9eds_tb@FiOYT`%vfycGW2lh$)v z=4ZA?u}0Q)O=g8jj*GJZ!+1?xI7mc%nO}RS^ZxpDS2&$WUSZ*2ZLUs%uFG=&BS0Wk z+d#()rXf0myv|>`(SWh|mCieum@pL?4)Io+)Vh~h;t;n9z|rUD&tZKJlWi+l`S~L* zo4CvE);BfD>rf3g9PgB9p3MR@kH@Sn#G9l@HXG2nr}Aq10j6T)u^la$N{^Su%5&%T zzzBr8MjF{)g}uiGi)#l=?E?t^3k2^%TSD~i474R8UAZHr^TT~=!HBB$_4K7UwZi;- zZooEk!>mUee0_7XpoT$s@}yAu3k2u;Kw;;i9|obWV^pqm{rV}#XliPzrN}WMzjUby ztg0PNS7kqzN&69}*eNKRho?9Xc?b15Smvm9TffMe?#I zmLZc6P+8H-{WVBQgvOLqzt(7aM6A>N8t_#V z7;IftbmkJ12d-H=mTe^6<{JI>3kW>9)bpD>fx%(v+4UsLb@;nW4NvKsMZe z?u@vuua1>-fZPK8^DRe79-hZwRw4hL2{;^(E1jS1^KFqLAOjlcf>fT1MTLbC_4oH@ zL$R=i!>M)c&9KEKc+SFe2fldzyZL$J8SL?B3ybUr&q{(PT?W*64PGhgBwhB7W8L#h8v=Wl0>mHbw>1(q-0HK^<_R(6%`@ls>)WHvoa|FTLr_R>t zFLm$%S7!xwQoERf7EN-0A+~xKzAbd5@cnaFM@L8W8G_J4le%%6(FD^q^Ea8gB&U-g z;3HKGBMc0*^SO1q0c5p+XCFFkSCTZR`!bb?3v~-VOr3yq=zsG5+)h^Hr!YVI_MDpu z0Bd6d7Q;ks`U3$HX&D%(f_@ClgtC24j>GH#`RCCq)@HC1Bv~f_UCgPU4tSgvKTzuy z>dS$^bpQO!O2TtHkIM4)LbNgy>R@|0%zURqQ1Q%XTc@oB)z2TFneQC{Xnj<3fgrl? zB9o*F=&N+fE1fD1Xc>_%rl7TTt&gPO)Qbh&a?6iOod z?wIE}+UN5dRo?1bcoG`=32^lUpA*o_0Y{EqM1gb&{E+z*Q{)iX^F(n>LleL%hCDS_ntS#LNlnmU%gyeydyI*xA{sW0FY<4|06<>Q#0F z4-XHR(5pYezr$-%{k{7d+dKp%@A&gzCv5d$-FsZi1O!^^El_71PRE+TcAzOnPHC&-QIS&9!`teqXWZ`J}Et8<6CBCu+Y%Zo%a&5 zg5+r<{yAE^xdwj4u`t5!Y=|E)W6v)^h61q&ATRTI7`CLKV1QfkHCynopEeo z()Z+Nh22QRX-l0V;V8do&&h#ACW%kGvo0Od@{j6FUD$jk4W6Co{Dez^ClHlPjXG1oM{bQJ`JK;kavSJ$zd(igze4PT2CKaDn!IQ#e z0N8*_UIuZM4aNY|mMn>HBhnvpdu2y*X}!oB#z|y>2?Mjwp8xY}Zd+gsa_DlH0$o5x zF@}+kd7m%so#0sUz<{R$Pr-u%kbl~C#Pm^#sPZxX5Z`%x@9-<)>fiS=6oN4y-rBGk_2zG4n{DN5;+Z42-I~n4!^+eWZ z>^IGWFxo`q)8DxDE`K;>-?)4-t73LNip;`F{2zOgM&e9|6w_$QrW)4-z}jgP4g}{O zyIy3O^`uolQ!Jj|2@7-^Nlt=3pYBa3TgTmGUX$R7#}~k3PiNimmF$=zmFI7|CXA;= zKK;DJrZ?D8ayU45y4K1sbcis?kA=XzZQP%EMf@qjE3%Bw-baL=7|(@)EzW9r@7YR) z)E%Uy5X?%?V$v_;hs6M!f+Y6RY2C2OoAU?OmR3XBUmA?tcQ WEb!$FWya}0N2)5RD;CR}2K+w}K^r>& literal 0 HcmV?d00001 diff --git a/Code/assets/buttons/plus.png b/Code/assets/buttons/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d9500fea8e7aa1255c0916f5635933b1d4b9ff GIT binary patch literal 6279 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 literal 0 HcmV?d00001 diff --git a/Code/public/js/app.min.js b/Code/public/js/app.min.js index 751a78e..1f84513 100644 --- a/Code/public/js/app.min.js +++ b/Code/public/js/app.min.js @@ -1 +1 @@ -const COLOR_ATTACK=16711680,COLOR_MOVE=255,COLOR_CONDITION=921102,WIDTH_WINDOW=$(document).width()-30,HEIGHT_WINDOW=$(document).height()-30,WIDTH_MAP=WIDTH_WINDOWt.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t))}clickPlay(t){t.setFrame(2),console.log("Play"),this.scene.start("Type")}}class Condition{constructor(t,e=!1,i=!1,s,h){this.shieldFilter=e,this.rangeFilter=i,this.shield=s,this.range=h,this.target=t,this.lNode=[]}addNode(t){this.lNode.push(t)}do(t){if(this.doCondition(t))for(let e=0;ethis.changeFrame(t,0)),t.on("pointerover",()=>this.changeFrame(t,1)),t.on("pointerdown",()=>this.clickPlay(t)),this.scene.launch("GamingBoard"),this.scene.pause("GamingBoard"),this.tree=new RectangleNode(WIDTH_WINDOW/1.5,100,this,"waria"),this.tree.addRect(new RectangleNode(WIDTH_WINDOW/1.2,400,this,"move",!0)),this.tree.addRect(new RectangleNode(WIDTH_WINDOW/1.5,400,this,"attack"));let e=new Robot(.1*WIDTH_MAP,.1*WIDTH_MAP,.9*WIDTH_MAP,.9*WIDTH_MAP,6711039,this.gm,"myself"),i=new RectangleNode(WIDTH_WINDOW/1.7,400,this,"condition",e,!0,!1,1/3,0);i.addRect(new RectangleNode(WIDTH_WINDOW/1.2,600,this,"move",!1)),i.addRect(new RectangleNode(WIDTH_WINDOW/1.5,600,this,"attack")),this.tree.addRect(i),this.gm.addRobot(e),this.gm.addRobot(new Robot(.1*WIDTH_MAP,.1*WIDTH_MAP,.2*WIDTH_MAP,.1*WIDTH_MAP,16711680,this.gm)),this.gm.addRobot(new Robot(.1*WIDTH_MAP,.1*WIDTH_MAP,.1*WIDTH_MAP,.9*WIDTH_MAP,16711680,this.gm)),this.input.on("drag",this.doDrag),this.input.on("dragstart",()=>this.pauseScene(t))}update(t,e){super.update(t,e),this.tree.updateLine()}doDrag(t,e,i,s){e.setX(i),e.setY(s)}pauseScene(t){this.line=0,this.scene.pause("GamingBoard"),this.changeFrame(t,0)}clickPlay(t){this.scene.isPaused("GamingBoard")?this.resume():this.pauseScene(),this.changeFrame(t,1)}changeFrame(t,e){t.setFrame(2*this.line+e)}resume(){this.line=1;const t=(t,e)=>t.getX()-e.getX();this.tree.lRect.sort(t),this.tree.lRect.forEach(function(e){void 0!==e.lRect&&e.lRect.sort(t)}),this.gm.modifyNodes(this.tree.getNodes()),this.scene.resume("GamingBoard")}}class GamingBoard extends Phaser.Scene{constructor(){super("GamingBoard"),this.listRobot=[]}preload(){this.cameras.main.setViewport(WIDTH_WINDOW/10,HEIGHT_WINDOW/10,WIDTH_MAP,WIDTH_MAP)}create(){this.add.image(0,0,"background").alpha=.1;for(let t=0;tthis.resume())}update(t,e){super.update(t,e),this.listRobot.forEach(function(t){t.read()});for(let t=0;tthis.listRobot[0].addNode(t))}chooseTarget(t){let e=2*WIDTH_MAP,i=[];this.listRobot.forEach(function(s){if(s!==t&&s.isAlive()){let h=Math.hypot(s.x-t.x,s.y-t.y);e>=h&&(e>h&&(e=h,i=[]),i.push(s))}}),this.listRobot.length>1?t.setTarget(i[Math.floor(Math.random()*(i.length+1))]):t.setTarget(i[0])}}class HealthBar{constructor(t,e,i,s,h,a,r){this.bar=new Phaser.GameObjects.Graphics(t),this.width=e,this.height=i,this.valueMax=a,this.value=a,this.color=r,this.draw(),this.setX(s),this.setY(h),t.add.existing(this.bar)}decrease(t){this.value-=t;let e=0;return this.value<0&&(e=-this.value,this.value=0),this.draw(),e}setX(t){this.bar.setX(t-this.width/2)}setY(t){this.bar.setY(t)}draw(){this.bar.clear(),this.bar.fillStyle(0),this.bar.fillRect(0,0,this.width,this.height),this.bar.fillStyle(16777215),this.bar.fillRect(2,2,this.width-4,this.height-4);let t=this.value/this.valueMax;t<.3?this.bar.fillStyle(16711680):this.bar.fillStyle(this.color);let e=Math.floor(t*(this.width-4));this.bar.fillRect(2,2,e,this.height-4)}destroy(){this.bar.destroy()}}class Missile extends Phaser.GameObjects.Image{constructor(t,e,i,s){super(t,0,0,e),this.visible=!1,this.setOrigin(.5,.5),this.setScale(.02)}}class Move{constructor(t){this.toward=t}do(t){return!!t.haveTarget()&&(!0===this.toward?this.moveToward(t):this.fleeFrom(t))}moveToward(t){return t.advanceToTarget()}fleeFrom(t){return t.fleeFromTarget()}}class RectangleNode{constructor(t,e,i,s,...h){switch(s.toString().toLowerCase()){case"attack":this.rect=new Phaser.GameObjects.Image(i,t,e,"attackN"),this.node=new Attack,this.canAddNode=!1,this.line=i.add.graphics();break;case"move":this.rect=new Phaser.GameObjects.Image(i,t,e,"moveN"),this.node=new Move(h[0]),this.canAddNode=!1,this.line=i.add.graphics(),!0===h[0]?this.rect.setFrame(0):this.rect.setFrame(2);break;case"condition":let a;this.rect=new Phaser.GameObjects.Image(i,t,e,"conditionN"),this.node=new Condition(h[0],h[1],h[2],h[3],h[4]),this.canAddNode=!0,this.lRect=[],this.scene=i,this.line=i.add.graphics(),a="myself"===h[0].name.toString().toLowerCase()?0:1;let r=0;!0===h[1]&&(r=Math.floor(3*h[3])),h[2],this.rect.setFrame(4*a+r);break;case"waria":this.rect=new Phaser.GameObjects.Image(i,t,e,"logoWaria"),this.canAddNode=!0,this.lRect=[],this.scene=i,this.scene.add.existing(this.rect);break;default:return void console.log("Création d'un node echoué")}s.toString().toLowerCase(),this.rect.setOrigin(.5,0),this.rect.displayHeight=HEIGHT_WINDOW/6,this.rect.scaleX=this.rect.scaleY}getX(){return this.rect.x}addRect(t){if(!0===this.canAddNode){this.lRect.push(t),this.addLine(t);let e=this.scene.add.existing(t.rect);e.setInteractive(),this.scene.input.setDraggable(e),void 0!==this.node&&this.node.addNode(t.node)}}setLine(t,e){this.xOrigin=t,this.yOrigin=e,this.updateLine(!0)}updateLine(t){!0!==t&&this.xLine===this.rect.x&&this.yLine===this.rect.y||void 0===this.line||(this.xLine=this.rect.x,this.yLine=this.rect.y,this.line.clear(),this.line.lineStyle(10,16777215,1),this.line.lineBetween(this.xOrigin,this.yOrigin,this.rect.x,this.rect.y+this.rect.displayHeight/10)),!0===this.canAddNode&&this.lRect.forEach(t=>this.addLine(t))}addLine(t){t.setLine(this.rect.x,this.rect.y+.9*this.rect.displayHeight)}getNodes(){if(void 0===this.node){let t=[];return this.lRect.forEach(function(e){void 0!==e.node&&(void 0!==e.lRect&&(e.node.clearNodes(),e.lRect.forEach(t=>e.node.addNode(t.node))),t.push(e.node))}),t}}}class Robot{constructor(t,e,i,s,h,a,r="enemy"){this.name=r,this.height=t,this.width=e,this.x=i,this.y=s,this.color=h,this.range=WIDTH_MAP/2,this.damage=DAMAGE,this.life=new HealthBar(a,2*this.width,this.width/3,this.x,this.y-this.width,LIFE,32768),this.shield=new HealthBar(a,2*this.width,this.width/3,this.x,this.y-1.5*this.width,SHIELD,255),this.canAttack=!0,this.missile=new Missile(a,"bullet",this.width/5,this.width/4),a.add.existing(this.missile),this.addScene(a),this.lNode=[];let o=new Condition(this,!0,!1,.5,0);o.addNode(new Move(!1)),this.addNode(o),this.addNode(new Attack),this.addNode(new Move(!0))}addScene(t){this.scene=t,this.circle=this.scene.add.circle(this.x,this.y,this.width/2,this.color)}setX(t){this.x=t,this.circle.setX(this.x),this.life.setX(this.x),this.shield.setX(this.x)}setY(t){this.y=t,this.life.setY(this.y-this.width),this.shield.setY(this.y-1.5*this.width),this.circle.setY(this.y)}setTarget(t){this.target=t,this.updateTarget()}updateTarget(){this.verifyTarget()&&this.setTargetPos(this.target.x,this.target.y)}setTargetPos(t,e){let i=this.target.x-this.x,s=this.target.y-this.y,h=Math.hypot(i,s);this.velocityX=i/h*WIDTH_MAP/1e3*SPEED,this.velocityY=s/h*WIDTH_MAP/1e3*SPEED}advanceToTarget(){return!!this.verifyTarget()&&(this.velocityX>=0&&this.x>=this.target.x||this.velocityX<=0&&this.x<=this.target.x?this.setX(this.target.x):this.setX(this.x+this.velocityX),this.velocityY>=0&&this.y>=this.target.y||this.velocityY<=0&&this.y<=this.target.y?this.setY(this.target.y):this.setY(this.y+this.velocityY),!0)}fleeFromTarget(){return!!this.verifyTarget()&&(this.velocityX>=0&&this.x-this.width/2<=0?this.setX(this.width/2):this.velocityX<=0&&this.x+this.width/2>=WIDTH_MAP?this.setX(WIDTH_MAP-this.width/2):this.setX(this.x-this.velocityX),this.velocityY>=0&&this.y-this.width/2<=0?this.setY(this.height/2):this.velocityY<=0&&this.y+this.width/2>=WIDTH_MAP?this.setY(WIDTH_MAP-this.height/2):this.setY(this.y-this.velocityY),!0)}attackTarget(){return!!(this.verifyTarget()&&this.target.isAlive()&&this.isTargetInRange())&&(this.canAttack&&this.attack(this.target),!0)}verifyTarget(){return!!this.haveTarget()&&(!!this.target.isAlive()||(this.setTarget(null),!1))}attack(t){this.canAttack=!1,this.missile.setPosition(this.x,this.y).setVisible(!0),this.missile.setRotation(Math.atan2(this.y-this.target.y,this.x-this.target.x)-1.57),this.scene.tweens.add({targets:this.missile,x:t.x,y:t.y,ease:"Linear",duration:200,onComplete:()=>this.finishAttack(t)}),this.scene.time.addEvent({delay:Phaser.Math.Between(1e3,3e3),callback:this.reload,callbackScope:this})}finishAttack(t){t.beAttack(this.damage)&&this.setTarget(null),this.missile.setVisible(!1)}reload(){this.canAttack=!0}beAttack(t){let e=this.shield.decrease(t);return e>0&&(console.log("Shield Broken"),this.life.decrease(e)),this.die()}isTargetInRange(){return!!this.verifyTarget()&&this.calcDistance(this.target)0}die(){return 0===this.life.value&&(this.circle.destroy(),this.shield.destroy(),this.life.destroy(),!0)}haveTarget(){return null!=this.target}read(){for(let t=0;tt.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t))}clickPlay(t){this.scene.start("Game")}} \ No newline at end of file +class Attack{constructor(){}do(t){return!(!t.haveTarget()||!t.isTargetInRange())&&t.attackTarget()}}class Boot extends Phaser.Scene{constructor(){super("Boot")}preload(){let t=this.add.graphics(),e=this.add.graphics(),i=WIDTH_WINDOW/2-160,s=HEIGHT_WINDOW/2-25;e.fillStyle(2236962,.8),e.fillRect(i,s,320,50),this.load.on("progress",function(e){t.clear(),t.fillStyle(16777215,1),t.fillRect(i+10,s+10,300*e,30)}),this.load.on("complete",function(){t.destroy(),e.destroy()}),this.load.spritesheet("btn_play","assets/btnPlay.png",{frameWidth:650,frameHeight:170}),this.load.spritesheet("btn_duel","assets/btnDuel.png",{frameWidth:269,frameHeight:262}),this.load.spritesheet("btn_last","assets/btnLast.png",{frameWidth:269,frameHeight:262}),this.load.spritesheet("btn_team","assets/btnTeam.png",{frameWidth:269,frameHeight:262}),this.load.spritesheet("btn_flag","assets/btnFlag.png",{frameWidth:269,frameHeight:262}),this.load.spritesheet("btn_map","assets/btnMap.png",{frameWidth:269,frameHeight:262}),this.load.spritesheet("play","assets/play.png",{frameWidth:100,frameHeight:100}),this.load.image("background","assets/background.png"),this.load.image("bullet","assets/bullet.png"),this.load.image("logoWaria","assets/logoWaria.png"),this.load.spritesheet("attackN","assets/nodes/attackNode.png",{frameWidth:180,frameHeight:190}),this.load.spritesheet("moveN","assets/nodes/moveNode.png",{frameWidth:180,frameHeight:190}),this.load.spritesheet("conditionN","assets/nodes/conditionNode.png",{frameWidth:180,frameHeight:190}),this.load.spritesheet("bin","assets/buttons/bin.png",{frameWidth:100,frameHeight:100}),this.load.spritesheet("plus","assets/buttons/plus.png",{frameWidth:100,frameHeight:100}),this.load.spritesheet("pencil","assets/buttons/pencil.png",{frameWidth:100,frameHeight:100})}create(){this.add.text(WIDTH_WINDOW/2,HEIGHT_WINDOW/3,"WARIA",{font:"200px stencil",fill:"#e2e2e2"}).setOrigin(.5,.5);let t=this.add.sprite(WIDTH_WINDOW/2,HEIGHT_WINDOW/3*2,"btn_play").setInteractive();t.on("pointerout",()=>t.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t))}clickPlay(t){t.setFrame(2),console.log("Play"),this.scene.start("Type")}}class Condition{constructor(t,e=!1,i=!1,s,h){this.shieldFilter=e,this.rangeFilter=i,this.shield=s,this.range=h,this.target=t,this.lNode=[]}addNode(t){this.lNode.push(t)}do(t){if(this.doCondition(t))for(let e=0;et.getX()-e.getX();this.tree.lRect.sort(t),this.tree.lRect.forEach(function(e){void 0!==e.lRect&&e.lRect.sort(t)}),this.gm.modifyNodes(this.tree.getNodes()),this.scene.resume("GamingBoard")}createButton(){let t=WIDTH_MAP+WIDTH_WINDOW/10,e=WIDTH_MAP+HEIGHT_WINDOW/10+5,i=HEIGHT_WINDOW/10,s=HEIGHT_WINDOW/15,h=this.add.sprite(t,e,"play").setOrigin(1,0).setInteractive();this.pencil=this.add.sprite(t-i,e,"pencil").setOrigin(1,0).setInteractive().setVisible(!1),this.bin=this.add.sprite(t-2*i,e,"bin").setOrigin(1,0).setInteractive().setVisible(!1),this.plus=this.add.sprite(t-3*i,e,"plus").setOrigin(1,0).setInteractive().setVisible(!1),this.line=0,h.displayHeight=h.displayWidth=s,this.pencil.displayHeight=this.pencil.displayWidth=s,this.bin.displayHeight=this.bin.displayWidth=s,this.plus.displayHeight=this.plus.displayWidth=s,this.creatBtnOutAndOver(h),this.creatBtnOutAndOver(this.pencil),this.creatBtnOutAndOver(this.bin),this.creatBtnOutAndOver(this.plus),h.on("pointerdown",()=>this.clickPlay(h)),this.pencil.on("pointerdown",()=>this.clickPencil()),this.bin.on("pointerdown",()=>this.clickBin()),this.plus.on("pointerdown",()=>this.clickPlus()),this.input.on("pointerdown",()=>this.OK()),this.input.on("drag",this.doDrag),this.input.on("dragstart",()=>this.pauseScene(h))}creatBtnOutAndOver(t){t.on("pointerout",()=>this.changeFrame(t,0)),t.on("pointerover",()=>this.changeFrame(t,1))}clickPlay(t){this.scene.isPaused("GamingBoard")?this.resume():this.pauseScene(t),this.changeFrame(t,1)}clickPencil(){console.log("PENCIL"),this.changeFrame(this.pencil,0)}clickBin(){console.log("BIN"),this.tree.delete(this.selected),this.changeFrame(this.bin,0)}clickPlus(){console.log("PLUS"),this.changeFrame(this.plus,0)}}class GamingBoard extends Phaser.Scene{constructor(){super("GamingBoard"),this.listRobot=[]}preload(){this.cameras.main.setViewport(WIDTH_WINDOW/10,HEIGHT_WINDOW/10,WIDTH_MAP,WIDTH_MAP)}create(){this.add.image(0,0,"background").alpha=.1;for(let t=0;tthis.resume())}update(t,e){super.update(t,e),this.listRobot.forEach(function(t){t.read()});for(let t=0;tthis.listRobot[0].addNode(t))}chooseTarget(t){let e=2*WIDTH_MAP,i=[];this.listRobot.forEach(function(s){if(s!==t&&s.isAlive()){let h=Math.hypot(s.x-t.x,s.y-t.y);e>=h&&(e>h&&(e=h,i=[]),i.push(s))}}),this.listRobot.length>1?t.setTarget(i[Math.floor(Math.random()*(i.length+1))]):t.setTarget(i[0])}}class HealthBar{constructor(t,e,i,s,h,a,r){this.bar=new Phaser.GameObjects.Graphics(t),this.width=e,this.height=i,this.valueMax=a,this.value=a,this.color=r,this.draw(),this.setX(s),this.setY(h),t.add.existing(this.bar)}decrease(t){this.value-=t;let e=0;return this.value<0&&(e=-this.value,this.value=0),this.draw(),e}setX(t){this.bar.setX(t-this.width/2)}setY(t){this.bar.setY(t)}draw(){this.bar.clear(),this.bar.fillStyle(0),this.bar.fillRect(0,0,this.width,this.height),this.bar.fillStyle(16777215),this.bar.fillRect(2,2,this.width-4,this.height-4);let t=this.value/this.valueMax;t<.3?this.bar.fillStyle(16711680):this.bar.fillStyle(this.color);let e=Math.floor(t*(this.width-4));this.bar.fillRect(2,2,e,this.height-4)}destroy(){this.bar.destroy()}}class Missile extends Phaser.GameObjects.Image{constructor(t,e,i,s){super(t,0,0,e),this.visible=!1,this.setOrigin(.5,.5),this.setScale(.02)}}class Move{constructor(t){this.toward=t}do(t){return!!t.haveTarget()&&(!0===this.toward?this.moveToward(t):this.fleeFrom(t))}moveToward(t){return t.advanceToTarget()}fleeFrom(t){return t.fleeFromTarget()}}class RectangleNode{constructor(t,e,i,s,...h){switch(s.toString().toLowerCase()){case"attack":this.rect=new Phaser.GameObjects.Image(i,t,e,"attackN"),this.node=new Attack,this.canAddNode=!1,this.line=i.add.graphics();break;case"move":this.rect=new Phaser.GameObjects.Image(i,t,e,"moveN"),this.node=new Move(h[0]),this.canAddNode=!1,this.line=i.add.graphics(),!0===h[0]?this.rect.setFrame(0):this.rect.setFrame(2);break;case"condition":let a;this.rect=new Phaser.GameObjects.Image(i,t,e,"conditionN"),this.node=new Condition(h[0],h[1],h[2],h[3],h[4]),this.canAddNode=!0,this.lRect=[],this.scene=i,this.line=i.add.graphics(),a="myself"===h[0].name.toString().toLowerCase()?0:1;let r=0;!0===h[1]&&(r=Math.floor(3*h[3])),h[2],this.rect.setFrame(4*a+r);break;case"waria":this.rect=new Phaser.GameObjects.Image(i,t,e,"logoWaria").setInteractive(),this.canAddNode=!0,this.lRect=[],this.scene=i,this.scene.add.existing(this.rect);break;default:return void console.log("Création d'un node echoué")}s.toString().toLowerCase(),this.rect.on("pointerdown",()=>this.click()),this.rect.setOrigin(.5,0),this.rect.displayHeight=HEIGHT_WINDOW/6,this.rect.scaleX=this.rect.scaleY}getSelected(){if(this.rect.isTinted)return this;if(this.canAddNode)for(let t=0;tthis.addLine(t))}addLine(t){t.setLine(this.rect.x,this.rect.y+.9*this.rect.displayHeight)}getNodes(){if(void 0===this.node){let t=[];return this.lRect.forEach(function(e){void 0!==e.node&&(void 0!==e.lRect&&(e.node.clearNodes(),e.lRect.forEach(t=>e.node.addNode(t.node))),t.push(e.node))}),t}}destroy(){this.line.destroy(),this.rect.destroy(),void 0!==this.lRect&&this.lRect.forEach(t=>t.destroy())}delete(t){let e=this.lRect.indexOf(t);if(-1!==e)return this.lRect.splice(e,1),t.destroy(),!0;for(let e=0;e=0&&this.x>=this.target.x||this.velocityX<=0&&this.x<=this.target.x?this.setX(this.target.x):this.setX(this.x+this.velocityX),this.velocityY>=0&&this.y>=this.target.y||this.velocityY<=0&&this.y<=this.target.y?this.setY(this.target.y):this.setY(this.y+this.velocityY),!0)}fleeFromTarget(){return!!this.verifyTarget()&&(this.velocityX>=0&&this.x-this.width/2<=0?this.setX(this.width/2):this.velocityX<=0&&this.x+this.width/2>=WIDTH_MAP?this.setX(WIDTH_MAP-this.width/2):this.setX(this.x-this.velocityX),this.velocityY>=0&&this.y-this.width/2<=0?this.setY(this.height/2):this.velocityY<=0&&this.y+this.width/2>=WIDTH_MAP?this.setY(WIDTH_MAP-this.height/2):this.setY(this.y-this.velocityY),!0)}attackTarget(){return!!(this.verifyTarget()&&this.target.isAlive()&&this.isTargetInRange())&&(this.canAttack&&this.attack(this.target),!0)}verifyTarget(){return!!this.haveTarget()&&(!!this.target.isAlive()||(this.setTarget(null),!1))}attack(t){this.canAttack=!1,this.missile.setPosition(this.x,this.y).setVisible(!0),this.missile.setRotation(Math.atan2(this.y-this.target.y,this.x-this.target.x)-1.57),this.scene.tweens.add({targets:this.missile,x:t.x,y:t.y,ease:"Linear",duration:200,onComplete:()=>this.finishAttack(t)}),this.scene.time.addEvent({delay:Phaser.Math.Between(1e3,3e3),callback:this.reload,callbackScope:this})}finishAttack(t){t.beAttack(this.damage)&&this.setTarget(null),this.missile.setVisible(!1)}reload(){this.canAttack=!0}beAttack(t){let e=this.shield.decrease(t);return e>0&&(console.log("Shield Broken"),this.life.decrease(e)),this.die()}isTargetInRange(){return!!this.verifyTarget()&&this.calcDistance(this.target)0}die(){return 0===this.life.value&&(this.circle.destroy(),this.shield.destroy(),this.life.destroy(),!0)}haveTarget(){return null!=this.target}read(){for(let t=0;tt.setFrame(0)),t.on("pointerover",()=>t.setFrame(1)),t.on("pointerdown",()=>this.clickPlay(t))}clickPlay(t){this.scene.start("Game")}} \ No newline at end of file diff --git a/Code/src/js/Init.js b/Code/src/js/Init.js index b1acf02..fab8a46 100644 --- a/Code/src/js/Init.js +++ b/Code/src/js/Init.js @@ -7,8 +7,8 @@ console.log(myself.height); const COLOR_ATTACK = 0xff0000; const COLOR_MOVE = 0x0000ff; const COLOR_CONDITION = 0x0e0e0e; -const WIDTH_WINDOW = $(document).width() - 30; -const HEIGHT_WINDOW = $(document).height() - 30; +const WIDTH_WINDOW = $(document).width() - 20; +const HEIGHT_WINDOW = $(document).height() - 20; const WIDTH_MAP = WIDTH_WINDOW < HEIGHT_WINDOW ? WIDTH_WINDOW * 0.8 : HEIGHT_WINDOW * 0.8; const SPEED = 2; const LIFE = 100; diff --git a/Code/src/js/classes/Boot.js b/Code/src/js/classes/Boot.js index cbd0040..64d6252 100644 --- a/Code/src/js/classes/Boot.js +++ b/Code/src/js/classes/Boot.js @@ -37,6 +37,10 @@ class Boot extends Phaser.Scene { this.load.spritesheet('attackN','assets/nodes/attackNode.png', {frameWidth: 180, frameHeight: 190}); this.load.spritesheet('moveN','assets/nodes/moveNode.png', {frameWidth: 180, frameHeight: 190}); this.load.spritesheet('conditionN','assets/nodes/conditionNode.png', {frameWidth: 180, frameHeight: 190}); + + this.load.spritesheet('bin', 'assets/buttons/bin.png', {frameWidth: 100, frameHeight: 100}); + this.load.spritesheet('plus', 'assets/buttons/plus.png', {frameWidth: 100, frameHeight: 100}); + this.load.spritesheet('pencil', 'assets/buttons/pencil.png', {frameWidth: 100, frameHeight: 100}); } create() { diff --git a/Code/src/js/classes/Game.js b/Code/src/js/classes/Game.js index 6cc81cb..e3851dd 100644 --- a/Code/src/js/classes/Game.js +++ b/Code/src/js/classes/Game.js @@ -10,15 +10,10 @@ class Game extends Phaser.Scene { } create() { - //this.add.image(0,0,'background').alpha = 0.1; + this.selected = null; + + this.createButton(); - let btn = this.add.sprite(WIDTH_MAP + WIDTH_WINDOW / 10, WIDTH_MAP + HEIGHT_WINDOW / 10 + 5, 'play').setOrigin(1, 0).setInteractive(); - this.line = 0; - btn.displayHeight = HEIGHT_WINDOW / 15; - btn.scaleX = btn.scaleY; - btn.on('pointerout', () => this.changeFrame(btn, 0)); - btn.on('pointerover', () => this.changeFrame(btn, 1)); - btn.on('pointerdown', () => this.clickPlay(btn)); this.scene.launch('GamingBoard'); this.scene.pause('GamingBoard'); @@ -37,9 +32,6 @@ class Game extends Phaser.Scene { this.gm.addRobot(robot); this.gm.addRobot(new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.2, WIDTH_MAP * 0.1, 0xff0000, this.gm)); this.gm.addRobot(new Robot(WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.1, WIDTH_MAP * 0.9, 0xff0000, this.gm)); - - this.input.on('drag', this.doDrag); - this.input.on('dragstart', () => this.pauseScene(btn)); } update(time, delta) { @@ -47,6 +39,28 @@ class Game extends Phaser.Scene { this.tree.updateLine(); } + + OK() { + this.pencil.setVisible(false); + this.bin.setVisible(false); + this.plus.setVisible(false); + if (this.selected != null) { + this.selected.deselect(); + } + this.selected = this.tree.getSelected(); + + if (this.selected == null) + return; + + if (this.selected !== this.tree) { + this.pencil.setVisible(true); + this.bin.setVisible(true); + } + if (this.selected.canAddNode) { + this.plus.setVisible(true); + } + } + doDrag(pointer, target, dragX, dragY) { target.setX(dragX); target.setY(dragY); @@ -58,14 +72,6 @@ class Game extends Phaser.Scene { this.changeFrame(btn, 0); } - clickPlay(btn) { - if (this.scene.isPaused('GamingBoard')) - this.resume(); - else - this.pauseScene(); - - this.changeFrame(btn, 1); - } changeFrame(btn, bonus) { btn.setFrame(this.line * 2 + bonus); @@ -83,4 +89,72 @@ class Game extends Phaser.Scene { this.gm.modifyNodes(this.tree.getNodes()); this.scene.resume('GamingBoard'); } + + createButton() { + let x = WIDTH_MAP + WIDTH_WINDOW / 10; + let y = WIDTH_MAP + HEIGHT_WINDOW / 10 + 5; + let diffX = (HEIGHT_WINDOW / 10); + let width = HEIGHT_WINDOW / 15; + let play = this.add.sprite(x, y, 'play').setOrigin(1, 0).setInteractive(); + + this.pencil = this.add.sprite(x - diffX, y, 'pencil').setOrigin(1, 0).setInteractive().setVisible(false); + this.bin = this.add.sprite(x - diffX * 2, y, 'bin').setOrigin(1, 0).setInteractive().setVisible(false); + this.plus = this.add.sprite(x - diffX * 3, y, 'plus').setOrigin(1, 0).setInteractive().setVisible(false); + + this.line = 0; + play.displayHeight = play.displayWidth = width; + this.pencil.displayHeight = this.pencil.displayWidth = width; + this.bin.displayHeight = this.bin.displayWidth = width; + this.plus.displayHeight = this.plus.displayWidth = width; + + this.creatBtnOutAndOver(play); + this.creatBtnOutAndOver(this.pencil); + this.creatBtnOutAndOver(this.bin); + this.creatBtnOutAndOver(this.plus); + + play.on('pointerdown', () => this.clickPlay(play)); + this.pencil.on('pointerdown', () => this.clickPencil()); + this.bin.on('pointerdown', () => this.clickBin()); + this.plus.on('pointerdown', () => this.clickPlus()); + + this.input.on('pointerdown', () => this.OK()); + this.input.on('drag', this.doDrag); + this.input.on('dragstart', () => this.pauseScene(play)); + } + + creatBtnOutAndOver(btn) { + btn.on('pointerout', () => this.changeFrame(btn, 0)); + btn.on('pointerover', () => this.changeFrame(btn, 1)); + } + + clickPlay(btn) { + if (this.scene.isPaused('GamingBoard')) + this.resume(); + else + this.pauseScene(btn); + + this.changeFrame(btn, 1); + } + + clickPencil() { + console.log("PENCIL"); + + + this.changeFrame(this.pencil, 0); + } + + clickBin() { + console.log("BIN"); + this.tree.delete(this.selected); + + this.changeFrame(this.bin, 0); + } + + clickPlus() { + console.log("PLUS"); + + this.changeFrame(this.plus, 0); + } + + } \ No newline at end of file diff --git a/Code/src/js/classes/RectangleNode.js b/Code/src/js/classes/RectangleNode.js index bd75711..51de1da 100644 --- a/Code/src/js/classes/RectangleNode.js +++ b/Code/src/js/classes/RectangleNode.js @@ -41,7 +41,7 @@ class RectangleNode { this.rect.setFrame(line * 4 + shield); break; case 'waria': - this.rect = new Phaser.GameObjects.Image(scene, x, y, 'logoWaria'); + this.rect = new Phaser.GameObjects.Image(scene, x, y, 'logoWaria').setInteractive(); this.canAddNode = true; this.lRect = []; this.scene = scene; @@ -53,11 +53,42 @@ class RectangleNode { } if (type.toString().toLowerCase() !== 'waria') { } + this.rect.on('pointerdown', () => this.click()); this.rect.setOrigin(0.5, 0); this.rect.displayHeight = HEIGHT_WINDOW / 6; this.rect.scaleX = this.rect.scaleY; } + getSelected() { + if (this.rect.isTinted) { + return this; + } + if (this.canAddNode) { + for (let i = 0; i < this.lRect.length; i++) { + let rep = this.lRect[i].getSelected(); + if (rep != null) { + return rep; + } + } + } + return null; + } + + click() { + if (this.rect.isTinted) { + this.deselect(); + } else { + this.rect.tint = 0xEFD807; + } + if (this.canAddNode === true) { + console.log("MAIS"); + } + } + + deselect() { + this.rect.clearTint(); + } + getX() { return this.rect.x; } @@ -114,4 +145,28 @@ class RectangleNode { } } + + destroy() { + this.line.destroy(); + this.rect.destroy(); + if (this.lRect !== undefined) { + this.lRect.forEach(rect => rect.destroy()); + } + } + + delete(rect) { + let id = this.lRect.indexOf(rect); + if (id === -1) { + for (let i = 0; i < this.lRect.length; i++) { + if (this.lRect[i].canAddNode) + if (this.lRect[i].delete(rect)) + return true; + } + } else { + this.lRect.splice(id, 1); + rect.destroy(); + return true; + } + return false; + } } \ No newline at end of file diff --git a/Image/plus.png b/Image/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..e034ff26126a3f33035189279be3587fdabfe9de GIT binary patch literal 3835 zcmeHK4O3HB8a{+<30e$@Wdo5QdLipr!Kf>wF+@=eS6Fnd3#fcVW2;+P2?>$}ki@T2 z$MAJiKS@xxW33wtQMLvZ1Y}7{3yE7z!HOYBBn||SK!9i@d#IglXMce+>z%oC&V9}~ zcg}s!`@GL{k8e(5`^*ZO1px3t%#BOU{V@CET;WdsM?fePM*MaEJ^^0-=ih#zT!N~n=4s!dv@}`UGn0sNB4g)``@X)8+{k=8qdwict%`k%&D3zGTn>` z5lwb>x7_R*5t{`1W3{!l0HhCZX95r%;{m`iJOK0N0h$qT zj}z^?u-{|#%dIZaD8;-6G|iFG?qC)jI{iVL=Ev%X?F_Uk$=p^Ur6~n>>hlRJ{ek*hQeQP9ky|2DvbS0CvGeV8Ryq?OB6U9DpMHS1n=328>M_fcfu)Sm4cPYrJu!uND7@g+frWL8N@x*?IL731 zUp|3Wu@pW$1P4k7&mt+wWnCAS&{<@2d?6mNmuu@jw}hmObln`$(=*eVxF8V@=*DaV z9@M75<_ZFcK1|b|M9Qj7IXDVa@t&II0d&1%Lk7dPWLT^^B4t-iIk6PFB2W#} z`cVPjA@#SkbGSHgWAcd6GpT&VkrL-0*L2+@_3cBaR~%>Y$66I(P9@#SRuwlXzw-xO zKSn+2a3`mI>wM@z_52${LA6GZJQq)~|5i5)n1=KyhIvCk=>rwR^CorWlk4A0)igKFv5@P6g-99K~ikG$-=~k7h__>oH^ zC|G{a`>zXd9IKWz37OJ%(zpY}TqdJME3Gb`!#Ac9bX}uq8_=S&mM2dZgUknHlv4RK z_ZpRrp6U;abnF-u~4jMd4o3znCQE2^aQ0%=^B6diKa{@FcZ2D zFhapZ-{ap56#g0b`~naC3RC+PQS$Dz22akqD55Z!u>edwZH2?DEU)7kd6fdxp~CJ` zg7ly`tc{^!gDkUB(UW6?L9C!#b!b%vTr67T62|)U=(6Gq1{DVil4Z3qjt; zdMAphR6@|bA%*xF+N*c+vB4SWolc@Kh_MJv3{ugInRN-G#a3Y;BlorX#I%t5Oh{uQ zKWB8FG;*K>DeIuKVAA*K{iVT-!rrtbJ{M+oq!|i<$u;>WV1u&Lg0K?#e}k~0cRLnB z8IH(nX9MbPSVuB;}^sqJ-iAem(gx{f5E z(}j-D{2liZ3bjUf%F>AzowPI{BXHZ>8OI;31x=r7NvtHhMkQ2y#i|smckkdxQA~BixpB z#o