LaunchScreen.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import { _decorator, Component, Node, director, assetManager, ProgressBar, Label, Sprite, SpriteFrame, resources } from 'cc';
  2. const { ccclass, property } = _decorator;
  3. // 微信小游戏API类型声明
  4. declare global {
  5. interface Window {
  6. wx?: {
  7. loadSubpackage?: (options: {
  8. name: string;
  9. success?: () => void;
  10. fail?: (err: any) => void;
  11. }) => any;
  12. };
  13. }
  14. const wx: {
  15. loadSubpackage?: (options: {
  16. name: string;
  17. success?: () => void;
  18. fail?: (err: any) => void;
  19. }) => any;
  20. } | undefined;
  21. }
  22. @ccclass('LaunchScreen')
  23. export class LaunchScreen extends Component {
  24. @property(ProgressBar)
  25. progressBar: ProgressBar = null;
  26. @property(Label)
  27. progressLabel: Label = null;
  28. @property(Sprite)
  29. backgroundSprite: Sprite = null;
  30. @property(SpriteFrame)
  31. launchBackground: SpriteFrame = null;
  32. private totalAssets = 0;
  33. private loadedAssets = 0;
  34. start() {
  35. console.log('[LaunchScreen] 启动页开始初始化');
  36. // 设置启动页背景
  37. this.setupBackground();
  38. // 开始预加载游戏资源
  39. this.preloadGameAssets();
  40. }
  41. /**
  42. * 设置启动页背景
  43. */
  44. private setupBackground() {
  45. if (this.backgroundSprite && this.launchBackground) {
  46. this.backgroundSprite.spriteFrame = this.launchBackground;
  47. console.log('[LaunchScreen] 启动页背景设置完成');
  48. }
  49. }
  50. /**
  51. * 预加载游戏资源
  52. */
  53. private async preloadGameAssets() {
  54. try {
  55. console.log('[LaunchScreen] 开始预加载游戏资源');
  56. // 更新进度显示
  57. this.updateProgress(0, '正在加载游戏资源...');
  58. // 直接预加载GameLevel场景(不使用分包)
  59. await this.preloadGameLevelScene();
  60. // 预加载完成,跳转到游戏场景
  61. this.loadGameScene();
  62. } catch (error) {
  63. console.error('[LaunchScreen] 资源预加载失败:', error);
  64. this.updateProgress(0, '资源加载失败,请重试');
  65. }
  66. }
  67. /**
  68. * 直接预加载GameLevel场景
  69. */
  70. private preloadGameLevelScene(): Promise<void> {
  71. return new Promise<void>((resolve, reject) => {
  72. console.log('[LaunchScreen] 开始预加载GameLevel场景');
  73. // 直接预加载场景
  74. director.preloadScene('GameLevel', (finished: number, total: number) => {
  75. const progress = finished / total;
  76. this.updateProgress(progress * 100, `正在加载游戏场景... ${Math.floor(progress * 100)}%`);
  77. }, (err) => {
  78. if (err) {
  79. console.error('[LaunchScreen] GameLevel场景预加载失败:', err);
  80. // 预加载失败时,仍然尝试直接跳转(可能场景存在但预加载失败)
  81. console.log('[LaunchScreen] 预加载失败,但仍将尝试直接加载场景');
  82. this.updateProgress(100, '准备进入游戏...');
  83. resolve();
  84. return;
  85. }
  86. console.log('[LaunchScreen] GameLevel场景预加载完成');
  87. this.updateProgress(100, '加载完成!');
  88. resolve();
  89. });
  90. });
  91. }
  92. /**
  93. * 更新加载进度
  94. */
  95. private updateProgress(progress: number, message: string) {
  96. if (this.progressBar) {
  97. this.progressBar.progress = progress / 100;
  98. }
  99. if (this.progressLabel) {
  100. this.progressLabel.string = message;
  101. }
  102. console.log(`[LaunchScreen] ${message} (${progress.toFixed(1)}%)`);
  103. }
  104. /**
  105. * 跳转到游戏场景
  106. */
  107. private loadGameScene() {
  108. console.log('[LaunchScreen] 准备跳转到GameLevel场景');
  109. // 延迟一秒后跳转,让用户看到加载完成的提示
  110. this.scheduleOnce(() => {
  111. // 直接加载GameLevel场景
  112. director.loadScene('GameLevel', (err) => {
  113. if (err) {
  114. console.error('[LaunchScreen] GameLevel场景加载失败:', err);
  115. console.log('[LaunchScreen] 尝试降级方案:停留在启动页面');
  116. this.updateProgress(0, 'GameLevel场景不存在,请检查场景配置');
  117. // 提供重试按钮或其他交互方式
  118. this.scheduleOnce(() => {
  119. this.updateProgress(0, '点击屏幕重试或检查场景配置');
  120. }, 2.0);
  121. return;
  122. }
  123. console.log('[LaunchScreen] 成功切换到GameLevel场景');
  124. });
  125. }, 1.0);
  126. }
  127. }