C8D
z-iX#uM^2%I-24j4$}OnWDs(z6z2btn^pX+$yn2Ob;uEqgzvSKS)A@m01FanQ)b;Yu
zMrSzHXzD$Bdgpy;WN6z~*hfLHmB`O4=a=0w-EZ#3sFAHH%(r6t<9iB|laP-_QkEUg
z@4pzZO8)q_jKB~YMsS;UM6}i**`TP*rp)-n+DWAH!ZIX{hAtPx64SFC2a}F4<%@J8
z7ait;EBB1;KPquzI+v?Qj@)$Mk2e&j9Jza6BR;GxR(7}(+J+Yf{AxsN7l)F
zN=iy8EXg6S&_rRfmHZMD`4v{OdJkvd?UxXsmXvjr7@_UjGO$&eDakdX(`)HcZWbG-q(x1UD}XcP>E!Ppg@-_=y*B=8Z8!1UelUp1HE34
zzrUYXXV80f2EAuz2&kIDiH_*m88jG;Re7~qO;AwP3{Gf|g1z&>RYF{nBtk;mg*t?W
zdJ6H7kPxMu6T!hjNO##pPCHs||yn28$K^
zj8JG+lXfUoA<*9BQuF~9&WklrX@-glD;l*8ydB$R+escVTL1Ue
zIgB4a#zRv0(1c+v2ifYCw|M4lZh2b;vd!$4uLNslRbDoG=0#asMICu7Sj*h*w}G{k
zHhTLaJtsFu>DX$On8HcetY#$1X1B0fz!uh)l%u%}10q8G*s`x2F)8WVUXM*VGx@
z^H#99<;9z`nCi%j$+==ntb*6~vXXc6y|R=#jElA9%RC9wNYOgLKEj_onW?m1BT1+w
z6>60b6XK_pv6V{%#r7cm;CD*dh!%c?1(``bW}&3Ch@Kq{1RJ#!nXH&fEd&@e^t<8~
z7Pe{4-Q%aTCF@?|ufH8BFBjQT36gMg5dRcLDZi_=LJS@@+O!N*);>Bv9Xqydq@Xz8
z+0=b?5$H|lh1s)a)=Zwte5fo?UW%-|Eceb(_shrZm9Me9SLYC&(h1Qy-SV=MuWK}|
zu#b?gyca?KF=+g=huvxRzR)42gW|qp6XcP=Pa`SQD6#Yxf-EAg3poeM}^)QL=rPFEDllYexV5=xY
zmeh7vAt8y>YKn?W@zYp|X%$GhS;pTWvGunN&Sox@W!b9}R}ttcAW~#HcaG)JN0lA1
zRVX}weBvkMto1Z$_@<(b644QMZRhc0$I(boVYQ+4*P!(Si`k}-O0wE$*}^)pbaG;vf3JbsPDxhC{5N*N@n95a{%B<-9Wc(vy`S8ajbiD5_US04g
zt?qe)FoO`QEWc#lOo3Peg>;wP_g{Clq;ESt-#nR8PwwEoG%v
zWws?WayktZsX{ogcb`I_nAUpCHXA7?D)G~*vDsvP-&@RiaaP*5Hd0=xQHZ6NEsBPA
z+Iyc9^YXJyS~!{VYi7_UED~GcNkzG!R!d}M7t<%ykI1k9vhr+-r9Ua@S7$S8^fYx6
zNEk^K2yL4?tsDYqb;t}Tug
zME8+5@X>--Xc4u73$M70o}B_Q_?56fU92}H{B>%!9VnsDWTsbaC~CEa($Y$7HVgj#
z8b(cimbPu)V$2)kNE`kf9phrKWuH{seJpt;^cZL)NUtRW8>OZ2=OGblLBX=R2qa=?
zDTs?xBAK`#XK!fk++omzTiCqUrK+qqVq;?&HcaS*>W9^7_t(fX_LV)Z{E@73C9T_;$7|mlX3{P8Jz@#5MnVF$v~Q)SL+i$68}AiscOgto
zOLh2LLx8`IaHEDj1!ao$Qml^6CYhGeEhxR`F{aLYg$E8F=avWVp;Nm+jCvKjQiaA$
zCP1&_;E_s9<+=3h7D7;fPMIxOtY!iOv<$udLB4O*io2&xBM2r!#5NBoY%788PV(c6>01@L(N_)@3RZWc$HFm*gANGn6|=w53xUyAqSh{p6Q>RX4=Eup^+92wEYhrhLba3~5J$LBP%I@KDEaMnC
zf-qV=YAv)6)3R<~5#>VvW3}6dOj$DRJ4IrAW)>g4K7$h(&oOc4Geop7Fu-5KuH<4e
z^DGz*T8?L%DX+{^NE8~RqoCMEQHdathHk@dWO-B+_dWJ1n=0=_j=6$>02{*xb>r8K
zX&lQ;=Y#i@AU^^V#s0q9+AldQtcv~T_^}k)v=Kg|cG!L!3zfo`qIn`MqmeMHhJ^Lk|92HAKY!Ek1-(Ii#l+OQuLUI{NK3+E^Yb}y;2`VPtyk(%34Jdwj!hOQh@Z&<`a^8gePZA!WbGxWu=YXDfy(HsKgkc
zp~5VqRoghfTM!YU1`11rYTQbIpUS==ujm*PA9|A476&r^z1Mi4>q$PIGl$;YqnWYb
z9g>eKUJ_!P?6Y+dXbUhvWVUQx$AAGMY7CIOyj%n5*00Ie0(<-3BLY1(RI)2)oVyjPC@UdX3K&LnY!QrKW@%q)~x55
zGG%hTpMB9qm#}W#27Y^I5a)OCbh$cLxbuY_EL?eYq7p{GmrPXe
z&UA_nRwC`_G?KC=62^TK68$^F(d9p}YuQq!PaQ{>-o2Ii-of-d_NG*bc;Zi*uD3dhuZ9
zzdhHL4*j{CS+ky_tisBJ|J|dICpNYdk32m7w4QzQO*bmf+qf(5-2e8HJzaG{gwm!J
z%YRbV6UAi~qFWm19;xMUdOj8#R8(3iue2#PnsT!Zxzfh3J1Xga!{rPbGoB}BzRTJl
ze^l!05)($hZh_b=7R5bC>^v3wgZ8Bt5}*fvKMjQ@nbK0BAPZo@qHpNerkuntzb4r)
zj^}@awb55I`Gwie-Z8$eHP8`nza$s@S~lx7kiei`VM=G(w{H*e@m){r-kh9Vva+(-
zp0u;tcfuRGb8M#?>ogebYneimoAFm!KD+0uW6BecvHYhMtXps27`b5n>yEnWzR#mw
zLH0FAL5Zc&yxU>ti+%<>_H3uH%!*p*tR)o}bPi_oreew}Y}l-l;#DnF+QOtKoK8#3
zDt`X0l#v(r!qD;=UY|3Y<7sK!{@{Z|wK8JxQJtNRQ_X-Q1dzF)=^O-n#3@t(p{Hv#i9e?I?JjaSbujTNG3QA1b^ywBt
zu+a~l7G^#7F+cy3#QopRW$_L$Mnd-Dk4gGO1V458iPlP>TBmUMg*BQVxuGy~Y&Yfq
zxIQVzKCSV>>Yo#7-(GCQb#o0;)+iek@(2kw_`Gm7?aU=8P)kB*`?{jA#LV1pQrVuA
zM0|XwdbGq+?HM(pUAstz3?9goCmyU;e&4=>%$@tL$DX2Dv!3=Svv-f(wviAQ+^F8|
zy;rqY2=u{w^Lc#Aqsmr-=$1hY>ZE6JN)}OVf)v+Jp>)9M0BW-$qhe2vnRZ7i3DoPj
zVEkl$T(W{=;~wYbm!=XB6i(mn;pkHeNjqAJ-d{s*ft3y0^SEkoYrg(`ElU%B=l_
zX3<`dwUD;_OV-c4%h|NKvMjHxp9DJUDS;$ixWiwyd1L07ZpseE86OSMm7pm2J=-^srz4*9Y8S%=lbN>6|NJ2&Z`eQwn|J$6I(+Lk01C@o2ks(~)+sOVM
zsaS-coNzUB^E6%uliQe-o>>K=KSt~
zv~C^BiR5%%du{>Ozc7}hz-UC*Z`ld9O>)@-#X{55I9Q7Wat)c8nJ2MWELB^9b)g_>
znuJ^YUxAQ1{~EKN{fF&7ZTFA8nMWSJllXWgD5Y>9sdmq23zsl^&U{+8@Mr!L3B+8l
zL~J2GK1TW5zrVKuwt5{VlYLDZYINUKY4$2>AvrnSQP!@d5{T<8;;akUJj#cM2NE9c
z{_NWQ7pFXNAIq2j!n*ZaS+pjD8!vY4p**J;eMNg7dwn-Mc5P$DFI(u>e;^szW^NlC
z&H7z`uz7PTLx;stTp*-%6^nE#nZhzP8xB{Ho+Ui2wW#y6>D;#;heKv^{fs%xJ(9__
z_dY;On?NF4Sh)87ml!Z+BpLDNvu7uC><25xea)lcpDS^G0kOcGDM`}9bs18fQ6WVn
ze5_V0$B&D^_})@TYL;o^u3UvY_m3S(_Q{RRfBP8+5zIBFB}-Q@>Q1}O<>P1i5*6w0
zYi6!@%FMKnS<$TwHLQU=C5`v>z(6PItf%!%?=)e;XoosG_nf~697(JpAG^iwPBwMo
z!-NHjJ$_dFR5~8NE|$#whuE|GIDsL4SViC+S;Q@nu~}_OG@nCxI&w?Z1ZY**&|=BW
zrG2}0NY}p3yb{;A`=kEcx^!&K)
z^p6iEY3EiRnJ|UePX0=mss3FenSNa~8y9ckL}mejq5hc7HpTH*2qW2M!=RJ#*NJ_m
z_O30X!CaU}`&Mf7*G}Q#sS6p?w?Avs%80n@VUDFhM6AT_A5#f_ZzN0h7+Cdr2s0T#leBfrp;IqMqI$KB56ErBejxNfUfcWG&{(q7NCQMNMe6wh_P
z9upJcGUlG^_kdf{`)L?=gI#O+(Yya6X~!NyL;Mx@oQJOM!GA6YX4%`TFqtYa1_vlw
zIh(SG(qOSkSVa&8#j`{NhSOqb6~>XYEHb`)pYFZd^Lx7?6kmFW@;F@p9Q}O1k*vgfcj9}T%%h|K16n~w8C37xk(AY(M^6D~1Pq>mmqn=_@1y-{niwI~D
zOj$(*TRvPtKxr0>UO1mki+8g8cp)tfL1=^*Mq3TZPfZ}}$abfpR99rqy7$>HDp~%k
zkvAu(x$w$dzPPs>gXS7$P3^+QZJXG&`w&Mn4m(|Y9?+a}4dj}_HCH(QZ#LrNtF%$!
z;r4wqt5?pVl?eHN25>0lIIq2)$ny33xb>+mYS98NyL(WUDd(ACNtuMH<5A&RX1dsv$|4eNw=@av&t-y^q^c~A*c
zkRgcRcx>g7lLh0CoGhSYWGFo%R80J~AFq8MLr|B^gyk17+dPfSFL{Pz8OO&m|j-+&|`0LPG+pmH+gk32fZ7hXwDhV#&JW+&HYdyVAMDWf!#O
zvzY_AW7-zJ{bnIC9Xl~)#taVZDJ9D(l)#MVhJJ%0=zhTSw0`H4(Fcf{q9S&SCaR2fje#+gwd!~2()o$4mVyBO=H8YBVtHC
zX5!feyLtPKSBUG@oojEtiT(Rc#Iy?HyVtH~!hhG0IDaL`1_puZS9S7pqzGJ4>EJhnV)!w#~&O^ZcaA$
zJ@O!X_mmPItmpN~mlD13cQlfUG5;Bixk6^^!2$vUjdbfB%uCaz@z!h4D|KCU)#ZxA
zz}Bs*n3QORTn+9OESvZDUTWMFpd-8o~Otc5jgf9vI7O|9y#Gy*)hd?ZLULV}X!H%N8FY@Zo5NJoG16HOw06
z$L5t{*~BVw)T(=EUom&<Z@D_fxXw|&i=pavh%GL`GA}VH>M$91Kt*QN7BzkSmb7W;?@cIYukd|yE
z`FM$9Tn-BlB`6$Td+~X`c=rwR^6jzRUVUXY6DK~R>`)aaLb#zO2_zsk13d#g_r<&;
zd@--u_sSLrZvy>8HE~XydQ=YsR-_oO(XndEe6Sx3WFS
zbKs2Y97+Fv9jZx7gI-td+7(y7&bkeDhgK&pOo(U_@A$2${n2UF%>Cj33qN_6ugvy7uzV6tB_Y
zjc~r>rG4i(Gd10tK(!lFbq;r)W{*>^^Mv715Tm|G=-sZydW(y_BgNKljk$NMwO5OSH>#8v|9kURx+lD-IwYLib8>P@nELb&N|{TC#d=7h_^#p1
znmK~0)0We&m4TTLokvr{Be!?s;{L6f|II<>f3ugzAFP^c&v~p5lSbRk50Vm=fWJ(j
zQ^B1;wX3qV|CA|Qbtw?vt!0DM>kPO2%>BI?K5iAG?*8JmYW(h-JGu0dF3L9Ln(BZ0
zS#i`8B&QTIcit~dne2IBz#1t&aA1RXXjAfdU7BGd$r_~
zWvN^~s4Zh}j3dzC)~$7(?=RJpK(#3l&Mbi>U1+m5rdHu>s_N|oQma+0Trivs+dYq;
z2{GzO=u+JS;-jU>e7Y)U}-juk5ey8pp%`1z+Xw2$^wXv}_j4O6H6qIi3M`N~Di`CvDn|B%XiA8uyK
z_xO!nxaIPWB&QTJ`ra=oEfWWSSxG;V%YSbB)J2{xUtCR(&S6X+Z(rZM
z|Ir_=vitUDFz%s63>)#W^4-7twmSFkKx&{Q6ku+srwY5?@IGYts598Sn8rC(f39^<
zMUAK2HF*p=FOrQ(CmHwPw`cvie`RgCaLz>(6j!o*!!btR^EG|@v|;Krp>2hK^^Rcv
z^b6?`YnM#1(ZO6XIEo+FA7$nXKa-r2N8)08wApSQLzr-95AMCeb-qCJf}{m))oJHK
zeeJd5`uN{|gjfD&vA0b5u<8ef4XYCQ^5M6TO;sA8=7c@T`P}kTNCONrU>dA~rgx*0MXly^#&uGwIOQNJ3Z7X-%_*&Rc^m+;xWjcJNe};_cMr=1F
zT4&RM+F(-P*_;xzSpPLGk;D8H4Q6utb-iWxF(Q<`hLU8gZ%LI4j*~`CW;Ho
z`TnaU)-K;~pM^9*4}{bPkUq5$sBWLQMi9NSK55O5``GsD8JXt#;J}V8>8xLIpi#VE
zPL;Ht8n~1c56+121vJDI&dU~5iv()qIJo-+yZ&(fH+(pQ*uFW9wlQIJ>gJ5s&`2S)
z#trBLS3e04=krj7K@ej%2dOLhQhj^_SsL0lW4R_@>U?EoxLes-Ky+!{mYyp
z9on0Tskmt=I+_}Uav|+c;e#hN-lRD@5=e7;1ZrI8YSx70eP_>~?VpU4{U_<Dh?fl3^PrqGg-62$-|j!Rb{PP!8Y
zDqAD&q;+rK@Zk)>Txo5*639*ZG?WWZT?7&k@-EaljdKx5Xoac`^>P4lgT8XSHi(y7!m)<6yA2UkA=RhzLH3FSIBdS1M8{M1iG_Gr(73AmYDkio
z0-+&7S^a$iDJOT+sME#Q_oe5+T8_N%;V-(JZcS~K#YYo&;J5lRHpaZTC
z2Rvh9OWIbA;FmhZNTgCR>_7dvV$>jl!m7^2@!|9l7;NCm(SsOrU0)>O>D&n3FSR8v
zN79B=VdHpeZMYgxjyb#f>MK~fB+=tbIqx&5^inW1Qiu>%2e%(4bWxzcm#>RJLKfzU
z4?3NWl;pj%Yv-mSwwaKN*Fo9t(`kvm+^w+zNWoWtp%-%5KCl&nYy-Kx>cCrB93&;KIksQe#EIg*
zk>7^~f?tQTy8by8fds@6)ym0Dixz#ytXVHJb*k5?)!KGQS{KXf2jw(rK`b|N$rXa`
z_A@_aaqg$=Ae^(j)lNvqNz}3^uY9Pq*Q3h
zJhBb)%zBiW4m|73Oq}=#FTOAXKR-X34P0b&N=+-+9OQCIR5xN*Bd--%u8F9Eq=Kx@
zx*QVN^&GdlYz|`kaQcwcNWs^DUuTc0SHJ#)+(~ph;5LP7_%)C_mO7LQ3VQYG!OZ8T
zE6N2)7_WRdb5MvS$m&H@Z>i}qRd!0?$|~txt27s7MBUEsyy|k1{*3KqJ
zQ+@r(Ckq*U*BEynIKyA5{!9@_-~-@p_Y2X{Q3{EA_3Wv9)@n6`gxC#Pfq?;NwOU01
z5fETkBZq_p`v}+6;39Et5?FQ+)j{lP({3Abjik5MQJ1A==`6HsN{sekByF@^;%KVt
z1(K3>GUTG+?%KDpz`N&~KmxY`Z#&e1e;EdY0Y5(-8jZ#kygn$%h+3`2-`^j-UXMzp
zA~@Lon83h5g`DnW40RAy&lS%X?eL*_VZ(+^TzCCV
z`CiL=$;o)pEK5G~Gjn&Jyer*eNxGYn=`|NnevR4-T?R;F_el
zT>?8u?~uUN2M~=S^_v3n^9z*q&Py-<*L~lQ@)d9$u>SAV-_Qj5s}OI_&!I+l96+Q@
z3&jvDwmORa2*UIoTn8DQtHuDwb@#f09rx=U^|{w&bd(j(_s!u>0q^Osy973RO^59g
zIJmkr52#B5drEWX08*1QcZOLLTeP=s-Ok!|>sh&SwR_ArCw_Cxl05X-&51yb4c=rF
zWDWF^nocsR-PV9k(mTm0)gXaus>?Zm)Kr%be;vYdItf_J8G?^MO%JClfoqcHP6=F7
zT{TJIx(1M@fZu_a0Z)g`GXNifeE7TYo({W9O`{hX-6e2c(!4GS>?D0n(%cy}S4f(z
kz(!!L<7m^6jrnVilo7+wpBSLA;FfX!gBbo7TQIShyC6_SBZCpk%
zF5^WjV&qQ4Xt8iw{yEJ`}@Z31HHE=!3nM#&_OkK+5xRCC
zU8_O2meBP^bVG!0zCzbZP;>=dNkLZ<(9O5#YCgKrhi=WHE3xR-G>UGZt2yZA2juxB
zbiECtpF}sh5Mctknt`GyTzD1{h9QG3kned!7y|&BFw8|nC5SLnDwQG#0{K#5ZUpk8
z2ZHF3Omq@NcYu7)GMVAXz#U|u050@`xzW5TCS2qv=qZGYGhl8QT$}`gt}x6YSmXIk
ze$qJ>GY*0aeIOd1V5KWv8i(i<1Q7`Y9iXcbGFZoC#vz04%v+9-uP5@NgWsBmyy!!a
z=L9P)ka9{qlE(-I#cv*h6uh7(59Y=btj#5pFt56R-^!LQ4heed1iej?Ne(kUOuE2_
zXy($TNkCtP-y8!Mr$Tgl$z+anQOM4q@G5;kki^akWwWzj_$~|=N~TBI*=amp1tN@K
zv)K~K1R_k4E_6tyo=WGEA)2Lh9tMEDa1q3-ihzp(2v!FWQ8gkeXM_+Lp=Tu@;su?d
z5Y3c%%bt1bI5YMXT<9hq4hJcA;^82IHBLI0!_H1-gi--OM>-oxu+oOP!Q!z_K?ei?
zTD%GmqF|QofM{_3aV)VTxQ;c{AWy3?=`IT#$l8aSEYVfv
zjvt9_)E<)|``O8k2wL=|WHUW}B&u{9r%&w0v#7X21#-Dw40fl8XroGO2`*3Ke;o^-
z{T9`ctfS$39N(=Lw0~WA`lbJdad`OpGB9QQsNZ){XR1A*zW1Sj?Di9lHtP*G=CF&I
zv^EHzOD2=&@@xarfjANNQI@rN=|3+eo0T^eZ+=55<+_eUA^2Ir=x6UhbH|L@A3Qx@
z?@()>&K|HlnQ3-s?pFe#Fg$`|D?HIWnb=8MIrE^F=_lG&TGvYVIxwQV?0$G0sQkh>
z24;HF@=H@IqWBTnhd;$3QPbZ$Q+EY=gt0Gae`L7B@t^H~nAl$=Fec4fJmIgu@A2)sN;4vdMhRe
zlh@u~ynd%BkK=0+=h^HuRI65#py1tL@))4T-8qPA(|{a5SfbcL8~z`H4iXTV*hMB+-n6
z+4Wl)*`8&WVW+F|#-I!De4A1P_G9@4=C!Lmb
z!Qju>5S~Ggcc*UBpnHvlyPS85j#*lL+)-5sL$~212iVk~P(AwDD9MDhj{+ZZcpY%i
z(D3xR085t(kl{FJ#UoI;4cs=l2lXZ`orCUY8ZTPJZF?{Wp_S0C)xzu;iF0isDcQht)
zHbo+DnV1q0ppL(~M4ky#w(Zg&2`4nR`Cpa1yt= 0 && bagSlotIndex !== fromSlot;
@@ -3419,8 +3444,8 @@ export class CocosBagBoardView {
}
const target = this._resolveDropTarget(event, drag.source);
- if (target.kind === 'bag' && this._land.isBlank(target.slotIndex)) {
- this._discardGlyphToBlank(grid, drag);
+ if (this._isOverDelete(event.getUILocation())) {
+ this._discardGlyphToDelete(grid, drag);
return;
}
if (target.kind === 'bag' && this._interceptLandDrop(target.slotIndex)) {
@@ -3510,8 +3535,8 @@ export class CocosBagBoardView {
}
const bagSlotIndex = this._resolveBagSlotAt(uiPos);
- if (bagSlotIndex != null && this._land.isBlank(bagSlotIndex)) {
- this._discardGlyphToBlank(grid, drag);
+ if (this._isOverDelete(uiPos)) {
+ this._discardGlyphToDelete(grid, drag);
return;
}
if (bagSlotIndex != null && this._interceptLandDrop(bagSlotIndex)) {
@@ -4116,17 +4141,22 @@ export class CocosBagBoardView {
}
/**
- * 背包或地图上的字拖到空装饰格:飞到 grid17 后消失,不留在格子上。
+ * 背包或地图上的字拖到 ui_delete:飞到该节点后消失,不留在格子上。
* @param grid 被拖的字
* @param drag 本次拖拽
*/
- private _discardGlyphToBlank(grid: TextGrid, drag: NonNullable): void {
+ private _discardGlyphToDelete(grid: TextGrid, drag: NonNullable): void {
const session = this._bagSession;
- const blank = this._blankLandNode();
+ const del = this._deleteNode;
const layer = this._dragLayer;
- if (!session || !blank?.isValid || !layer?.isValid || !grid.node?.isValid) {
- this._discardGlyphData(drag);
- if (grid.node?.isValid) this._forceRecycleTextGrid(grid);
+ if (!del?.isValid || !del.activeInHierarchy) {
+ console.log('[CocosBagBoardView] ui_delete 不可用,取消删除');
+ this._lineDragCancel(grid, drag);
+ return;
+ }
+ if (!session || !layer?.isValid || !grid.node?.isValid) {
+ console.log('[CocosBagBoardView] 删除字块缺少拖拽层或会话');
+ this._lineDragCancel(grid, drag);
return;
}
const from: GridDetachSource = drag.source.kind === 'bag'
@@ -4154,7 +4184,7 @@ export class CocosBagBoardView {
this._lineDragCancel(grid, drag);
return;
}
- const target = blank.worldPosition.clone();
+ const target = del.worldPosition.clone();
BagToMapPlaceAnimator.play(grid, target, layer, () => {
this._finishDiscardFlight(grid);
}, { showTrail: DeviceProfile.enableBoardPlaceTrail });
@@ -4176,7 +4206,7 @@ export class CocosBagBoardView {
}
/**
- * 飞到空装饰格后回收字块,并补上推迟的盘面刷新。
+ * 飞到 ui_delete 后回收字块,并补上推迟的盘面刷新。
* @param grid 飞行中的字
*/
private _finishDiscardFlight(grid: TextGrid): void {
@@ -4188,7 +4218,17 @@ export class CocosBagBoardView {
this._refreshCanUpgradeHints();
}
- /** 空装饰格节点(grid17) */
+ /**
+ * 手指是否在 ui_delete 上。
+ * @param uiPos 屏幕坐标
+ */
+ private _isOverDelete(uiPos: { x: number; y: number }): boolean {
+ const node = this._deleteNode;
+ if (!node?.isValid || !node.activeInHierarchy) return false;
+ return this._hitNode(node, uiPos);
+ }
+
+ /** 空装饰格节点。当前没有这种格子 */
private _blankLandNode(): Node | null {
const list = this._bagList;
if (!list?.isValid) return null;
diff --git a/assets/script/battle/view/TextListLandHost.ts b/assets/script/battle/view/TextListLandHost.ts
index bc3d41f..92d585e 100644
--- a/assets/script/battle/view/TextListLandHost.ts
+++ b/assets/script/battle/view/TextListLandHost.ts
@@ -10,7 +10,7 @@ export enum TextListCellState {
OpenNoDrag = 2,
/** 未解锁:不可拖、不可落字 */
Locked = 3,
- /** 空装饰格:不刷底、不出字、不可拖放 */
+ /** 空装饰格:不刷底、不出字、不可拖放。当前没有这种格子 */
Blank = 4,
}
@@ -23,9 +23,6 @@ const GATE_NODE = '待开启';
/** 模板节点,不参与状态 */
const TEMP_NODE = 'temp';
-/** 空装饰格下标(grid17):预制体底图保持关闭,逻辑不处理 */
-const BLANK_INDEX = 17;
-
/** 一次待开启推进:新生待解锁格,以及本次要累加到这些格子数字上的等级 */
export interface TextListPromoteResult {
/** 新变成待开启、需要出字的格子 */
@@ -40,7 +37,7 @@ export interface TextListPromoteResult {
* 待开启被合成后自身变为开启,上下左右的未解锁格变为待开启。其余为未解锁。
* 每局记录解锁次数,bind 时清零。第 1 次读 Const 39 的 index 0,依次类推;超出则用最后一项。
* 该加值累加到本次上下左右新待解锁格的数字等级上。
- * grid17 是空装饰格,不刷底、不出字、不可拖放。名为 temp 的节点跳过。
+ * grid1-24 都是普通地块(含 grid17、grid23、grid24)。名为 temp 的节点跳过。
* 格子上的字块是背包槽位数据(BattleBagSession),由视图按槽位记录生成标准 TextGrid;
* 拖拽预览、合成解锁走既有背包管线,本类只负责格子底图状态与解锁规则。
*/
@@ -109,8 +106,6 @@ export class TextListLandHost {
this._useTable = true;
this._fill(this._open, normal, 'normalland');
this._fill(this._gate, gate, 'tolockland');
- this._stripBlank(this._open, 'normalland');
- this._stripBlank(this._gate, 'tolockland');
for (let i = this._gate.length - 1; i >= 0; i--) {
if (!this._has(this._open, this._gate[i])) continue;
console.log('[TextListLand] 下标同时在开启与待解锁,按开启', this._gate[i]);
@@ -131,7 +126,7 @@ export class TextListLandHost {
}
/**
- * 节点对应的格子下标。命名 gridN → N(grid1-23),temp 跳过,其余名字打日志返回 null。
+ * 节点对应的格子下标。命名 gridN → N(grid1-24),temp 跳过,其余名字打日志返回 null。
* @param node ui_textList 子节点
*/
static indexOfNode(node: Node | null | undefined): number | null {
@@ -163,11 +158,11 @@ export class TextListLandHost {
}
/**
- * 是否空装饰格(grid17)。
+ * 是否空装饰格。当前没有这种格子,grid17 起都按普通地块。
* @param index 格子下标
*/
- isBlank(index: number): boolean {
- return index === BLANK_INDEX;
+ isBlank(_index: number): boolean {
+ return false;
}
/**
@@ -347,18 +342,6 @@ export class TextListLandHost {
return null;
}
- /**
- * 配表若写了空装饰格,去掉并打日志。
- * @param arr 下标数组
- * @param label 字段名
- */
- private _stripBlank(arr: number[], label: string): void {
- const idx = arr.indexOf(BLANK_INDEX);
- if (idx < 0) return;
- console.log('[TextListLand] 空装饰格不参与地块配置', label, BLANK_INDEX);
- arr.splice(idx, 1);
- }
-
/** 数组是否包含 */
private _has(arr: readonly number[], value: number): boolean {
return arr.indexOf(value) >= 0;
diff --git a/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts b/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts
index 6671a56..d10c69c 100644
--- a/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts
+++ b/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts
@@ -10,7 +10,7 @@ const FLY_STAGGER_SEC = 0.05;
/** 波次结算每枚金币的冒出间隔(秒) */
const WAVE_COIN_SPAWN_GAP_SEC = 0.15;
/** 波次结算金币起点相对屏幕中心的世界 Y 偏移 */
-const WAVE_COIN_START_OFFSET_Y = 100;
+const WAVE_COIN_START_OFFSET_Y = 150;
/** 波次金币冒出时的水平散开(世界像素) */
const WAVE_POP_SPREAD_X = 140;
/** 波次金币冒出时的垂直散开(世界像素) */
diff --git a/assets/script/ui/BattleGame/UIBattleGame.ts b/assets/script/ui/BattleGame/UIBattleGame.ts
index 1749550..07315d8 100644
--- a/assets/script/ui/BattleGame/UIBattleGame.ts
+++ b/assets/script/ui/BattleGame/UIBattleGame.ts
@@ -4,7 +4,7 @@
// time: Tue Aug 18 2026
// desc: 战斗界面 — 地图、出怪、背包刷新(召唤)
//*********************
-import { _decorator, find, game, Label, Node, Sprite, Tween, tween, v3, Vec3, sp } from 'cc';
+import { _decorator, find, game, Label, Node, Tween, tween, v3, Vec3, sp } from 'cc';
import { Auto_BattleGame } from './Auto_BattleGame';
import { CocosBattleMapHost } from '../../battle/map/CocosBattleMapHost';
import { applyMapTopologyToSession } from '../../battle/map/importTopologyFromMapManager';
@@ -64,10 +64,6 @@ import { WeaponComposeConfigProvider } from '../../battle/bag/WeaponComposeConfi
const { ccclass } = _decorator;
-/** 召唤按钮 bg fillRange 变化 tween 时长(秒) */
-const REFRESH_FILL_TWEEN_SEC = 0.2;
-/** btnRefresh/bg2 fillRange 下限(负值,接近凑够时不再小于 -0.1) */
-const REFRESH_FILL_RANGE_MIN = -0.1;
/** 召唤按钮进度满后 Q 弹第一下相对缩放增量 */
const REFRESH_BOUNCE_AMP = 0.1;
/** 单段弹起/回落时长(秒) */
@@ -95,12 +91,6 @@ export class UIBattleGame extends Auto_BattleGame {
private _bagView: CocosBagBoardView | null = null;
/** 普攻/技能表现:监听 PresentationCue → HeroActor */
private _skillController: SkillController | null = null;
- /** 召唤按钮填充进度(btnRefresh/bg2,水平从右到左) */
- private _refreshFill: Sprite | null = null;
- /** 召唤按钮 bg2 目标 fillRange(= -(1 - 桃子进度)) */
- private _refreshFillTarget = 0;
- /** 召唤按钮可刷新态(bg3) */
- private _refreshBg3: Node | null = null;
/** 召唤按钮基准缩放 */
private readonly _refreshBtnScaleHome = new Vec3(1, 1, 1);
/** 本段「桃子足够」是否已播过满进度 Q 弹 */
@@ -276,13 +266,9 @@ export class UIBattleGame extends Auto_BattleGame {
this._ensureOwnedDesc();
this._ensureOtherOwnedDesc();
this._linkSkillDescPeers();
- this._refreshFill = this.btnRefresh?.getChildByName('bg2')?.getComponent(Sprite)
- ?? this.btnRefresh?.getChildByName('bg')?.getComponent(Sprite)
- ?? null;
- this._refreshBg3 = this.btnRefresh?.getChildByName('bg3') ?? null;
+ this._showRefreshBg1();
this._disableRefreshBreathe();
this.btnRefresh?.getScale(this._refreshBtnScaleHome);
- this._setupRefreshFillSprite();
this._lbWaveTip = this.ui_nextWaveTime?.getChildByName('lb1')?.getComponent(Label) ?? null;
this._lbWaveTipTime = this.ui_nextWaveTime?.getChildByName('lb2')?.getComponent(Label) ?? null;
if (!this.ui_nextWaveTime?.isValid) {
@@ -711,6 +697,10 @@ export class UIBattleGame extends Auto_BattleGame {
rangeNode,
this.ui_textGrids,
);
+ if (!this.ui_delete?.isValid) {
+ console.log('[UIBattleGame] ui_delete 缺失,无法拖字删除');
+ }
+ this._bagView.setDeleteNode(this.ui_delete);
// bind() 开头会 unbind,入场回调必须在 bind 之后再挂
this._bagView.setOtherBagAnchor(this.ui_otherBag);
this._bagView.setInkstoneWorldPosProvider(this._inkstoneWorldPos);
@@ -1074,27 +1064,8 @@ export class UIBattleGame extends Auto_BattleGame {
if (this.lb_RefreshNeed?.isValid) {
this.lb_RefreshNeed.string = `${cost}`;
}
+ this._showRefreshBg1();
const enough = cost <= 0 || gold >= cost;
- if (this._refreshBg3?.isValid) {
- this._refreshBg3.active = enough;
- }
- if (this._refreshFill?.isValid) {
- const fillNode = this._refreshFill.node;
- if (enough) {
- if (fillNode.active) {
- this._tweenRefreshFillRange(0, this._hideRefreshFill.bind(this));
- } else {
- this._stopRefreshFillTween();
- this._refreshFillTarget = 0;
- this._refreshFill.fillRange = 0;
- }
- } else {
- fillNode.active = true;
- const progress = cost > 0 ? Math.min(1, Math.max(0, gold / cost)) : 1;
- const fillRange = Math.min(REFRESH_FILL_RANGE_MIN, -(1 - progress));
- this._tweenRefreshFillRange(fillRange);
- }
- }
this._syncRefreshBounce(enough);
}
@@ -1127,47 +1098,20 @@ export class UIBattleGame extends Auto_BattleGame {
if (node?.isValid && node.active !== active) node.active = active;
}
- /** btnRefresh/bg2:水平从右到左;fillRange = min(-0.1, -(1 - 桃子/消耗)),凑够为 0 */
- private _setupRefreshFillSprite(): void {
- const sprite = this._refreshFill;
- if (!sprite?.isValid) return;
- sprite.type = Sprite.Type.FILLED;
- sprite.fillType = Sprite.FillType.HORIZONTAL;
- sprite.fillStart = 1;
- sprite.fillRange = -1;
- this._refreshFillTarget = -1;
- }
-
- /** btnRefresh/bg2:fillRange 0.2s tween 到目标(不足时为负,凑够为 0) */
- private _tweenRefreshFillRange(target: number, onComplete?: () => void): void {
- const sprite = this._refreshFill;
- if (!sprite?.isValid) return;
- if (Math.abs(target - this._refreshFillTarget) < 1e-4) {
- onComplete?.();
- return;
- }
- this._refreshFillTarget = target;
- Tween.stopAllByTarget(sprite);
- const tw = tween(sprite).to(REFRESH_FILL_TWEEN_SEC, { fillRange: target });
- if (onComplete) {
- tw.call(onComplete);
- }
- tw.start();
- }
-
- /** 桃子已够:fillRange 到 0 后隐藏 bg2 */
- private _hideRefreshFill(): void {
- const fillNode = this._refreshFill?.node;
- if (fillNode?.isValid) {
- fillNode.active = false;
- }
- }
-
- /** 停止召唤按钮 bg fillRange tween */
- private _stopRefreshFillTween(): void {
- if (this._refreshFill?.isValid) {
- Tween.stopAllByTarget(this._refreshFill);
+ /** btnRefresh 只显示 bg1,隐藏进度底 bg2 和可刷新底 bg3 */
+ private _showRefreshBg1(): void {
+ const btn = this.btnRefresh;
+ if (!btn?.isValid) return;
+ const bg1 = btn.getChildByName('bg1');
+ const bg2 = btn.getChildByName('bg2');
+ const bg3 = btn.getChildByName('bg3');
+ if (!bg1?.isValid) {
+ console.log('[UIBattleGame] btnRefresh 缺少 bg1');
}
+ this._setNodeActive(bg1, true);
+ if (bg2?.isValid) Tween.stopAllByTarget(bg2);
+ this._setNodeActive(bg2, false);
+ this._setNodeActive(bg3, false);
}
/** 关掉预制体上的 TweenBreathe,避免与 Q 弹抢缩放 */
@@ -1368,10 +1312,6 @@ export class UIBattleGame extends Auto_BattleGame {
this._mapHost = null;
this._battle = null;
this._combatStarted = false;
- this._stopRefreshFillTween();
- this._refreshFill = null;
- this._refreshBg3 = null;
- this._refreshFillTarget = 0;
this._stopRefreshBounce();
this._refreshBounceHinted = false;
this._illustratedHintShownThisBattle = false;