rp_11001/assets/Game/scripts/game/WinLayer.ts
2025-11-08 14:26:11 +08:00

369 lines
13 KiB
TypeScript

// import { _decorator, color, Color, Component, Graphics, instantiate, Label, Node, Prefab, sp, UIOpacity, UITransform, v3, Vec3 } from 'cc';
// import { Icon } from './Icon';
// import { RollerManager } from './RollerManager';
// import { gold2cash } from '../../../Loading/scripts/comm';
// import { NodePoolManager } from '../../../Loading/scripts/manager/NodePoolManager';
// import { AudioManager } from '../../../Loading/scripts/manager/AudioManager';
// const { ccclass, property } = _decorator;
// @ccclass('WinLayer')
// export class WinLayer extends Component {
// // 灰色节点
// @property(Node)
// grayNode: Node = null;
// // 方框动画父节点
// @property(Node)
// winEffectParent: Node = null;
// // 方框动画
// @property(Prefab)
// winEffectPre: Prefab = null;
// // 线的父节点
// @property(Node)
// lineParentNode: Node = null;
// @property(Prefab)
// lineSpinePre: Prefab = null;
// // icon父节点
// @property(Node)
// iconLayer: Node = null;
// // rollerManager
// @property(RollerManager)
// rollerManager: RollerManager = null;
// // 左右两边光效节点
// @property(Node)
// lineNum: Node = null;
// // 分数节点
// @property(Label)
// score: Label = null;
// iconPosArray: Vec3[] = []; // 图标位置数组
// hitLineData: HitLineMap; // 中奖数据
// hitBlockData: HitBlockInfo[] = [];
// aniTime: number = 2; // 动画间隔
// columnGroups: number[][][] = []; // 服务器数据转本地需要的数据
// drawLineData: number[] = [];
// winningIconPos: number[] = [];
// private winIconNodeMap: Map<number, Node> = new Map; // 保存本地的icon
// start() {
// for (let i = 0; i < 10; i++) {
// let worldPos = this.rollerManager.getIconWorldPosition(i);
// let localPos = this.iconLayer.getComponent(UITransform).convertToNodeSpaceAR(worldPos);
// this.iconPosArray.push(localPos)
// }
// }
// processHitLineData(hitLineData: HitLineMap) {
// if (!hitLineData || Object.keys(hitLineData).length === 0) {
// return [];
// }
// let keys: number[] = Object.keys(hitLineData)
// .filter(key => hitLineData[key] !== null) // 过滤 null 的条目
// .map(key => parseInt(key));
// let lines: number[][] = keys.map(key => hitLineData[key]?.Line || []);
// // 获取 [[1,2,5,6,8],[1,5,8],[2,6,8]],去重后的所有中奖图标集合
// let lineGroups = [
// lines.reduce((acc, curr) => acc.concat(curr), []) // 展开所有 Line 数据
// .filter((value, index, self) => self.indexOf(value) === index), // 去重
// ...lines, // 每个 Line 数据单独作为一个分组
// ];
// // 映射
// let mappedLineGroups = lineGroups.map(lineGroup =>
// lineGroup.map(iconIndex => ICON_POSITION[iconIndex] !== undefined ? ICON_POSITION[iconIndex] : iconIndex)
// );
// // 按列划分 mappedLineGroups
// let columns = [
// [0, 1, 2],
// [3, 4, 5, 6],
// [7, 8, 9],
// // 如果列数更多,可以继续添加更多的列
// ];
// let columnGroups = mappedLineGroups.map(lineGroup =>
// columns.map(column =>
// lineGroup.filter(iconIndex => column.indexOf(iconIndex) !== -1) // 用 indexOf 代替 includes
// )
// );
// return columnGroups;
// // columnGroups: [
// // [[1, 2], [3, 5, 6], [7, 8]], // 基于 lineGroups[0]: [1,2,3,5,6,7,8]
// // [[1], [5], [8]], // 基于 lineGroups[1]: [1,5,8]
// // [[2], [6], [8]], // 基于 lineGroups[2]: [2,6,8]
// // [[1], [3], [7]], // 基于 lineGroups[3]: [1,3,7]
// // ]
// }
// getLines(hitLineData: HitLineMap): number[] {
// if (hitLineData == null) return [];
// if (Object.keys(hitLineData) == null) return [];
// this.drawLineData = [];
// for (let key of Object.keys(hitLineData)) {
// this.drawLineData.push(+key);
// }
// return this.drawLineData;
// }
// playAni(bol: boolean, spinData?: SpinData, isFreeSpin: boolean = false) {
// if (bol) {
// // 处理数据
// this.grayNode.active = true;
// if (spinData.HitLine != null && spinData.HitBlock.length < 5) {
// this.hitLineData = spinData.HitLine;
// this.columnGroups = this.processHitLineData(spinData.HitLine);
// this.drawLineData = this.getLines(spinData.HitLine);
// this.loopAnimations();
// } else if (spinData.HitLine == null && spinData.HitBlock.length >= 5) {
// this.hitBlockData = spinData.HitBlock;
// if (isFreeSpin) {
// } else {
// this.playBoxAni(bol);
// }
// }
// } else {
// this.grayNode.active = false;
// this.playScore(false, 0);
// this.stopAnimations();
// this.lineParentNode.removeAllChildren();
// }
// }
// payLineOn(lines: number[]) {
// lines.forEach(line => {
// let left = this.lineNum.getChildByName(`payline_on_left_${line}`);
// let right = this.lineNum.getChildByName(`payline_on_right_${line}`);
// left.getComponent(UIOpacity).opacity = 255;
// right.getComponent(UIOpacity).opacity = 255;
// })
// }
// payAllLineOff() {
// this.lineNum.children.forEach(child => {
// child.getComponent(UIOpacity).opacity = 0;
// })
// }
// playScore(bol: boolean, score: number) {
// this.score.node.active = bol;
// if (bol)
// this.score.string = gold2cash(score);
// }
// loopAnimations() {
// let playAllAnimations = (onComplete: () => void) => {
// // 线
// this.payLineOn(this.drawLineData);
// this.recycleAniNode();
// this.playScore(false, 0);
// AudioManager.instance.playSFX('Win_Score_Sound', 0.5);
// //按顺序播放动画
// let allIconsPos = this.columnGroups[0];
// this.winningIconPos = [];
// for (let i = 0; i < allIconsPos.length; i++) {
// this.scheduleOnce(() => {
// let posArr = allIconsPos[i];
// this.playAnimationAtPosition(posArr);
// this.playWinIconSpine(true, posArr);
// this.winningIconPos.push(...posArr);
// }, i * 0.15)
// }
// // 画线
// this.drawLines();
// // 假设每个动画时长 2 秒,延时后回调完成事件
// if (Object.keys(this.hitLineData).length == 1) {
// return;
// }
// this.scheduleOnce(() => {
// this.playWinIconSpine(false, this.winningIconPos);
// this.recycleAniNode();
// this.payAllLineOff();
// this.lineParentNode.removeAllChildren();
// onComplete();
// }, this.aniTime);
// };
// let playLineAnimations = (lineIndex: number, onComplete: () => void) => {
// if (lineIndex >= this.columnGroups.length) {
// onComplete();
// return;
// }
// // 播放中奖线
// let keysNum = Object.keys(this.hitLineData).map(Number); // 获取并转换为数字
// this.payLineOn([keysNum[lineIndex - 1]]);
// AudioManager.instance.playSFX('Win_Line_Sound', 0.5);
// let allIconsPos = this.columnGroups[lineIndex];
// this.winningIconPos = [];
// for (let i = 0; i < allIconsPos.length; i++) {
// this.scheduleOnce(() => {
// let posArr = allIconsPos[i];
// this.playAnimationAtPosition(posArr);
// this.playWinIconSpine(true, posArr);
// this.winningIconPos.push(...posArr);
// }, i * 0.15)
// }
// // 播放分数
// this.drawOneLine(this.drawLineData[lineIndex - 1]);
// this.playScore(true, this.hitLineData[keysNum[lineIndex - 1]].Score);
// let worldPos = this.rollerManager.getIconWorldPosition(allIconsPos[1][0]);
// let localPos = this.score.node.parent.getComponent(UITransform).convertToNodeSpaceAR(worldPos);
// localPos.y -= 50;
// this.score.node.setPosition(localPos);
// // // 每组动画播放完后延时 2 秒播放下一组
// this.scheduleOnce(() => {
// this.playWinIconSpine(false, this.winningIconPos);
// this.recycleAniNode();
// this.payAllLineOff();
// this.lineParentNode.removeAllChildren();
// playLineAnimations(lineIndex + 1, onComplete);
// }, this.aniTime);
// };
// let loop = () => {
// playAllAnimations(() => {
// playLineAnimations(1, () => {
// // 循环播放
// loop();
// });
// });
// };
// loop();
// }
// playAnimationAtPosition(posArr: number[]) {
// posArr.forEach(pos => {
// let position = this.iconPosArray[pos];
// let animNode = NodePoolManager.instance.getNodeFromPoolStatic('winEffect', this.winEffectPre);
// animNode.parent = this.winEffectParent; // 将动画节点挂载到当前节点
// animNode.setPosition(position); // 设置位置
// });
// }
// playWinIconSpine(bol: boolean, posArr: number[]) {
// posArr.sort();
// posArr.forEach(pos => {
// let icon = this.rollerManager.getIconNode(pos);
// if (icon != null) {
// let iconScp = icon.getComponent(Icon);
// iconScp.playWinAni(bol);
// }
// })
// this.moveWinIconToLayer(posArr, bol);
// }
// moveWinIconToLayer(posArray: number[], bol: boolean) {
// if (bol) {
// posArray.forEach(pos => {
// let iconNode = this.rollerManager.getIconNode(pos);
// if (iconNode) {
// iconNode.parent = this.iconLayer;
// this.winIconNodeMap.set(pos, iconNode);
// let worldPos = this.rollerManager.getIconWorldPosition(pos);
// let localPos = this.iconLayer.getComponent(UITransform).convertToNodeSpaceAR(worldPos);
// iconNode.setPosition(localPos);
// }
// })
// } else {
// posArray.forEach(pos => {
// let iconNode = this.winIconNodeMap.get(pos);
// if (iconNode) {
// iconNode.parent = this.rollerManager.getContentNode(pos);
// this.winIconNodeMap.delete(pos);
// let worldPos = this.rollerManager.getIconWorldPosition(pos);
// let rollerContentNode = this.rollerManager.getContentNode(pos);
// let localPos = rollerContentNode.getComponent(UITransform).convertToNodeSpaceAR(worldPos);
// iconNode.setPosition(localPos);
// }
// })
// }
// }
// // 画所有线
// drawLines() {
// this.lineParentNode.removeAllChildren();
// this.drawLineData.forEach(lineIndex => {
// this.drawOneLine(lineIndex);
// })
// }
// drawOneLine(index: number) {
// let lineNode = NodePoolManager.instance.getNodeFromPoolStatic('lineNode', this.lineSpinePre);
// this.lineParentNode.addChild(lineNode);
// let spine = lineNode.getChildByName('spine').getComponent(sp.Skeleton);
// spine.setAnimation(0, `${index}`, true);
// }
// stopAnimations() {
// this.playWinIconSpine(false, this.winningIconPos);
// this.playBoxAni(false);
// this.winningIconPos = [];
// this.hitBlockData = [];
// this.payAllLineOff();
// this.recycleAniNode();
// this.unscheduleAllCallbacks(); // 停止所有定时任务
// }
// recycleAniNode() {
// while (this.winEffectParent.children.length > 0) {
// let node = this.winEffectParent.children[0];
// NodePoolManager.instance.putNodeToPool('winEffect', node);
// }
// while (this.lineParentNode.children.length > 0) {
// let node = this.lineParentNode.children[0];
// NodePoolManager.instance.putNodeToPool('lineNode', node);
// }
// }
// onDestroy() {
// this.stopAnimations(); // 确保销毁时停止动画
// }
// // 加入非空判断
// playBoxAni(bol: boolean) {
// if (this.hitBlockData.length == 0 || this.hitBlockData == null) return;
// this.hitBlockData.forEach(hitBlock => {
// this.playWinIconSpine(bol, [ICON_POSITION[hitBlock.Position]]);
// })
// }
// }