Start.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import {
  2. _decorator,
  3. assetManager,
  4. Component,
  5. director,
  6. game,
  7. Label,
  8. Prefab,
  9. Node,
  10. profiler,
  11. Color,
  12. } from "cc";
  13. import { GameUILayers, GameUILayerNames } from "../scripts/GameUILayers";
  14. import { ModuleDef } from "../scripts/ModuleDef";
  15. import { SceneDef } from "../scripts/SceneDef";
  16. import { PREVIEW } from "cc/env";
  17. // 扩展Window接口以支持预览调试
  18. declare global {
  19. interface Window {
  20. __PREVIEW_DEBUG__?: boolean;
  21. __SOURCE_MAPS_ENABLED__?: boolean;
  22. }
  23. }
  24. const tempColor = new Color();
  25. const { ccclass, property } = _decorator;
  26. // ========== config begin =================
  27. //the first scene after preloading completes.
  28. const _FPS = 61;
  29. const _defaultModule = ModuleDef.BASIC;
  30. const _firstScene = SceneDef.LOBBY;
  31. // const _firstScene = SceneDef.LOGIN;
  32. const _preloadBundles = [ModuleDef.BASIC, ModuleDef.BALL];
  33. const _preloadScenes = [];
  34. const _preloadRes = [
  35. // { bundle: ModuleDef.BASIC, url: "ui_alert/UI_Alert", type: "prefab" },
  36. // { bundle: ModuleDef.BASIC, url: "ui_waiting/UI_Waiting", type: "prefab" },
  37. // { bundle: ModuleDef.BASIC, url: "ui_login/ui_login", type: "prefab" },
  38. { bundle: ModuleDef.BALL, url: "ui_lobby/lobby_new", type: "prefab" },
  39. { bundle: ModuleDef.BALL, url: "ui_lobby/lobby_new", type: "prefab" },
  40. { bundle: ModuleDef.BALL, url: "ui_lobby/lobby_new", type: "prefab" },
  41. ];
  42. // ========= config end =====================
  43. if (_preloadScenes.indexOf(_firstScene) == -1) {
  44. _preloadScenes.push(_firstScene);
  45. }
  46. for (let i = 0; i < _preloadScenes.length; ++i) {
  47. let sceneInfo = _preloadScenes[i];
  48. let idx = _preloadBundles.indexOf(sceneInfo.bundle);
  49. if (idx == -1) {
  50. _preloadBundles.push(sceneInfo.bundle);
  51. }
  52. _preloadRes.push({
  53. bundle: sceneInfo.bundle,
  54. url: sceneInfo.name,
  55. type: "scene",
  56. });
  57. }
  58. const _loadingText = ["Loading.", "Loading..", "Loading..."];
  59. const _totalNum = _preloadBundles.length + _preloadRes.length;
  60. @ccclass("Start")
  61. export class Start extends Component {
  62. @property(Label)
  63. txtLoading: Label;
  64. @property(Prefab)
  65. uiCanvasPrefab: Prefab;
  66. @property(Node)
  67. loadingBar: Node;
  68. @property(Label) lblTapToContinue: Label;
  69. private _percent: string = "";
  70. private _numCurrentLoaded = 0;
  71. start() {
  72. /**
  73. * @en display stats in preview mode
  74. * @zh 预览调试时,默认显示性能统计面板
  75. */
  76. if (PREVIEW) {
  77. profiler.showStats();
  78. // Enable better debugging in preview mode
  79. console.log("Preview mode enabled with source maps");
  80. // Override error handling for better stack traces
  81. window.addEventListener('error', function(event) {
  82. console.error('Preview Error:', event.error);
  83. console.error('Stack:', event.error?.stack);
  84. });
  85. // Enable source map debugging
  86. if (window.__PREVIEW_DEBUG__) {
  87. console.log("Preview debug mode active");
  88. }
  89. }
  90. tgx.ModuleContext.setDefaultModule(_defaultModule);
  91. this.lblTapToContinue.node.active = false;
  92. game.frameRate = _FPS;
  93. tgx.UIMgr.inst.setup(
  94. this.uiCanvasPrefab,
  95. GameUILayers.NUM,
  96. GameUILayerNames
  97. );
  98. this.preloadBundle(0);
  99. }
  100. onResLoaded() {
  101. this._numCurrentLoaded++;
  102. this._percent = ~~((this._numCurrentLoaded / _totalNum) * 100) + "%";
  103. }
  104. preloadBundle(idx: number) {
  105. assetManager.loadBundle(_preloadBundles[idx], null, (err, bundle) => {
  106. console.log("module:<" + _preloadBundles[idx] + ">loaded.");
  107. idx++;
  108. this.onResLoaded();
  109. if (idx < _preloadBundles.length) {
  110. this.preloadBundle(idx);
  111. } else {
  112. this.preloadRes(0);
  113. }
  114. });
  115. }
  116. preloadRes(idx: number) {
  117. let res = _preloadRes[idx];
  118. let bundle = assetManager.getBundle(res.bundle);
  119. let onComplete = () => {
  120. idx++;
  121. this.onResLoaded();
  122. if (idx < _preloadRes.length) {
  123. this.preloadRes(idx);
  124. } else {
  125. this.onPreloadingComplete();
  126. }
  127. };
  128. if (bundle) {
  129. if (res.type == "prefab") {
  130. bundle.preload(res.url, Prefab, onComplete);
  131. } else if (res.type == "scene") {
  132. bundle.preloadScene(res.url, onComplete);
  133. }
  134. }
  135. }
  136. private _isPreloadingComplete = false;
  137. onPreloadingComplete() {
  138. this._isPreloadingComplete = true;
  139. this.lblTapToContinue.node.active = true;
  140. this.loadingBar.parent.active = false;
  141. this.onBtnBgClicked();
  142. }
  143. onBtnBgClicked() {
  144. if (!this._isPreloadingComplete) {
  145. return;
  146. }
  147. director.loadScene(_firstScene.name);
  148. }
  149. update(deltaTime: number) {
  150. if (this.loadingBar.parent.active) {
  151. if (this._percent) {
  152. this.txtLoading.string = "Loading..." + this._percent;
  153. } else {
  154. let idx = Math.floor(game.totalTime / 1000) % 3;
  155. this.txtLoading.string = _loadingText[idx];
  156. }
  157. this.loadingBar.setScale(this._numCurrentLoaded / _totalNum, 1, 1);
  158. }
  159. if (this.lblTapToContinue.node.active) {
  160. tempColor.set(this.lblTapToContinue.color);
  161. let value = Math.sin(Date.now() / 50 / Math.PI);
  162. value = value * 0.5 + 0.5;
  163. tempColor.a = value * 255;
  164. this.lblTapToContinue.color = tempColor;
  165. }
  166. }
  167. }