import { math } from 'cc'; import { SceneId } from '../../../framework/scene/SceneNavigator'; import { LaunchContext, LaunchState, LaunchStateId } from './LaunchState'; export class PreloadLobbyState implements LaunchState { readonly id = LaunchStateId.PreloadLobby; private _context: LaunchContext; async enter(context: LaunchContext): Promise { this._context = context; const i18n = context.kernel.i18n; let last_percent = 0; this.setProgress(0, i18n.t('launch.preload_res')); const kernel = context.kernel; try { await Promise.all([ await kernel.sound.preload(), await kernel.scenes.preload(SceneId.Lobby, { onProgress: (percent) => { /// web preload 进度会回退 if (percent < last_percent) return; last_percent = percent; this.setProgress(percent); } }), ]); } catch (error) { context.error = error; const retry = await context.dialog({ title: "", message: i18n.t('launch.res_load_fail'), lblOK: i18n.t('launch.retry'), }); if (retry) { return LaunchStateId.CheckVersion; } throw error; } this.setProgress(1); return LaunchStateId.EnterLobby; } private setProgress(percent: number, title?: string) { const from = this._context.totalProgress; const progress = math.lerp(from, 1, percent); this._context.progress({ state: this.id, title, progress }) } }