| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import { director } from 'cc';
- import { BUNDLE_ID } from '../../define/ResDefine';
- import { ResourceManager } from '../resource/ResourceManager';
- export enum SceneId {
- Launch = 'Launch',
- Lobby = 'Lobby',
- Game = 'Game',
- }
- const SceneRes = {
- [SceneId.Lobby]: BUNDLE_ID.Lobby,
- [SceneId.Game]: BUNDLE_ID.Lobby
- }
- export interface ISceneLoader {
- onProgress?: (percent: number) => void;
- }
- export class SceneNavigator {
- private navigating = false;
- constructor(private readonly resLoader: ResourceManager) { }
- async preload(scene: SceneId, loader?: ISceneLoader): Promise<void> {
- const bundleName = SceneRes[scene];
- if (bundleName) {
- await this.resLoader.loadBundle(bundleName);
- }
- return new Promise((resolve, reject) => {
- director.preloadScene(scene, (completedCount: number, totalCount: number, item: any) => {
- if (loader && loader.onProgress) {
- loader.onProgress(completedCount / totalCount);
- }
- }, (error) => {
- if (error) {
- console.log('preload scene error: ', error);
- reject(error);
- return;
- }
- resolve();
- });
- });
- }
- async go(scene: SceneId): Promise<void> {
- if (this.navigating || director.getScene()?.name === scene) return;
- this.navigating = true;
- try {
- const bundleName = SceneRes[scene];
- if (bundleName) {
- await this.resLoader.loadBundle(bundleName);
- }
- await new Promise<void>((resolve, reject) => {
- director.loadScene(scene, (error) => {
- if (error) {
- console.log('load scene error: ', error);
- reject(error);
- return;
- }
- resolve();
- });
- });
- } finally {
- this.navigating = false;
- }
- }
- goToLobby(): Promise<void> {
- return this.go(SceneId.Lobby);
- }
- goToGame(): Promise<void> {
- return this.go(SceneId.Game);
- }
- }
|