SceneNavigator.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 class SceneNavigator {
  14. private navigating = false;
  15. constructor(private readonly resLoader: ResourceManager) { }
  16. async preload(scene: SceneId): Promise<void> {
  17. const bundleName = SceneRes[scene];
  18. if (bundleName) {
  19. await this.resLoader.loadBundle(bundleName);
  20. }
  21. return new Promise((resolve, reject) => {
  22. director.preloadScene(scene, (error) => {
  23. if (error) {
  24. console.log('preload scene error: ', error);
  25. reject(error);
  26. return;
  27. }
  28. resolve();
  29. });
  30. });
  31. }
  32. async go(scene: SceneId): Promise<void> {
  33. if (this.navigating || director.getScene()?.name === scene) return;
  34. this.navigating = true;
  35. try {
  36. const bundleName = SceneRes[scene];
  37. if (bundleName) {
  38. await this.resLoader.loadBundle(bundleName);
  39. }
  40. await new Promise<void>((resolve, reject) => {
  41. director.loadScene(scene, (error) => {
  42. if (error) {
  43. console.log('load scene error: ', error);
  44. reject(error);
  45. return;
  46. }
  47. resolve();
  48. });
  49. });
  50. } finally {
  51. this.navigating = false;
  52. }
  53. }
  54. goToLobby(): Promise<void> { return this.go(SceneId.Lobby); }
  55. goToGame(): Promise<void> {
  56. return this.go(SceneId.Game);
  57. }
  58. }