|
|
@@ -0,0 +1,215 @@
|
|
|
+import { _decorator, Component, Node, director, assetManager, ProgressBar, Label, Sprite, SpriteFrame, resources } from 'cc';
|
|
|
+const { ccclass, property } = _decorator;
|
|
|
+
|
|
|
+@ccclass('LaunchScreen')
|
|
|
+export class LaunchScreen extends Component {
|
|
|
+ @property(ProgressBar)
|
|
|
+ progressBar: ProgressBar = null;
|
|
|
+
|
|
|
+ @property(Label)
|
|
|
+ progressLabel: Label = null;
|
|
|
+
|
|
|
+ @property(Sprite)
|
|
|
+ backgroundSprite: Sprite = null;
|
|
|
+
|
|
|
+ @property(SpriteFrame)
|
|
|
+ launchBackground: SpriteFrame = null;
|
|
|
+
|
|
|
+ private totalAssets = 0;
|
|
|
+ private loadedAssets = 0;
|
|
|
+
|
|
|
+ start() {
|
|
|
+ console.log('[LaunchScreen] 启动页开始初始化');
|
|
|
+
|
|
|
+ // 设置启动页背景
|
|
|
+ this.setupBackground();
|
|
|
+
|
|
|
+ // 开始预加载游戏资源
|
|
|
+ this.preloadGameAssets();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置启动页背景
|
|
|
+ */
|
|
|
+ private setupBackground() {
|
|
|
+ if (this.backgroundSprite && this.launchBackground) {
|
|
|
+ this.backgroundSprite.spriteFrame = this.launchBackground;
|
|
|
+ console.log('[LaunchScreen] 启动页背景设置完成');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 预加载游戏资源
|
|
|
+ */
|
|
|
+ private async preloadGameAssets() {
|
|
|
+ try {
|
|
|
+ console.log('[LaunchScreen] 开始预加载游戏资源');
|
|
|
+
|
|
|
+ // 更新进度显示
|
|
|
+ this.updateProgress(0, '正在加载游戏资源...');
|
|
|
+
|
|
|
+ // 预加载game-level分包
|
|
|
+ await this.loadSubpackage('game-level');
|
|
|
+
|
|
|
+ // 预加载完成,跳转到游戏场景
|
|
|
+ this.loadGameScene();
|
|
|
+
|
|
|
+ } catch (error) {
|
|
|
+ console.error('[LaunchScreen] 资源预加载失败:', error);
|
|
|
+ this.updateProgress(0, '资源加载失败,请重试');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载分包
|
|
|
+ */
|
|
|
+ private loadSubpackage(bundleName: string): Promise<void> {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ console.log(`[LaunchScreen] 开始加载分包: ${bundleName}`);
|
|
|
+
|
|
|
+ // 检查是否在微信小游戏环境
|
|
|
+ if (typeof wx !== 'undefined' && wx && wx.loadSubpackage) {
|
|
|
+ // 微信小游戏分包加载
|
|
|
+ const loadTask = wx.loadSubpackage({
|
|
|
+ name: bundleName,
|
|
|
+ success: () => {
|
|
|
+ console.log(`[LaunchScreen] 微信分包 ${bundleName} 加载成功`);
|
|
|
+ // 分包加载成功后,再加载bundle
|
|
|
+ this.loadBundleAfterSubpackage(bundleName, resolve, reject);
|
|
|
+ },
|
|
|
+ fail: (err) => {
|
|
|
+ console.error(`[LaunchScreen] 微信分包 ${bundleName} 加载失败:`, err);
|
|
|
+ // 微信分包加载失败时,尝试直接加载bundle作为降级方案
|
|
|
+ console.log(`[LaunchScreen] 尝试直接加载bundle作为降级方案`);
|
|
|
+ this.loadBundleAfterSubpackage(bundleName, resolve, reject);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 监听分包加载进度
|
|
|
+ if (loadTask && loadTask.onProgressUpdate) {
|
|
|
+ loadTask.onProgressUpdate((res) => {
|
|
|
+ const progress = res.progress || 0;
|
|
|
+ this.updateProgress(progress, `正在下载分包... ${progress}%`);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 非微信环境,直接加载bundle
|
|
|
+ console.log(`[LaunchScreen] 非微信环境,直接加载bundle`);
|
|
|
+ this.loadBundleAfterSubpackage(bundleName, resolve, reject);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分包下载完成后加载bundle
|
|
|
+ */
|
|
|
+ private loadBundleAfterSubpackage(bundleName: string, resolve: Function, reject: Function) {
|
|
|
+ assetManager.loadBundle(bundleName, (err, bundle) => {
|
|
|
+ if (err) {
|
|
|
+ console.error(`[LaunchScreen] Bundle ${bundleName} 加载失败:`, err);
|
|
|
+ // 如果bundle加载失败,尝试跳过分包直接进入主场景
|
|
|
+ console.log(`[LaunchScreen] Bundle加载失败,尝试跳过分包加载`);
|
|
|
+ this.skipSubpackageAndLoadMainScene(resolve, reject);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log(`[LaunchScreen] Bundle ${bundleName} 加载成功`);
|
|
|
+
|
|
|
+ // 预加载分包中的场景
|
|
|
+ bundle.preloadScene('GameLevel', (finished: number, total: number) => {
|
|
|
+ const progress = finished / total;
|
|
|
+ this.updateProgress(progress * 100, `正在加载游戏场景... ${Math.floor(progress * 100)}%`);
|
|
|
+ }, (err) => {
|
|
|
+ if (err) {
|
|
|
+ console.error('[LaunchScreen] GameLevel场景预加载失败:', err);
|
|
|
+ // 场景预加载失败时,也尝试跳过分包
|
|
|
+ this.skipSubpackageAndLoadMainScene(resolve, reject);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('[LaunchScreen] GameLevel场景预加载完成');
|
|
|
+ this.updateProgress(100, '加载完成!');
|
|
|
+ resolve();
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新加载进度
|
|
|
+ */
|
|
|
+ private updateProgress(progress: number, message: string) {
|
|
|
+ if (this.progressBar) {
|
|
|
+ this.progressBar.progress = progress / 100;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.progressLabel) {
|
|
|
+ this.progressLabel.string = message;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log(`[LaunchScreen] ${message} (${progress.toFixed(1)}%)`);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 跳过分包加载,直接进入主场景的降级方案
|
|
|
+ */
|
|
|
+ private skipSubpackageAndLoadMainScene(resolve: Function, reject: Function) {
|
|
|
+ console.log('[LaunchScreen] 执行降级方案:跳过分包,尝试加载主场景');
|
|
|
+
|
|
|
+ // 尝试加载主场景(如果存在的话)
|
|
|
+ director.loadScene('First', (err) => {
|
|
|
+ if (err) {
|
|
|
+ console.error('[LaunchScreen] 主场景加载也失败:', err);
|
|
|
+ this.updateProgress(0, '游戏加载失败,请刷新重试');
|
|
|
+ reject(err);
|
|
|
+ } else {
|
|
|
+ console.log('[LaunchScreen] 成功加载主场景作为降级方案');
|
|
|
+ this.updateProgress(100, '加载完成(降级模式)');
|
|
|
+ resolve();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 跳转到游戏场景
|
|
|
+ */
|
|
|
+ private loadGameScene() {
|
|
|
+ console.log('[LaunchScreen] 准备跳转到GameLevel场景');
|
|
|
+
|
|
|
+ // 延迟一秒后跳转,让用户看到加载完成的提示
|
|
|
+ this.scheduleOnce(() => {
|
|
|
+ // 使用分包中的场景
|
|
|
+ const bundle = assetManager.getBundle('game-level');
|
|
|
+ if (bundle) {
|
|
|
+ bundle.loadScene('GameLevel', (err, scene) => {
|
|
|
+ if (err) {
|
|
|
+ console.error('[LaunchScreen] GameLevel场景加载失败:', err);
|
|
|
+ // 如果分包场景加载失败,尝试加载主场景
|
|
|
+ this.loadFallbackScene();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('[LaunchScreen] 正在切换到GameLevel场景');
|
|
|
+ director.runScene(scene);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ console.error('[LaunchScreen] game-level分包未找到,尝试加载主场景');
|
|
|
+ this.loadFallbackScene();
|
|
|
+ }
|
|
|
+ }, 1.0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载降级场景
|
|
|
+ */
|
|
|
+ private loadFallbackScene() {
|
|
|
+ console.log('[LaunchScreen] 尝试加载降级场景');
|
|
|
+ director.loadScene('First', (err) => {
|
|
|
+ if (err) {
|
|
|
+ console.error('[LaunchScreen] 降级场景加载失败:', err);
|
|
|
+ this.updateProgress(0, '游戏启动失败,请刷新页面重试');
|
|
|
+ } else {
|
|
|
+ console.log('[LaunchScreen] 成功加载降级场景');
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|