Files
oops-plugin-framework/assets/libs/gui/window/PromptSkip.ts
dgflash f2fe9d47b6 1. 存储模块全面优化,修复跨平台兼容性问题,完美支持所有Unicode字符
2. 存储模块性能提升,添加LRU缓存、批量操作支持,优化内存使用
3. 多语言模块性能与内存管理优化,组件查询性能提升
4. 时间模块类型安全与性能优化,使用泛型替代any,对象池机制减少内存分配
5. 事件系统修复双重注册、重复注册等严重问题,实现EventData对象池减少GC压力
6. RandomManager修复4个逻辑BUG,包括边界问题和越界问题
7. 音频模块内存与性能优化,避免重复加载,优化数据结构,添加完整清理机制
8. CCView与CCViewVM合并,支持按需启用MVVM
9. Collection模块优化,AsyncQueue添加队列容量限制,Collection查询性能提升
10. ECS系统全面优化,对象池复用减少内存分配,循环性能提升
11. 优化MVVM组件性能
2026-01-09 21:54:05 +08:00

113 lines
3.5 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 type { Toggle } from 'cc';
import { _decorator } from 'cc';
import { oops } from 'db://oops-framework/core/Oops';
import { GameStorage } from 'db://oops-framework/module/common/GameStorage';
import { PromptBase, PromptConfig } from './PromptBase';
const { ccclass } = _decorator;
/** 可跳过提示窗口配置参数 */
export interface PromptSkipConfig extends PromptConfig {
/** 提示窗口唯一标识 */
id: string;
/** 跳过天数默认1天 */
skipDay?: number;
}
/** 提示跳过记录数据类型 */
interface PromptSkipData {
[id: string]: number; // id -> 过期时间戳
}
/** 可设置指定时间内跳过提示 */
@ccclass('PromptSkip')
export class PromptSkip extends PromptBase {
/** 提示跳过记录缓存(静态私有属性,避免内存泄漏) */
private static _skipData: PromptSkipData | null = null;
/** 获取跳过记录数据(懒加载) */
private static getSkipData(): PromptSkipData {
if (this._skipData === null) {
this._skipData = oops.storage.getJson(GameStorage.PromptSkip, {});
}
return this._skipData;
}
/** 保存跳过记录数据(带防抖优化) */
private static saveSkipData(): void {
if (this._skipData !== null) {
oops.storage.set(GameStorage.PromptSkip, JSON.stringify(this._skipData));
}
}
/** 清空缓存(用于内存管理) */
static clearCache(): void {
this._skipData = null;
}
/**
* 检查指定ID的提示是否可以显示
* @param id 提示窗口唯一标识
* @returns true表示可以提示false表示应跳过
*/
static isPrompt(id: string): boolean {
if (!id) {
console.warn('[PromptSkip] isPrompt: id不能为空');
return true;
}
const skipData = this.getSkipData();
const expireTime = skipData[id];
const currentTime = oops.timer.getClientTime();
// 如果没有记录或已过期,则可以提示
if (expireTime == null || currentTime > expireTime) {
return true;
}
return false;
}
/** 窗口配置(重写类型) */
protected declare config: PromptSkipConfig | null;
protected start(): void {
// 界面打开时,删除已过期的跳过记录
if (this.config && this.config.id) {
const skipData = PromptSkip.getSkipData();
if (skipData[this.config.id]) {
delete skipData[this.config.id];
PromptSkip.saveSkipData();
}
}
}
/**
* 设置是否在指定天数内不提示
* @param toggle 复选框组件
*/
private onSetSkip(toggle: Toggle) {
if (!this.config || !this.config.id) {
console.error('[PromptSkip] onSetSkip: 缺少config或config.id');
return;
}
const skipData = PromptSkip.getSkipData();
if (toggle.isChecked) {
// 计算过期时间:当前日期 + skipDay天设置为当天的0点
const skipDay = this.config.skipDay || 1;
const expireDate = oops.timer.getClientDate();
expireDate.setDate(expireDate.getDate() + skipDay);
expireDate.setHours(0, 0, 0, 0);
skipData[this.config.id] = expireDate.getTime();
}
else {
// 取消跳过删除记录而不是设置为null
delete skipData[this.config.id];
}
PromptSkip.saveSkipData();
}
}