rp_10012/assets/Game/scripts/game/TipPanel.ts
TJH 3e513a8593
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 42s
提示信息取消关闭按钮
2025-11-05 11:31:13 +08:00

151 lines
5.8 KiB
TypeScript

import { _decorator, BlockInputEvents, Component, Label, Node, Prefab, tween, v3 } from 'cc';
import { NodePoolManager } from '../../../Loading/scripts/manager/NodePoolManager';
import { AudioManager } from '../../../Loading/scripts/manager/AudioManager';
const { ccclass, property } = _decorator;
@ccclass('TipPanel')
export class TipPanel extends Component {
@property(Prefab)
tipPrefab: Prefab = null;
private isAnimating: boolean = false;
tipNode: Node = null;
messageNode: Node = null;
hasTip: boolean = false;
/**
* 显示提示框
* @param title 标题
* @param msg 消息
* @param callback 确认回调
* @param cancelCallback 取消回调
* @param confirmStr 确认按钮文本
* @param cancelStr 取消按钮文本
* @param hasCancel 是否显示取消按钮
*/
showTip(title: string, msg: string, callback?: Function, cancelCallback?: Function, confirmStr?: string, cancelStr?: string, hasCancel: boolean = true) {
// 从对象池获取提示框节点
this.tipNode = NodePoolManager.instance.getNodeFromPoolStatic('TipMessagePanel', this.tipPrefab);
// 设置标题和消息
let message = this.tipNode.getChildByName('message');
this.messageNode = message;
let titleLabel = message.getChildByName('title').getComponent(Label);
let msgLabel = message.getChildByName('msg').getComponent(Label);
titleLabel.string = title;
msgLabel.string = msg;
message.scale = v3(0, 0, 0);
this.isAnimating = true;
this.tipNode.getComponent(BlockInputEvents).enabled = true;
// 添加到场景
this.node.addChild(this.tipNode);
this.hasTip = true;
tween(message)
.to(0.5, { scale: v3(1, 1, 1) }, { easing: 'backOut' })
.call(() => {
this.isAnimating = false;
this.tipNode.getComponent(BlockInputEvents).enabled = false;
})
.start();
if (hasCancel) {
message.getChildByName('Btn_Confirm').active = true;
message.getChildByName('confirm').active = true;
message.getChildByName('Btn_Cancel').active = true;
message.getChildByName('cancel').active = true;
message.getChildByName('Btn_Confirm_1').active = false;
message.getChildByName('confirm_1').active = false;
// 添加确认按钮点击事件
let confirmBtn = message.getChildByName('Btn_Confirm');
if (confirmStr) {
message.getChildByName('confirm').getComponent(Label).string = confirmStr;
}
confirmBtn.on(Node.EventType.TOUCH_END, () => {
if (this.isAnimating) return;
AudioManager.instance.playSFX('Common_Button_Click');
this.isAnimating = true;
this.tipNode.getComponent(BlockInputEvents).enabled = true;
tween(this.messageNode)
.to(0.5, { scale: v3(0, 0, 0) }, { easing: 'backIn' })
.call(() => {
// 回收节点到对象池
this.closeTip();
// 执行回调
if (callback) {
callback();
}
})
.start();
});
// 添加取消按钮点击事件
let cancelBtn = message.getChildByName('Btn_Cancel');
if (cancelStr) {
message.getChildByName('cancel').getComponent(Label).string = cancelStr;
}
cancelBtn.on(Node.EventType.TOUCH_END, () => {
if (this.isAnimating) return;
AudioManager.instance.playSFX('Common_Button_Click');
this.closeTip();
if (cancelCallback) {
cancelCallback();
}
});
} else {
message.getChildByName('Btn_Confirm').active = false;
message.getChildByName('confirm').active = false;
message.getChildByName('Btn_Cancel').active = false;
message.getChildByName('cancel').active = false;
message.getChildByName('Btn_Confirm_1').active = true;
message.getChildByName('confirm_1').active = true;
// 添加确认按钮点击事件
let confirmBtn = message.getChildByName('Btn_Confirm_1');
if (confirmStr) {
message.getChildByName('confirm_1').getComponent(Label).string = confirmStr;
}
confirmBtn.on(Node.EventType.TOUCH_END, () => {
if (this.isAnimating) return;
AudioManager.instance.playSFX('Common_Button_Click');
this.isAnimating = true;
this.tipNode.getComponent(BlockInputEvents).enabled = true;
tween(this.messageNode)
.to(0.5, { scale: v3(0, 0, 0) }, { easing: 'backIn' })
.call(() => {
this.closeTip();
// 执行回调
if (callback) {
callback();
}
})
.start();
});
}
}
// 回收节点
closeTip() {
this.hasTip = false;
// 取消所有按钮的监听事件
this.messageNode.getChildByName('Btn_Confirm').off(Node.EventType.TOUCH_END);
this.messageNode.getChildByName('Btn_Cancel').off(Node.EventType.TOUCH_END);
this.messageNode.getChildByName('Btn_Confirm_1').off(Node.EventType.TOUCH_END);
// 回收节点
NodePoolManager.instance.putNodeToPool('TipMessagePanel', this.tipNode);
}
getHasTip() {
return this.hasTip;
}
}