import { _decorator, Component, Node, ProgressBar, Label, Button, view, VideoPlayer, UITransform, AssetManager, tween, ResolutionPolicy, game, director, Director, sys, macro, JsonAsset } from 'cc'; import { callGameApi, getLanguage, initReqAddr } from './comm'; import { GameDataManager } from './manager/GameDataManager'; import { ResManager } from './manager/ResManager'; import { AudioManager } from './manager/AudioManager'; import { NodePoolManager } from './manager/NodePoolManager'; import { I18nManager } from './manager/I18nManager'; import { LocalizedSprite } from './i18n/LocalizedSprite'; let { ccclass, property } = _decorator; @ccclass('LoadingUI') export class LoadingUI extends Component { //test @property(Node) BG: Node = null; @property(Node) LoadingUINode: Node = null; @property(ProgressBar) progressBar: ProgressBar = null; @property(Label) progressLabel: Label = null; @property(Label) tipLabel: Label = null; @property(Button) startBtn: Button = null; @property(Label) startBtnLabel: Label = null; @property(Node) GameNode: Node = null; @property(JsonAsset) languageJson: JsonAsset = null; private _networkComplete = false; private _retryCount = 0; private readonly MAX_RETRY = 3; private INITIAL_PROGRESS = 0.3; private _instanceGameNode = null; // 新增动画 private maskUITransform: UITransform = null; private lightNode: Node = null; protected async onLoad() { // 初始显示状态 this.initUI(); this.LoadingUINode.active = false; } async start() { try { initReqAddr(); await I18nManager.instance.init(getLanguage(), this.languageJson); I18nManager.instance.updateSceneRenderers(); this.LoadingUINode.active = true; // 更新进度条到 0.4 this.updateProgress(0.4); AudioManager.instance.init(); game.setFrameRate(61); // this.checkStartLoading(); // 开始网络请求 this.initNetwork(); } catch (error) { console.error('Network initialization failed:', error); this.handleError(error); } } private initUI() { this.BG.active = true; this.startBtn.node.active = false; this.maskUITransform = this.LoadingUINode.getChildByName('mask').getComponent(UITransform); this.lightNode = this.LoadingUINode.getChildByName('light'); this.updateProgress(this.INITIAL_PROGRESS); } private async initNetwork() { try { // 更新进度条到 0.6 this.updateProgress(0.6); this.tipLabel.string = `${I18nManager.instance.t('Loading')}...`; let gameInfo = await callGameApi("gameinfo", {}); if (!gameInfo) throw new Error('Get game info failed'); GameDataManager.instance.gameInfo = gameInfo; // 更新进度条到 0.8 this.updateProgress(0.8); this._networkComplete = true; await GameDataManager.instance.preloadFrameTypeCache(); await GameDataManager.instance.preloadSymbolCache(); this.checkStartLoading(); } catch (error) { console.error('Network initialization failed:', error); this.handleError(error); } } private checkStartLoading() { if (this._networkComplete) { this.LoadingUINode.active = true; this.startLoadingGameBundle(); } } private async startLoadingGameBundle() { try { // 显示加载UI this.tipLabel.string = `${I18nManager.instance.t('Loading')}...`; this.startBtn.node.active = false; // 从 0.8 开始加载 let startProgress = 0.8; // 使用新的合并函数加载 Bundle 和预制体 this._instanceGameNode = await ResManager.instance.loadPrefabFromBundle( 'Game', 'prefabs/SlotScene', (finished: number, total: number) => { if (total <= 0) return; let bundleProgress = finished / total; // 将加载进度映射到 0.8-1 的范围 let mappedProgress = startProgress + (bundleProgress * (1 - startProgress)); this.updateProgress(mappedProgress); } ); this.updateProgress(1); this.onLoadComplete(); } catch (error) { console.error('Loading error:', error); this.handleError(error); } } private updateProgress(progress: number) { // 使用 tween 使进度条更新更平滑 tween(this.progressBar) .to(0.2, { progress: progress }, { easing: 'smooth', onUpdate: (target: any, ratio: number) => { this.progressLabel.string = `${Math.floor(target.progress * 100)}%`; this.maskUITransform.width = target.progress * 494; this.lightNode.setPosition(target.progress * 496 - 274, -612, 0); } }) .start(); } private onLoadComplete() { // 开始游戏 // AudioManager.instance.playBGM('Normal_Mode_BGM'); this.scheduleOnce(() => { this.tipLabel.string = ''; this.startBtn.node.active = true; this.startBtnLabel.string = I18nManager.instance.t('GET START'); this.progressBar.node.active = false; this.progressLabel.node.active = false; this.maskUITransform.node.active = false; this.lightNode.active = false; }, 0.3); } private handleError(error: Error) { this._retryCount++; if (this._retryCount <= this.MAX_RETRY) { // 自动重试 this.tipLabel.string = `retry(${this._retryCount}/${this.MAX_RETRY})...`; this.scheduleOnce(() => { if (!this._networkComplete) { this.initNetwork(); } else { this.startLoadingGameBundle(); } }, 2); } else { // 显示重试按钮 this.tipLabel.string = `${I18nManager.instance.t('Loading')}...`; this.startBtn.node.active = true; this.progressBar.node.active = false; this.progressLabel.node.active = false; this.maskUITransform.node.active = false; this.lightNode.active = false; this.startBtnLabel.string = I18nManager.instance.t('AID_RETRY'); } } onStartBtnClick() { if (this.startBtnLabel.string === I18nManager.instance.t('AID_RETRY')) { // 重试逻辑 this._retryCount = 0; this.startBtn.node.active = false; this.progressBar.node.active = true; this.progressLabel.node.active = true; this.maskUITransform.node.active = true; this.lightNode.active = true; if (!this._networkComplete) { this.initNetwork(); } else { this.startLoadingGameBundle(); } } else if (this.startBtnLabel.string === I18nManager.instance.t('GET START')) { // 确保 GameNode 存在 if (!this.GameNode) { throw new Error('GameNode is not set'); } // 添加到场景 this.GameNode.addChild(this._instanceGameNode); // 隐藏加载界面 this.LoadingUINode.destroy(); } } onDestroy() { this.unscheduleAllCallbacks(); tween(this.progressBar).stop(); AudioManager.instance.destroy(); NodePoolManager.instance.clearAll(); } // UNKNOWN = 0, // 未知平台 // WINDOWS = 1, // Windows // LINUX = 2, // Linux // MACOS = 3, // macOS // ANDROID = 4, // Android // IOS = 5, // iOS // MOBILE_BROWSER = 6, // 移动端浏览器 // DESKTOP_BROWSER = 7,// 桌面端浏览器 // WECHAT_GAME = 8, // 微信小游戏 // BAIDU_MINI_GAME = 9,// 百度小游戏 // XIAOMI_QUICK_GAME = 10,// 小米快游戏 // ALIPAY_MINI_GAME = 11, // 支付宝小游戏 // BYTEDANCE_MINI_GAME = 12,// 字节跳动小游戏 // OPPO_MINI_GAME = 13,// OPPO小游戏 // VIVO_MINI_GAME = 14,// vivo小游戏 // HUAWEI_QUICK_GAME = 15,// 华为快游戏 // COCOSPLAY = 16, // Cocos Play // LINKSURE_MINI_GAME = 17,// 连尚小游戏 // QTT_MINI_GAME = 18 // 趣头条小游戏 }