PreloadLobbyState.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { math } from 'cc';
  2. import { SceneId } from '../../../framework/scene/SceneNavigator';
  3. import { LaunchContext, LaunchState, LaunchStateId } from './LaunchState';
  4. export class PreloadLobbyState implements LaunchState {
  5. readonly id = LaunchStateId.PreloadLobby;
  6. private _context: LaunchContext;
  7. async enter(context: LaunchContext): Promise<LaunchStateId> {
  8. this._context = context;
  9. const i18n = context.kernel.i18n;
  10. let last_percent = 0;
  11. this.setProgress(0, i18n.t('launch.preload_res'));
  12. const kernel = context.kernel;
  13. try {
  14. await Promise.all([
  15. await kernel.sound.preload(),
  16. await kernel.scenes.preload(SceneId.Lobby, {
  17. onProgress: (percent) => {
  18. /// web preload 进度会回退
  19. if (percent < last_percent) return;
  20. last_percent = percent;
  21. this.setProgress(percent);
  22. }
  23. }),
  24. ]);
  25. } catch (error) {
  26. context.error = error;
  27. const retry = await context.dialog({
  28. title: "",
  29. message: i18n.t('launch.res_load_fail'),
  30. lblOK: i18n.t('launch.retry'),
  31. });
  32. if (retry) {
  33. return LaunchStateId.CheckVersion;
  34. }
  35. throw error;
  36. }
  37. this.setProgress(1);
  38. return LaunchStateId.EnterLobby;
  39. }
  40. private setProgress(percent: number, title?: string) {
  41. const from = this._context.totalProgress;
  42. const progress = math.lerp(from, 1, percent);
  43. this._context.progress({ state: this.id, title, progress })
  44. }
  45. }