rp_11001/assets/Game/scripts/SlotGame.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

900 lines
34 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { _decorator, Animation, Button, Component, instantiate, Label, Layout, Node, ParticleSystem, Prefab, RichText, Size, Skeleton, sp, Sprite, SpriteFrame, tween, UIOpacity, UITransform, v3, Vec3 } from 'cc';
import { RollerManager } from './game/RollerManager';
import { GameInfo, ICON_RATE, ROLLER_COMBINE_EVENT, SLOT_GAME_EVENT, WIN_TYPE } from './game/Define';
import { Icon, IconEventBus } from './game/Icon';
import { IconMsg } from './game/IconMsg';
import { gold2cash } from '../../Loading/scripts/comm';
import { NodePoolManager } from '../../Loading/scripts/manager/NodePoolManager';
import { I18nManager } from '../../Loading/scripts/manager/I18nManager';
import { AudioManager } from '../../Loading/scripts/manager/AudioManager';
import { UpLayer } from './game/UpLayer';
let { ccclass, property } = _decorator;
//倍率瓶子的所在位置
const multiPositionArr: Vec3[] = [
new Vec3(-280, 35, 0),
new Vec3(-110, 35, 0),
new Vec3(60, 35, 0),
new Vec3(230, 35, 0),
new Vec3(395, 80, 0),
]
@ccclass('SlotGame')
export class SlotGame extends Component {
@property(RollerManager)
rollerManager: RollerManager = null;
@property(Prefab)
iconMsgPre: Prefab = null;
@property(Prefab)
multiPre: Prefab = null;
@property(UpLayer)
upLayer: UpLayer = null;
@property(Prefab)
multiLabelPre: Prefab = null;
@property([SpriteFrame])
multiFrame = new Array<SpriteFrame>;
// 跑马灯信息
private moveSprite: Sprite[] = [];
private startPos: Vec3 = new Vec3(540, 0, 0);
private moveSpeed: number = 200;
private moveIndex: number = 0;
private grayNode: Node = null;
private winLayer: Node = null;
private readyHand: Node = null;
private scatterLayer: Node = null;
// 赢分信息相关
private winType: Node = null;
private normalWin: Node = null;
private normalWinSpin: sp.Skeleton = null;
private normalWinLayout: Layout = null;
private normalWinSprite: Node = null;
private normalTotalWinSprite: Node = null;
private normalWinLabel: Label = null;
private totalWin: Node = null;
private totalWinSpin: sp.Skeleton = null;
private totalWinLayout: Layout = null;
private totalWinLabel: Label = null;
private baseBg: Node = null;
private freeBg: Node = null;
private base: Node = null;
private multi: Node = null;
private waysCount: Node = null;
private waysLayout: Layout = null;
private layCount: Label = null;
private free: Node = null;
private freeMulti: Node = null;
private freeWaysCount: Node = null;
private freeWaysLayout: Layout = null;
private freeLayCount: Label = null;
private featureBuyNode: Node = null;
// 初始化盘面
private gameInfo: GameInfo = null;
// 每次的spin结果
private spinData: any = null;
private isEliminating: boolean = false;
// 设置是否正在消除中
setIsEliminating(isEliminating: boolean) {
this.isEliminating = isEliminating;
}
protected onLoad(): void {
this.rollerManager.node.on(ROLLER_COMBINE_EVENT.ONE_ROLLER_STOP, this.onRollerStop, this)
this.rollerManager.node.on(ROLLER_COMBINE_EVENT.ALL_ROLLER_STOP, this.allRollerStop, this);
this.rollerManager.node.on(ROLLER_COMBINE_EVENT.ROLLER_BOUNCE, this.onRollerBounce, this);
this.rollerManager.node.on(ROLLER_COMBINE_EVENT.ALL_ROLLER_ICONS_DELETED, this.onAllRollerIconsDeleted, this);
this.rollerManager.node.on(ROLLER_COMBINE_EVENT.ALL_ROLLER_ICONS_CREATED, this.onAllRollerIconsCreated, this);
this.rollerManager.node.on(ROLLER_COMBINE_EVENT.ALL_ROLLER_ICONS_FALLEN, this.onAllRollerIconsFallen, this);
this.grayNode = this.node.getChildByName('grayNode');
this.winLayer = this.node.getChildByName('winLayer');
this.readyHand = this.node.getChildByName('readyHand');
this.scatterLayer = this.node.getChildByPath('scatterLayer')
this.winType = this.node.getChildByName('winType');
let frameNode = this.winType.getChildByName('FrameNode');
this.normalWin = frameNode.getChildByName('marqueeFrame_02');
this.totalWin = frameNode.getChildByName('marqueeFrame_03');
this.normalWinLayout = this.normalWin.getChildByName('layout').getComponent(Layout);
this.normalWinSpin = this.normalWin.getChildByName('animation1').getComponent(sp.Skeleton);
this.normalWinSprite = this.normalWinLayout.node.getChildByName('winSprite');
this.normalTotalWinSprite = this.normalWinLayout.node.getChildByName('totalWinSprite');
this.normalWinLabel = this.normalWinLayout.node.getChildByName('winScore').getComponent(Label);
this.totalWinLayout = this.totalWin.getChildByName('layout').getComponent(Layout);
this.totalWinSpin = this.totalWin.getChildByName('animation').getComponent(sp.Skeleton);
this.totalWinLabel = this.totalWinLayout.node.getChildByName('winScore').getComponent(Label);
this.baseBg = this.node.getChildByName('base_bg');
this.freeBg = this.node.getChildByName('free_bg');
this.base = this.node.getChildByName('base');
this.multi = this.base.getChildByName('multi');
let ways = this.base.getChildByName('ways');
this.waysCount = ways.getChildByName('count');
this.waysLayout = ways.getChildByName('lay').getComponent(Layout);
this.layCount = this.waysLayout.node.getChildByName('count').getComponent(Label);
this.free = this.node.getChildByName('free');
this.freeMulti = this.free.getChildByName('multi')
let free_ways = this.free.getChildByName('ways');
this.freeWaysCount = free_ways.getChildByName('count');
this.freeWaysLayout = free_ways.getChildByName('lay').getComponent(Layout);
this.freeLayCount = this.freeWaysLayout.node.getChildByName('count').getComponent(Label);
this.featureBuyNode = this.base.getChildByName('buy');
frameNode.getChildByName('marqueeFrame_01').getChildByName('Mask').children.forEach((child, i) => {
if (child.name.includes('win_bp_text_')) {
this.moveSprite.push(child.getComponent(Sprite));
}
})
this.startMoveSprite();
IconEventBus.on('ICON_CLICKED', this.onIconClicked, this);
}
startMoveSprite() {
this.playNextSprite();
}
playNextSprite() {
let firstSprite = this.moveSprite[0];
firstSprite.node.setPosition(540, 0, 0);
// 如果所有精灵都播放完了,重置索引
if (this.moveIndex >= this.moveSprite.length) {
this.moveIndex = 0;
}
let sprite = this.moveSprite[this.moveIndex];
let spriteWidth = sprite.node.getComponent(UITransform).width;
sprite.node.setPosition(this.startPos.x, 0, 0);
let targetPos = -spriteWidth - 600;
let duration = Math.abs(this.startPos.x - targetPos) / this.moveSpeed;
this.createLoopingMovement(sprite.node, targetPos, duration);
}
createLoopingMovement(node: Node, targetX: number, duration: number) {
tween(node)
.to(duration, {
position: new Vec3(targetX, 0, 0)
}, {
easing: 'linear'
})
.call(() => {
// 当前精灵播放完成,移动到下一个精灵
this.moveIndex++;
this.playNextSprite();
})
.start();
}
onDestroy(): void {
this.rollerManager.node.off(ROLLER_COMBINE_EVENT.ONE_ROLLER_STOP, this.onRollerStop, this)
this.rollerManager.node.off(ROLLER_COMBINE_EVENT.ALL_ROLLER_STOP, this.allRollerStop, this);
this.rollerManager.node.off(ROLLER_COMBINE_EVENT.ROLLER_BOUNCE, this.onRollerBounce, this);
this.rollerManager.node.off(ROLLER_COMBINE_EVENT.ALL_ROLLER_ICONS_DELETED, this.onAllRollerIconsDeleted, this);
this.rollerManager.node.off(ROLLER_COMBINE_EVENT.ALL_ROLLER_ICONS_CREATED, this.onAllRollerIconsCreated, this);
this.rollerManager.node.off(ROLLER_COMBINE_EVENT.ALL_ROLLER_ICONS_FALLEN, this.onAllRollerIconsFallen, this);
IconEventBus.on('ICON_CLICKED', this.onIconClicked, this);
}
private currentBgState: boolean = true; // 记录当前背景状态,默认为普通模式(false)
private isFirstBgChange: boolean = true; // 添加首次调用标记
// 切换背景
changeBg(isFree: boolean) {
// 如果状态没有改变,直接返回
if (this.isFirstBgChange || this.currentBgState !== isFree) {
this.currentBgState = isFree;
this.isFirstBgChange = false; // 标记已经不是第一次调用
// 切换背景
this.baseBg.active = !isFree;
this.freeBg.active = isFree;
this.base.active = !isFree;
this.free.active = isFree;
}
}
// 初始化滚轮数据
initRollerWithIcon(gameInfo: any) {
this.upLayer.hideAllLayer();
this.rollerManager.setUpLayer(this.upLayer);
this.gameInfo = gameInfo;
this.spinData = this.gameInfo.Data;
this.rollerManager.initRollerWithIcon(this.spinData);
this.rollerManager.vRollers.forEach((roller) => {
this.upLayer.syncSpecialFromRoller(roller);
})
}
setRollerIconRule(rollerIconRule: any) {
this.rollerManager.setRollerIconRule(rollerIconRule);
}
setFastSpin(isFastSpin: boolean) {
this.rollerManager.setFastSpin(isFastSpin);
}
spin(isFree: boolean) {
this.upLayer.giveBackAllSpecials(this.rollerManager);
AudioManager.instance.playSFX('Spin_Button_Click');
this.setWaysCount('...');
if (!isFree) {
this.setMultiLabel([2, 2, 2, 2], null, 0, 0, false);
this.setMultiLabel([2, 2, 2, 2], null, 0, 0, true);
}
this.showWinScore(false, false, false, false, false);
this.rollerManager.resetInfo();
this.rollerManager.startScroll();
}
manualStop() {
this.hideReadyHand();
this.rollerManager.manualStop(this.spinData);
}
stopScroll(spinData: any, isFree: boolean, callback?: Function, callback2?: Function) {
this.spinData = spinData;
this.rollerManager.setIsFreeSpin(isFree);
// 停止滚轮
this.rollerManager.stopScroll(this.spinData);
}
setMultiLabel(multiArr, multiPos, winMulti: any, Score: number, isfree: boolean) {
let multNode = isfree ? this.freeMulti : this.multi
let labelNode = isfree ? this.freeMulti.parent.getChildByName('label') : this.multi.parent.getChildByName('label')
let posArr = []
for (let key in multiPos) {
let idx = Number.parseInt(key)
posArr.push(idx)
}
//有倍率中奖
if (multiPos) {
if (multiArr[4]) {
multiArr[4] = multiArr[3] + 2
} else {
multiArr.push(multiArr[3] + 2)
}
for (let i = 0; i < multiArr.length; i++) {
labelNode.children[i].getComponent(Label).string = 'x' + multiArr[i]
multNode.children[i].getComponent(Sprite).spriteFrame = multiArr[i] >= 4 ? this.multiFrame[1] : this.multiFrame[0]
}
for (let key in multiPos) {
//总时长1秒
let idx = Number.parseInt(key)
multNode.children[idx].getComponent(Sprite).spriteFrame = multiPos[key] >= 4 ? this.multiFrame[3] : this.multiFrame[2]
tween(multNode.children[idx])
.to(0.3, { scale: new Vec3(1.3, 1.3, 1) })
.call(() => {
let totalMultiSpin = multNode.parent.getChildByName('totalMultiSpin')
totalMultiSpin.active = true
totalMultiSpin.setPosition(new Vec3((labelNode.children[posArr[0]].getPosition().x + labelNode.children[posArr[posArr.length - 1]].getPosition().x) / 2 + 115, isfree ? -170 : -230, 0))
totalMultiSpin.getComponent(Animation).play()
})
.start()
tween(multNode.children[idx].getComponent(UIOpacity))
.delay(0.3)
.to(0.3, { opacity: 0 })
.start()
tween(labelNode.children[idx])
.to(0.2, {
scale: new Vec3(1.3, 1.3, 1),
position: new Vec3(labelNode.children[idx].getPosition().x, 150, 0)
})
.to(0.4, {
position: new Vec3((labelNode.children[posArr[0]].getPosition().x + labelNode.children[posArr[posArr.length - 1]].getPosition().x) / 2, 150, 0)
})
.call(() => {
labelNode.children[idx].active = false
if (idx == posArr[posArr.length - 1]) {
//数字合并然后飞到信息栏
AudioManager.instance.playSFX("multi_total_Sound")
let totalMulti = multNode.parent.getChildByName('totalMulti')
totalMulti.active = true
totalMulti.setPosition(new Vec3((labelNode.children[posArr[0]].getPosition().x + labelNode.children[posArr[posArr.length - 1]].getPosition().x) / 2 + 115, isfree ? 0 : -65, 0))
totalMulti.getComponent(Label).string = "x" + winMulti.toString()
tween(totalMulti)
.delay(0.4)
.to(0.4, { position: new Vec3(0, isfree ? -370 : -500, 0) })
.call(() => {
totalMulti.active = false
AudioManager.instance.playSFX('Appear__multi__Win_Sound');
this.showWinScore(
true,
false,
false,
false,
false,
true,
Score
);
})
.start()
}
})
.start()
}
} else {
if (multiArr[4]) {
multiArr[4] = multiArr[3] + 2
} else {
multiArr.push(multiArr[3] + 2)
}
for (let i = 0; i < multiArr.length; i++) {
labelNode.children[i].getComponent(Label).string = 'x' + multiArr[i]
multNode.children[i].getComponent(Sprite).spriteFrame = multiArr[i] >= 4 ? this.multiFrame[1] : this.multiFrame[0]
}
}
}
getNewMulti(isfree: boolean, multiPos: any) {
let multiNode = isfree ? this.freeMulti : this.multi
let labelNode = isfree ? this.freeMulti.parent.getChildByName('label') : this.multi.parent.getChildByName('label')
let deleteNum = 0
for (let key in multiPos) {
let idx = Number.parseInt(key)
multiNode.children[idx - deleteNum].removeFromParent()
labelNode.children[idx - deleteNum].removeFromParent()
deleteNum++
}
//生成新的multi节点
for (let key in multiPos) {
let newMultiNode = instantiate(this.multiPre)
let newMultiLabelNode = instantiate(this.multiLabelPre)
newMultiLabelNode.getComponent(Label).string = 'x' + (Number.parseFloat(labelNode.children[labelNode.children.length - 1].getComponent(Label).string.slice(1)) + 2).toString()
multiNode.addChild(newMultiNode)
labelNode.addChild(newMultiLabelNode)
newMultiNode.setPosition(900, 80, 0)
newMultiLabelNode.setPosition(900, 80, 0)
}
/**
* ratio: 曲线已完成的比例
*
* controlPos: 曲线拐弯点
*
* tempVec: 当前位置
*/
const quadraticCurve = (ratio: number, startPos: Vec3, controlPos: Vec3, endPos: Vec3, tempVec: Vec3) => {
tempVec.x = (1 - ratio) * (1 - ratio) * startPos.x + 2 * ratio * (1 - ratio) * controlPos.x + ratio * ratio * endPos.x;
tempVec.y = (1 - ratio) * (1 - ratio) * startPos.y + 2 * ratio * (1 - ratio) * controlPos.y + ratio * ratio * endPos.y;
tempVec.z = (1 - ratio) * (1 - ratio) * startPos.z + 2 * ratio * (1 - ratio) * controlPos.z + ratio * ratio * endPos.z;
}
const tempVec3 = v3();
let delay = 0
multiNode.children.forEach((child, idx) => {
if (child.getPosition().y == 35) {
tween(child)
.to(0.5, { position: multiPositionArr[idx] })
.start()
tween(labelNode.children[idx])
.to(0.5, { position: multiPositionArr[idx] })
.start()
} else {
if (idx != 4) {
tween(child)
.delay(delay)
.to(0.2, { position: multiPositionArr[4] })
.to(0.2, { position: multiPositionArr[3] }, {
onUpdate: (target, ratio) => {
quadraticCurve(ratio, multiPositionArr[4], v3(280, 140, 0), multiPositionArr[3], tempVec3);
child.setPosition(tempVec3);
}
})
.to(0.3, { position: multiPositionArr[idx] })
.start()
tween(labelNode.children[idx])
.delay(delay)
.to(0.2, { position: multiPositionArr[4] })
.to(0.2, { position: multiPositionArr[3] }, {
onUpdate: (target, ratio) => {
quadraticCurve(ratio, multiPositionArr[4], v3(280, 140, 0), multiPositionArr[3], tempVec3);
labelNode.children[idx].setPosition(tempVec3);
}
})
.to(0.3, { position: multiPositionArr[idx] })
.start()
} else {
tween(child)
.delay(delay)
.to(0.2, { position: multiPositionArr[4] })
.start()
tween(labelNode.children[idx])
.delay(delay)
.to(0.2, { position: multiPositionArr[4] })
.start()
}
delay += 0.3
}
})
}
setWaysCount(ways: any) {
if (ways == '...') {
this.waysCount.active = true;
this.waysLayout.node.active = false;
this.freeWaysCount.active = true;
this.freeWaysLayout.node.active = false;
} else {
this.waysCount.active = false;
this.waysLayout.node.active = true;
this.freeWaysCount.active = false;
this.freeWaysLayout.node.active = true;
this.layCount.string = `${ways}`;
this.freeLayCount.string = `${ways}`;
this.waysLayout.updateLayout();
this.freeWaysLayout.updateLayout();
}
}
// 消除完整的逻辑
deleteIconNode() {
//需要消除的位置
let deleteMsg = [];
//金变百搭的位置
let specialIcons = [];
let Desc = this.spinData.WinInfo.Desc
for (let WinId in Desc) {
deleteMsg.push(...Desc[WinId].Middle)
if (Desc[WinId].Transform) {
specialIcons.push(...Desc[WinId].Transform);
}
}
deleteMsg = deleteMsg.filter(item => specialIcons.indexOf(item) === -1);
this.rollerManager.handleWinIcons(this.winLayer, deleteMsg, specialIcons || []);
}
handleScatter(isRollerScrolling: boolean,) {
if (isRollerScrolling) {
} else {
this.scatterLayer.active = false;
}
}
changeIconAndFrameType(spinData: any) {
this.spinData = spinData;
// 先去找到PanChange当中是否有oldPos,如果没有代表当前icon没有动就去CroSymbols当中找
// 初始化changeData数组
let changeData = [];
// let colorChanges = this.spinData.PanChanges.CrossSymbolColorChange
// 遍历CrossSymbolColorChange获取颜色变化信息
for (let key in this.spinData.Change.Details) {
//判断组合块是否发生了金变百搭
let newIndex = -1;
if (this.spinData.Change.Details[key].Symbol) {
newIndex = this.spinData.Change.Details[key].Symbol.New
} else {
let newPos = this.spinData.Change.Details[key].Pos.New[0]
newIndex = this.spinData.Symbol.Middle[newPos]
}
let oldStartPos;
let frameType;
let height;
// 先在CrossSymbolPosChange中查找位置变化
if (this.spinData.Change.Details[key].Pos) {
oldStartPos = this.spinData.Change.Details[key].Pos.Old[0];
}
// 如果没找到则在CroSymbols中查找
else if (this.spinData.CroSymbols[key]) {
oldStartPos = this.spinData.CroSymbols[key].PosFirst;
}
// 从CroSymbols获取frameType和height
if (this.spinData.CroSymbols[key]) {
let symbol = this.spinData.CroSymbols[key];
frameType = symbol.Type;
height = symbol.PosLast - symbol.PosFirst + 1;
}
// 添加到changeData数组
changeData.push({
oldStartPos: oldStartPos,
newIndex: newIndex,
newFrameType: frameType,
lheight: height
});
}
this.rollerManager.changeIconAndFrameType(changeData);
}
// 消除创建的逻辑
createNewIconTop(spinData: any) {
this.spinData = spinData;
let createDatas: number[][][] = [[[]]]
let CroSymbols = null
if (this.spinData.Change) {
createDatas = this.spinData.Change.Middle;
}
if (this.spinData.CroSymbols) {
CroSymbols = this.spinData.CroSymbols
}
this.rollerManager.createNewIconTop(createDatas, CroSymbols);
}
// iconFallDown_Pan() {
// this.rollerManager.iconFallDown(this.spinData, true);
// }
// icon掉落的逻辑
iconFallDown_PanOut() {
//pan内的块先掉落
//消除掉落时已有三个scatter触发延时一会儿以及心跳声
if (this.rollerManager.checkNextRollerExpect(6, 3)) {
AudioManager.instance.playSFX('Appear_Scatter_Sound_elimin', 1, true)
this.rollerManager.iconFallDown(this.spinData, true);
this.scheduleOnce(() => {
this.node.getChildByName('awaitScatter').active = true
}, 0.2)
this.scheduleOnce(() => {
AudioManager.instance.stopAllSFX()
this.setWaysCount(this.spinData.Symbol.WaysNum);
this.rollerManager.iconFallDown(this.spinData, false);
this.node.getChildByName('awaitScatter').active = false
}, 2.5)
} else {
this.scheduleOnce(() => {
this.setWaysCount(this.spinData.Symbol.WaysNum);
this.rollerManager.iconFallDown(this.spinData, false);
}, (this.spinData.WinInfo && this.spinData.WinInfo.MultPos) ? 0.5 : 0)
}
}
onRollerBounce() {
}
onRollerStop(rollerId: number) {
let roller = this.rollerManager.allRollers[rollerId];
this.upLayer.syncSpecialFromRoller(roller);
// if (rollerId < 1) return;
// 计算当前停止列之前的所有数字的乘积
let totalWays = 1;
for (let i = 0; i < rollerId; i++) {
totalWays *= this.spinData.Symbol.ReelNum[i];
}
let isExpect = this.rollerManager.checkNextRollerExpect(rollerId);
if (isExpect && !this.rollerManager.getIsFastSpin()) {
let nextRollerId = this.rollerManager.getNextRollerIndex(rollerId);
this.showReadyHand(nextRollerId);
this.showScatterOnIsScroll();
}
// 设置显示的分数
this.setWaysCount(totalWays);
}
allRollerStop() {
// 设置显示的分数
this.hideReadyHand();
let isExpect = this.rollerManager.checkNextRollerExpect(6);
if (isExpect && !this.rollerManager.getIsFastSpin()) {
this.hideScatterOnIsScroll();
}
this.setWaysCount(this.spinData.Symbol.WaysNum);
this.node.emit(SLOT_GAME_EVENT.ALL_ROLLER_STOP);
}
// 新增:事件处理方法
onAllRollerIconsDeleted() {
this.upLayer.giveBackAllSpecials(this.rollerManager);
// 向上传递事件
this.node.emit(SLOT_GAME_EVENT.ALL_ROLLER_ICONS_DELETED);
}
onAllRollerIconsCreated() {
// 向上传递事件
this.node.emit(SLOT_GAME_EVENT.ALL_ROLLER_ICONS_CREATED);
}
onAllRollerIconsFallen() {
this.upLayer.resetAndSyncAllSpecials(this.rollerManager);
// 向上传递事件
this.node.emit(SLOT_GAME_EVENT.ALL_ROLLER_ICONS_FALLEN);
}
showWinScore(bol: boolean, isFirstWin: boolean, isBigWin: boolean, isReconnect: boolean, isNormalTotalWin: boolean, isShowWinLabel?: boolean, score?: number) {
// 隐藏
if (!bol) {
this.normalWin.active = false;
this.totalWin.active = false;
return;
}
// 设置活动显示窗口
if (isBigWin) {
this.totalWin.active = true;
this.totalWinSpin.setAnimation(0, "animation", false)
} else {
this.normalWin.active = true;
this.normalWinSpin.setAnimation(0, 'animation', false)
}
// 更新对应标签和布局
if (isBigWin) {
if (!isReconnect) {
AudioManager.instance.playSFX('Appear_Total_Win_Sound');
}
this.totalWinLabel.string = gold2cash(score);
this.totalWinLayout.updateLayout();
} else {
if (isNormalTotalWin) {
if (!isReconnect) {
AudioManager.instance.playSFX('Appear_Small_Total_Win_Sound');
}
this.normalWinSprite.active = false;
this.normalTotalWinSprite.active = true;
} else {
if (!isReconnect) {
// AudioManager.instance.playSFX('Appear_Normal_Win_Sound');
}
this.normalWinSprite.active = isShowWinLabel;
this.normalTotalWinSprite.active = false;
}
this.normalWinLabel.string = gold2cash(score);
this.normalWinLayout.updateLayout();
}
}
checkWinType(score: number) {
let winType = WIN_TYPE.NORAML_WIN;
let bet = this.spinData.Bet;
let multi = score / bet;
if (multi == 0) {
winType = WIN_TYPE.NONE;
} else if (multi > 0 && multi < 6) {
winType = WIN_TYPE.NORAML_WIN;
} else if (multi >= 6 && multi < 20) {
winType = WIN_TYPE.MIDDLE_WIN;
} else if (multi >= 20 && multi < 35) {
winType = WIN_TYPE.BIG_WIN;
} else if (multi >= 35 && multi < 50) {
winType = WIN_TYPE.MEGA_WIN;
} else if (multi >= 50) {
winType = WIN_TYPE.SUPER_MEGA_WIN;
}
return winType;
}
isScroll() {
return this.rollerManager.isScroll();
}
isShow: boolean = false;
onIconClicked(iconComponent: Icon) {
if (this.isEliminating) return;
if (this.isShow) return;
let isExpect = this.rollerManager.checkNextRollerExpect(6, 4);
if (isExpect) return;
if (this.freeBg.active) return;
this.node.parent.getChildByName('layer').active = false;
if (this.rollerManager.isScroll()) return;
this.isShow = true;
let iconWorldPos = iconComponent.getWorldPosition();
let localPos = this.node.getComponent(UITransform).convertToNodeSpaceAR(iconWorldPos);
let iconMsgNode = NodePoolManager.instance.getNodeFromPoolStatic('iconMsg', this.iconMsgPre);
iconMsgNode.position = localPos;
// 显示图标信息
this.node.parent.getChildByName('layer').getChildByName('iconLayer').addChild(iconMsgNode);
let isLeft = false;
if (iconComponent.rollerIndex < 3) {
isLeft = true;
}
// if (iconComponent.rollerIndex == 0 && iconComponent.startPos >= 2) {
// isLeft = false;
// }
iconMsgNode.getComponent(IconMsg).show(isLeft, iconComponent);
this.node.parent.getChildByName('layer').active = true;
// 添加点击事件关闭图标信息
this.node.parent.getChildByName('layer').getChildByName('iconLayer').once(Node.EventType.TOUCH_END, () => {
iconMsgNode.getComponent(IconMsg).hide();
this.hideIconMsg();
});
}
// 加入非空判断
hideIconMsg() {
if (this.node.parent.getChildByName('layer').active) {
this.node.parent.getChildByName('layer').active = false;
while (this.node.parent.getChildByName('layer').getChildByName('iconLayer').children.length > 0) {
let child = this.node.parent.getChildByName('layer').getChildByName('iconLayer').children[0];
NodePoolManager.instance.putNodeToPool('iconMsg', child);
this.isShow = false;
}
}
}
async showReadyHand(rollerId?: number) {
if (this.rollerManager.getIsManualStop() || this.rollerManager.getIsFastSpin()) return;
this.readyHand.active = true;
this.readyHand.getChildByName('readyHand').active = true;
let spine = this.readyHand.getChildByName('readyHand').getComponent(sp.Skeleton);
spine.setAnimation(0, 'animation', true);
let posX = this.rollerManager.getRollerPosition(rollerId).x;
this.readyHand.setPosition(posX, 360, 0);
this.grayNode.active = true;
this.grayNode.children.forEach((child, index) => {
if (index < rollerId) {
child.active = true;
} else {
child.active = false;
}
})
if (rollerId == 0 || rollerId) {
if (rollerId != -1) {
await AudioManager.instance.stopAllSFX()
AudioManager.instance.playSFX('Appear_Scatter_Sound_Final', 1, false);
} else {
AudioManager.instance.stopAllSFX()
}
}
}
hideReadyHand() {
this.readyHand.active = false;
let spine = this.readyHand.getChildByName('readyHand').getComponent(sp.Skeleton);
spine.clearTracks();
this.grayNode.active = false;
this.grayNode.children.forEach(child => {
child.active = true;
})
}
showScatterOnIsScroll() {
let scatterPos = this.rollerManager.getScatterPos();
this.scatterLayer.active = true;
scatterPos.forEach(pos => {
let iconNode = this.rollerManager.getIconNode(pos);
if (this.scatterIconNodeMap.get(pos) == null) {
this.scatterIconNodeMap.set(pos, {
node: iconNode,
originalParent: iconNode.parent,
originalPosition: iconNode.position.clone()
});
// 计算并设置正确位置
let worldPos = this.rollerManager.getIconWorldPosition(pos);
let localPos = this.scatterLayer.getComponent(UITransform).convertToNodeSpaceAR(worldPos);
iconNode.parent = this.scatterLayer;
iconNode.setPosition(localPos);
}
})
}
hideScatterOnIsScroll() {
let scatterPos = this.rollerManager.getScatterPos();
scatterPos.forEach(pos => {
let iconInfo = this.scatterIconNodeMap.get(pos);
iconInfo.node.parent = iconInfo.originalParent;
iconInfo.node.setPosition(iconInfo.originalPosition);
this.scatterIconNodeMap.delete(pos);
})
}
playScatterAni(callback: Function) {
AudioManager.instance.playSFX('Appear_Scatter_Win_Sound');
let scatterPos = this.rollerManager.getScatterPos();
let iconNodes = [];
scatterPos.forEach(pos => {
let iconNode = this.rollerManager.getIconNode(pos);
iconNode.getComponent(Icon).playWinAni(true);
iconNodes.push(iconNode);
})
this.scheduleOnce(() => {
iconNodes.forEach(iconNode => {
iconNode.getComponent(Icon).playWinAni(false);
})
callback();
}, 2);
}
showFeatureBuy(isShow: boolean) {
this.featureBuyNode.active = !isShow;
}
setFeatureBuyInteractable(isInteractable: boolean) {
// this.featureBuyNode.getComponent(Sprite).grayscale = !isInteractable;
// this.featureBuyNode.getChildByName('FEATUREBUY').getComponent(Sprite).grayscale = !isInteractable;
this.featureBuyNode.getComponent(UIOpacity).opacity = isInteractable ? 255 : 160
this.featureBuyNode.getComponent(Button).interactable = isInteractable;
}
// 修改winIconNodeMap的类型为存储更多信息
private scatterIconNodeMap: Map<number, {
node: Node,
originalParent: Node,
originalPosition: Vec3
}> = new Map();
}