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(); 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(); 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]); } } }