SceneNavigator.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { director } from 'cc';
  2. import { BUNDLE_ID } from '../../define/ResDefine';
  3. import { ResourceManager } from '../resource/ResourceManager';
  4. export enum SceneId {
  5. Launch = 'Launch',
  6. Lobby = 'Lobby',
  7. Game = 'Game',
  8. }
  9. const SceneRes = {
  10. [SceneId.Lobby]: BUNDLE_ID.Lobby,
  11. [SceneId.Game]: BUNDLE_ID.Lobby
  12. }
  13. export interface ISceneLoader {
  14. onProgress?: (percent: number) => void;
  15. }
  16. export class SceneNavigator {
  17. private navigating = false;
  18. constructor(private readonly resLoader: ResourceManager) { }
  19. async preload(scene: SceneId, loader?: ISceneLoader): Promise<void> {
  20. const bundleName = SceneRes[scene];
  21. if (bundleName) {
  22. await this.resLoader.loadBundle(bundleName);
  23. }
  24. return new Promise((resolve, reject) => {
  25. director.preloadScene(scene, (completedCount: number, totalCount: number, item: any) => {
  26. if (loader && loader.onProgress) {
  27. loader.onProgress(completedCount / totalCount);
  28. }
  29. }, (error) => {
  30. if (error) {
  31. console.log('preload scene error: ', error);
  32. reject(error);
  33. return;
  34. }
  35. resolve();
  36. });
  37. });
  38. }
  39. async go(scene: SceneId): Promise<void> {
  40. if (this.navigating || director.getScene()?.name === scene) return;
  41. this.navigating = true;
  42. try {
  43. const bundleName = SceneRes[scene];
  44. if (bundleName) {
  45. await this.resLoader.loadBundle(bundleName);
  46. }
  47. await new Promise<void>((resolve, reject) => {
  48. director.loadScene(scene, (error) => {
  49. if (error) {
  50. console.log('load scene error: ', error);
  51. reject(error);
  52. return;
  53. }
  54. resolve();
  55. });
  56. });
  57. } finally {
  58. this.navigating = false;
  59. }
  60. }
  61. goToLobby(): Promise<void> { return this.go(SceneId.Lobby); }
  62. goToGame(): Promise<void> {
  63. return this.go(SceneId.Game);
  64. }
  65. }