All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m19s
100 lines
3.4 KiB
TypeScript
100 lines
3.4 KiB
TypeScript
import { _decorator, Component, instantiate, Node, sp, tween, UIOpacity, UITransform, v3 } from 'cc';
|
|
import { PREVIEW } from 'cc/env';
|
|
import { Icon } from './Icon';
|
|
import { Roller } from './Roller';
|
|
import { RollerManager } from './RollerManager';
|
|
let { ccclass, property } = _decorator;
|
|
|
|
@ccclass('UpLayer')
|
|
export class UpLayer extends Component {
|
|
|
|
@property(Node)
|
|
wildLayer: Node = null;
|
|
|
|
@property(Node)
|
|
scatterLayer: Node = null;
|
|
|
|
|
|
// 统一隐藏所有层
|
|
hideAllLayer() {
|
|
this.wildLayer.active = false;
|
|
this.scatterLayer.active = false;
|
|
}
|
|
// ---------------------------------------readyHandNode、scatterLayer、wildLayer相关 ---------------------------------------
|
|
adopted = new Map<Node, { rollerId: number; startPos: number; height: number; type: 'wild' | 'scatter' }>();
|
|
|
|
|
|
setSpecialLayersActive() {
|
|
let hasWild = Array.from(this.adopted.values()).some(v => v.type === 'wild');
|
|
let hasScatter = Array.from(this.adopted.values()).some(v => v.type === 'scatter');
|
|
this.wildLayer.active = hasWild;
|
|
this.scatterLayer.active = hasScatter;
|
|
}
|
|
|
|
adoptSpecial(node: Node, rollerId: number, startPos: number, height: number, type: 'wild' | 'scatter') {
|
|
if (!node || !node.isValid) return;
|
|
if (this.adopted.has(node)) return;
|
|
|
|
let wp = node.worldPosition.clone();
|
|
let layer = type === 'wild' ? this.wildLayer : this.scatterLayer;
|
|
layer.active = true;
|
|
|
|
node.parent = layer;
|
|
node.setWorldPosition(wp);
|
|
node.setSiblingIndex(9999);
|
|
|
|
this.adopted.set(node, { rollerId, startPos, height, type });
|
|
this.setSpecialLayersActive();
|
|
}
|
|
|
|
// 增量同步某列(停轮/单列落定时可用)
|
|
syncSpecialFromRoller(roller: Roller) {
|
|
if (!roller) return;
|
|
let seen = new Set<Node>();
|
|
for (let i = 0; i < roller.row; i++) {
|
|
let n = (roller as any).getIconNode(i);
|
|
if (!n || seen.has(n)) continue;
|
|
seen.add(n);
|
|
|
|
let icon = n.getComponent(Icon);
|
|
if (!icon || !icon._isWildOrScatter) continue;
|
|
|
|
let msg = (roller as any).getNodeMsgFromPos(i);
|
|
if (!msg) continue;
|
|
|
|
let type: 'wild' | 'scatter' = icon.index === 0 ? 'wild' : 'scatter';
|
|
this.adoptSpecial(msg.node, roller._rollerId, msg.start, msg.height, type);
|
|
}
|
|
}
|
|
|
|
// 删除前:去登记,避免后续“归还”
|
|
removeSpecialByNode(node: Node) {
|
|
if (!node) return;
|
|
if (this.adopted.delete(node)) this.setSpecialLayersActive();
|
|
}
|
|
|
|
// 统一归还(开新轮或重算前调用)
|
|
giveBackAllSpecials(rm: RollerManager) {
|
|
if (!rm) return;
|
|
this.adopted.forEach((info, node) => {
|
|
if (!node || !node.isValid) return;
|
|
let roller = rm.allRollers[info.rollerId];
|
|
if (!roller) return;
|
|
node.parent = roller.node;
|
|
node.setPosition(roller.getIconPosition(info.startPos, info.height));
|
|
});
|
|
this.adopted.clear();
|
|
this.setSpecialLayersActive();
|
|
}
|
|
|
|
// 全量重算:不累加,重新扫描所有列
|
|
resetAndSyncAllSpecials(rm: RollerManager) {
|
|
if (!rm) return;
|
|
this.giveBackAllSpecials(rm); // 清空旧数据与节点
|
|
for (let i = 0; i < rm.allRollers.length; i++) {
|
|
this.syncSpecialFromRoller(rm.allRollers[i]);
|
|
}
|
|
}
|
|
}
|
|
|