rp_10012/assets/Loading/scripts/loading.ts

271 lines
8.6 KiB
TypeScript

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 // 趣头条小游戏
}