rp_11001/assets/Game/scripts/game/UpLayer.ts
TJH 7954f5ea43
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m19s
scatter和wild层级
2025-12-30 16:31:31 +08:00

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