d9f556ee6d30e7a017ea181bb7eaf2ce83c7cd98.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. System.register(["cc"], function (_export, _context) {
  2. "use strict";
  3. var _cclegacy, __checkObsolete__, __checkObsoleteInNamespace__, VerbatimEffect, _crd;
  4. function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
  5. _export("VerbatimEffect", void 0);
  6. return {
  7. setters: [function (_cc) {
  8. _cclegacy = _cc.cclegacy;
  9. __checkObsolete__ = _cc.__checkObsolete__;
  10. __checkObsoleteInNamespace__ = _cc.__checkObsoleteInNamespace__;
  11. }],
  12. execute: function () {
  13. _crd = true;
  14. _cclegacy._RF.push({}, "0a3efyhuFtIZ6sQMHFeWv8u", "Verbatim", undefined);
  15. __checkObsolete__(['Label']);
  16. /*
  17. ----------------------------------------------- 基础用法
  18. const typewriter = new VerbatimEffect(this.label, {
  19. speed: 0.1, // 每个字符显示间隔
  20. delay: 1.0, // 开始前的延迟
  21. callbackDelay: 0.5 // 完成回调延迟
  22. });
  23. //添加文字
  24. typewriter.addText("第一段文字")
  25. .addText("第二段文字")
  26. .addText(["第三段文字", "第四段文字"]);
  27. //设置回调
  28. typewriter.onComplete(() => {
  29. Logger.log("所有文字显示完成");
  30. });
  31. //开始播放
  32. typewriter.start();
  33. ----------------------------------------------- 显示数组用法
  34. const verseArr = this.seleteData.verse.split(",");
  35. const typewriter = new VerbatimEffect(this.verseLabel1, {
  36. speed: 0.15,
  37. preserveSpaces: true // 保留空格
  38. });
  39. typewriter.addText(verseArr)
  40. .onTextComplete((text, index) => {
  41. Logger.log(`第${index + 1}句显示完成: ${text}`);
  42. })
  43. .onComplete(() => {
  44. Logger.log("所有诗句显示完成");
  45. })
  46. .start();
  47. ----------------------------------------------- 高阶用法
  48. const typewriter = new VerbatimEffect(this.label);
  49. typewriter.addText("Hello World!")
  50. .addText("This is Typewriter Effect.")
  51. .onChar((char) => {
  52. // 每个字符显示时的音效
  53. AudioManager.playTypingSound();
  54. })
  55. .onTextStart((text, index) => {
  56. Logger.log(`开始显示第${index + 1}段文字: ${text}`);
  57. })
  58. .onTextComplete((text, index) => {
  59. Logger.log(`第${index + 1}段文字显示完成: ${text}`);
  60. })
  61. .onComplete(() => {
  62. Logger.log("全部文字显示完成");
  63. })
  64. .start();
  65. */
  66. /**
  67. * 打字机效果配置选项
  68. */
  69. /**
  70. * 打字机效果类 - 实现文字逐字显示效果
  71. */
  72. _export("VerbatimEffect", VerbatimEffect = class VerbatimEffect {
  73. /**
  74. * 构造函数
  75. * @param label 要显示文字的Label组件
  76. * @param options 配置选项
  77. */
  78. constructor(label, options) {
  79. if (options === void 0) {
  80. options = {};
  81. }
  82. this.label = void 0;
  83. this.textQueue = [];
  84. this.currentIndex = 0;
  85. this.isPlaying = false;
  86. this.options = void 0;
  87. this.onCompleteCallback = null;
  88. this.onCharCallback = null;
  89. this.onTextStartCallback = null;
  90. this.onTextCompleteCallback = null;
  91. this.label = label;
  92. this.options = _extends({
  93. speed: 0.1,
  94. delay: 0,
  95. callbackDelay: 0,
  96. autoStart: true,
  97. preserveSpaces: false
  98. }, options);
  99. }
  100. /**
  101. * 添加要显示的文字
  102. * @param text 文字内容(可以是字符串或字符串数组)
  103. * @return 当前实例(支持链式调用)
  104. */
  105. addText(text) {
  106. if (Array.isArray(text)) {
  107. this.textQueue.push(...text);
  108. } else {
  109. this.textQueue.push(text);
  110. }
  111. return this;
  112. }
  113. /**
  114. * 设置完成回调
  115. * @param callback 所有文字显示完成后的回调
  116. * @return 当前实例(支持链式调用)
  117. */
  118. onComplete(callback) {
  119. this.onCompleteCallback = callback;
  120. return this;
  121. }
  122. /**
  123. * 设置字符显示回调
  124. * @param callback 每个字符显示时的回调
  125. * @return 当前实例(支持链式调用)
  126. */
  127. onChar(callback) {
  128. this.onCharCallback = callback;
  129. return this;
  130. }
  131. /**
  132. * 设置单个文本开始显示回调
  133. * @param callback 单个文本开始显示时的回调
  134. * @return 当前实例(支持链式调用)
  135. */
  136. onTextStart(callback) {
  137. this.onTextStartCallback = callback;
  138. return this;
  139. }
  140. /**
  141. * 设置单个文本显示完成回调
  142. * @param callback 单个文本显示完成时的回调
  143. * @return 当前实例(支持链式调用)
  144. */
  145. onTextComplete(callback) {
  146. this.onTextCompleteCallback = callback;
  147. return this;
  148. }
  149. /**
  150. * 开始播放文字
  151. */
  152. start() {
  153. if (this.isPlaying || this.textQueue.length === 0) return;
  154. this.isPlaying = true;
  155. this.currentIndex = 0;
  156. this.label.node.active = true;
  157. this.label.string = '';
  158. if (this.options.delay && this.options.delay > 0) {
  159. this.label.scheduleOnce(() => this.playNextText(), this.options.delay);
  160. } else {
  161. this.playNextText();
  162. }
  163. }
  164. /**
  165. * 停止播放
  166. */
  167. stop() {
  168. this.isPlaying = false;
  169. this.label.unscheduleAllCallbacks();
  170. }
  171. /**
  172. * 跳过当前文本,立即显示完整内容
  173. */
  174. skipCurrent() {
  175. if (!this.isPlaying) return;
  176. this.label.unscheduleAllCallbacks();
  177. var currentText = this.textQueue[this.currentIndex];
  178. this.label.string = this.options.preserveSpaces ? currentText : currentText.replace(/\s/g, '');
  179. this.handleTextComplete(currentText, this.currentIndex);
  180. }
  181. /**
  182. * 跳过所有,立即显示所有完整内容
  183. */
  184. skipAll() {
  185. if (!this.isPlaying) return;
  186. this.stop();
  187. var fullText = '';
  188. for (var i = this.currentIndex; i < this.textQueue.length; i++) {
  189. fullText += this.options.preserveSpaces ? this.textQueue[i] : this.textQueue[i].replace(/\s/g, '');
  190. }
  191. this.label.string = fullText;
  192. if (this.onCompleteCallback) {
  193. this.executeCallback(this.onCompleteCallback, this.options.callbackDelay);
  194. }
  195. }
  196. /**
  197. * 清空文字队列
  198. */
  199. clear() {
  200. this.stop();
  201. this.textQueue = [];
  202. this.currentIndex = 0;
  203. }
  204. /**
  205. * 播放下一个文本(内部方法)
  206. */
  207. playNextText() {
  208. if (!this.isPlaying || this.currentIndex >= this.textQueue.length) {
  209. this.isPlaying = false;
  210. if (this.onCompleteCallback) {
  211. this.executeCallback(this.onCompleteCallback, this.options.callbackDelay);
  212. }
  213. return;
  214. }
  215. var currentText = this.textQueue[this.currentIndex];
  216. var processedText = this.options.preserveSpaces ? currentText : currentText.replace(/\s/g, '');
  217. var chars = processedText.split('');
  218. var currentPos = 0;
  219. var displayText = ''; //触发文本开始回调
  220. if (this.onTextStartCallback) {
  221. this.onTextStartCallback(currentText, this.currentIndex);
  222. }
  223. var updateFunc = () => {
  224. if (!this.isPlaying) return;
  225. var char = chars[currentPos];
  226. displayText += char;
  227. this.label.string = displayText; //触发字符回调
  228. if (this.onCharCallback) {
  229. this.onCharCallback(char);
  230. }
  231. if (++currentPos >= chars.length) {
  232. this.label.unschedule(updateFunc);
  233. this.handleTextComplete(currentText, this.currentIndex++);
  234. }
  235. };
  236. this.label.schedule(updateFunc, this.options.speed, chars.length - 1, 0);
  237. }
  238. /**
  239. * 处理文本完成(内部方法)
  240. */
  241. handleTextComplete(text, index) {
  242. //触发文本完成回调
  243. if (this.onTextCompleteCallback) {
  244. this.onTextCompleteCallback(text, index);
  245. } //播放下一个文本
  246. this.playNextText();
  247. }
  248. /**
  249. * 执行回调(带延迟)
  250. */
  251. executeCallback(callback, delay) {
  252. if (delay === void 0) {
  253. delay = 0;
  254. }
  255. if (delay && delay > 0) {
  256. this.label.scheduleOnce(() => callback(), delay);
  257. } else {
  258. callback();
  259. }
  260. }
  261. });
  262. _cclegacy._RF.pop();
  263. _crd = false;
  264. }
  265. };
  266. });
  267. //# sourceMappingURL=d9f556ee6d30e7a017ea181bb7eaf2ce83c7cd98.js.map