大侠
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

125 lines
4.8 KiB

//#region 文件引入
import { _decorator, Node, Button, instantiate } from "cc";
import { TipsAnimation } from "./TipsAnimation";
import BaseUIForm from "../../Mgr_UI/BaseUIForm";
import NodePools from "../../CComEx/NodePools";
//#endregion 文件引入
const {ccclass, property,menu} = _decorator;
@ccclass("TipsUI_Proxy")
export default class TipsUI_Proxy extends BaseUIForm{
//#region 节点自动生成
@property(Node)
m_Tips: Node = null;
@property(Node)
n_Node: Node = null;
//#endregion 节点自动生成
// 使用对象池管理提示节点
tips_pool: NodePools = null;
tips_list:TipsAnimation[]=[];
pending_tips:string[]=[]; // 待处理的提示队列
last_show_time:number = 0; // 上次显示提示的时间
tips_cooldown:number = 0.1; // 提示显示冷却时间(秒)
tipsmap:Map<string,number> = new Map();
// 最大显示数量限制
MAX_VISIBLE_TIPS: number = 6;
protected onLoad(): void {
super.onLoad();
// 初始化对象池,预创建8个实例
this.tips_pool = new NodePools(this.m_Tips, 8);
}
onShow(tips: string) {
// 添加到待处理队列
this.pending_tips.push(tips);
}
processPendingTips() {
// 处理待显示的提示
while (this.pending_tips.length > 0) {
const tips = this.pending_tips.shift();
if (tips !== undefined) {
// 检查是否与最新显示的提示相同
if (this.tips_list.length > 0) {
const lastTip = this.tips_list[this.tips_list.length - 1];
// 注意:这里需要访问lastTip中的文本内容,但由于架构限制无法直接获取
// 可以考虑在TipsAnimation中添加getText方法来支持此功能
}
// 检查全局冷却时间
const currentTime = performance.now() / 1000; // 转换为秒
if (currentTime - this.last_show_time < this.tips_cooldown) {
// 冷却中,将提示重新放入队列等待下次处理
this.pending_tips.unshift(tips);
break;
}
// 检查是否超过最大显示数量
if (this.tips_list.length >= this.MAX_VISIBLE_TIPS) {
// 移除最早的一个提示
const earliestTip = this.tips_list.shift();
if (earliestTip) {
earliestTip.onStopAnimation();
}
}
// 创建并显示新提示
let t_node = this.tips_pool.get(this.n_Node);
let t_tips_con = t_node.getComponent(TipsAnimation);
// 修改组件的finish回调,使其回收到对象池而不是销毁
t_tips_con.setFinishCallback((tips) => {
this.recycleTipsNode(tips.node);
const idx = this.tips_list.findIndex(tips => tips === tips);
idx >= 0 && this.tips_list.splice(idx, 1);
});
CNodeUtils.switchRichText(t_tips_con.tips,tips);
this.tips_list.push(t_tips_con);
// 更新最后显示时间
this.last_show_time = currentTime;
// 激活动画
t_tips_con.node.active = true;
t_tips_con.PlayAnimation();
}
}
}
// 回收提示节点到对象池
private recycleTipsNode(tipsNode: Node) {
if (this.tips_pool && tipsNode) {
tipsNode.active = false;
this.tips_pool.put(tipsNode);
}
}
tick(dt){
// 处理待显示的提示
this.processPendingTips();
// 原有的去重逻辑保持不变
this.tipsmap.forEach((value: number, key: string) => {
value -= dt;
if (value <= 0) {
this.tipsmap.delete(key);
} else {
this.tipsmap.set(key, value)
}
})
}
protected update(dt: number): void {
this.tick(dt);
}
protected onDestroy(): void {
super.onDestroy();
// 清理对象池
if (this.tips_pool) {
this.tips_pool.clear();
}
}
}