Files
dino/assets/seripts/ui/ResultModal.ts

194 lines
5.0 KiB
TypeScript
Raw Normal View History

2026-04-30 00:13:37 +08:00
import {
_decorator,
Component,
director,
Label,
Node,
tween,
UITransform,
Vec3,
} from "cc";
import { EventDispatcher } from "../libs/EventDispatcher";
import { GlobalData } from "../config/GlobalData";
import AudioEffect from "../libs/AudioEffect";
const { ccclass, property } = _decorator;
@ccclass("ResultModal")
export class ResultModal extends Component {
// 本局得分的 label
@property(Label)
scoreLabel: Label = null;
// 最佳得分 label
@property(Label)
bestScoreLabel: Label = null;
// 总的金币数 label
@property(Label)
totalScoreLabel: Label = null;
// 回到首页的按钮节点
@property(Node)
backToHomeBtn: Node = null;
// 提示节点
@property(Node)
tipNode: Node = null;
start() {
// 隐藏结果弹窗
this.node.active = false;
// 设置位置
this.node.setPosition(0, 0);
// 注册打开结果弹窗的事件
EventDispatcher.getTarget().on(
EventDispatcher.SHOW_RESULT_MODAL,
this.openModal,
this,
);
}
// 打开结果弹窗
openModal() {
// 显示结果弹窗
this.node.active = true;
// 设置当前得分
this.scoreLabel.string = GlobalData.curRoundTotalScore.toString();
// 累计总的金币数
GlobalData.totalScore += GlobalData.curRoundTotalScore;
// 设置总的金币数
this.setTotalScoreLabel();
// 设置当前用户最好的得分成绩
this.setCurUserBestScoreLabel();
// 执行相关动效
this.scheduleOnce(async () => {
await this.playGoldEffect();
// 再执行提示信息的动画
this.playTipAni();
// 显示回到首页的按钮
this.backToHomeBtn.active = true;
}, 1);
}
// 关闭游戏结束弹窗方法
closeModal() {
this.node.active = false;
// 隐藏回到首页的按钮
this.backToHomeBtn.active = false;
// 重置分数
this.scoreLabel.string = "0";
}
setTotalScoreLabel() {
this.totalScoreLabel.string = GlobalData.totalScore.toString();
}
setCurUserBestScoreLabel() {
const bestScore = GlobalData.bestScore;
// 如果当前成绩大于最好成绩 更新最好成绩
if (GlobalData.curRoundTotalScore > bestScore) {
GlobalData.bestScore = GlobalData.curRoundTotalScore;
}
// 设置最佳得分 label
this.bestScoreLabel.string = GlobalData.bestScore.toString();
}
setBestScoreLabel() {}
// 播放金币特效
async playGoldEffect() {
// 获取 gold coins 节点
const goldCoinsNode = this.node
.getChildByName("panel")
.getChildByName("gold_coins");
// 开启此节点
goldCoinsNode.active = true;
// 播放撒金币音效
AudioEffect.playGoldAudio();
// 0.5 s 后执行入账音效
this.scheduleOnce(() => {
AudioEffect.playCoinsEntryAudio();
}, 0.5);
// 获取所有金币子节点
const goldCoinsList = goldCoinsNode.children;
// 获取显示金币数量的标签节点
const goldCoinsNumNode = this.node
.getChildByName("gold_label")
.getChildByName("gold_num");
// 获取目标节点的位置
const targetPos = goldCoinsNumNode.getWorldPosition();
// 遍历金币子节点
for (let i = 0; i < goldCoinsList.length; i++) {
// 克隆位置
const targetPosColne = targetPos.clone();
// 执行单个金币的动画
const goldCoin = goldCoinsList[i];
await this.playSingleGoldAni(goldCoin, targetPosColne);
}
}
// 执行单个金币的动画
async playSingleGoldAni(goldCoin: Node, targetPos: Vec3) {
return new Promise((resolve) => {
tween(goldCoin)
.by(0.2, {
position: new Vec3(0, -30, 0),
})
.call(() => {
// 开始执行下一个
resolve(true);
// 获取金币的世界坐标
const goleCoinWorldPos = goldCoin.getWorldPosition();
// 计算金币节点与目标距离的差值
const diffPost = targetPos.subtract(goleCoinWorldPos);
// 再缓动到目标位置
tween(goldCoin)
.by(0.5, { position: diffPost })
.call(() => {
// 金币消失
goldCoin.active = false;
})
.start();
})
.start();
});
}
// 执行提示动画
playTipAni() {
// 开启提示
this.tipNode.active = true;
// 获取提示的位置
const oriPos = this.tipNode.getPosition().clone();
// 获取提示的宽度
const tipWidth = this.tipNode.getComponent(UITransform).width + 5;
// 执行动画
tween(this.tipNode)
.to(0.3, {
position: new Vec3(oriPos.x - tipWidth, oriPos.y, 0),
})
.delay(0.8)
.to(0.3, {
position: oriPos,
})
.call(() => {
// 隐藏提示1
this.tipNode.active = false;
// 重置节点位置
this.tipNode.setPosition(oriPos);
})
.start();
}
// 回到首页
backToHome() {
// 播放点击音效
AudioEffect.playClickAudio();
director.loadScene("home");
}
update(deltaTime: number) {}
}