找回密码
 注册用户
查看: 282|回复: 0

[RMMZ] 【汉化】【含MV】视觉小说风格文章继续图标

[复制链接]

88

主题

7

回帖

1277

积分

资深会员

积分
1277
发表于 2024-6-1 19:16:43 | 显示全部楼层 |阅读模式
原地址:【RPGツクールMZ・MV】ノベルゲーム風改行カーソルプラグイン | ルルの教会 (nine-yusha.com)


预览: cjyxf-zpbsz.gif

MZ 脚本:

  1. //=============================================================================
  2. // RPGツクールMZ - LL_GalgePauseSign.js v1.0.2
  3. //-----------------------------------------------------------------------------
  4. // ルルの教会 (Lulu's Church)
  5. // https://nine-yusha.com/
  6. //
  7. // URL below for license details.
  8. // https://nine-yusha.com/plugin/
  9. //=============================================================================

  10. /*:
  11. * @target MZ
  12. * @plugindesc 视觉小说风格文章继续图标
  13. * 汉化 by 烁灵 更多脚本请访问 www.hknmtt.com
  14. * @author ルルの教会
  15. * @url https://nine-yusha.com/plugin-galgepausesign/
  16. *
  17. * @help LL_GalgePauseSign.js
  18. *
  19. * 展示视觉小说风格的文章继续图标
  20. * 只需要 1 张继续图标图片
  21. * 不需要为动画准备图片
  22. *
  23. * 没有插件指令
  24. *
  25. * 利用規約:
  26. *   ・著作権表記は必要ございません。
  27. *   ・利用するにあたり報告の必要は特にございません。
  28. *   ・商用・非商用問いません。
  29. *   ・R18作品にも使用制限はありません。
  30. *   ・ゲームに合わせて自由に改変していただいて問題ございません。
  31. *   ・プラグイン素材としての再配布(改変後含む)は禁止させていただきます。
  32. *
  33. * 作者: ルルの教会
  34. * 作成日: 2021/8/15
  35. *
  36. * @param imageName
  37. * @text 图片文件名
  38. * @desc 文章继续图标的文件名,放在 img/system 文件夹
  39. * 推荐使用 24px~36px 的正方形尺寸
  40. * @dir img/system
  41. * @type file
  42. * @require 1
  43. *
  44. * @param animation
  45. * @text 动画
  46. * @desc 图标动画
  47. * @type select
  48. * @default vertical
  49. * @option 无
  50. * @value none
  51. * @option 上下移动
  52. * @value vertical
  53. * @option 左右移动
  54. * @value horizontal
  55. * @option 闪烁
  56. * @value blinking
  57. * @option 放大缩小
  58. * @value zoom
  59. * @option 旋转
  60. * @value rotation
  61. * @option 跳跃
  62. * @value jumping
  63. * @option 流星
  64. * @value shootingstar
  65. *
  66. * @param positionType
  67. * @text 位置类型
  68. * @desc 图标位置设置
  69. * @type select
  70. * @default centerBottom
  71. * @option 左下
  72. * @value leftBottom
  73. * @option 中心
  74. * @value centerBottom
  75. * @option 右下
  76. * @value rightBottom
  77. * @option 文章末尾
  78. * @value textEnd
  79. *
  80. * @param positionX
  81. * @text X 坐标
  82. * @desc X 坐标偏移值。(初始: 0)
  83. * 正数向右移动,负数向左移动
  84. * @default 0
  85. * @min -2000
  86. * @max 2000
  87. * @type number
  88. *
  89. * @param positionY
  90. * @text Y坐标
  91. * @desc Y 坐标偏移值。(初始: 0)
  92. * 正数向下移动,负数向上移动
  93. * @default 0
  94. * @min -2000
  95. * @max 2000
  96. * @type number
  97. */

  98. (() => {
  99.     "use strict";
  100.     const pluginName = "LL_GalgePauseSign";

  101.     const parameters = PluginManager.parameters(pluginName);
  102.     const animation = String(parameters["animation"] || "vertical");
  103.     const imageName = String(parameters["imageName"] || "");
  104.     const positionType = String(parameters["positionType"] || "centerBottom");
  105.     const positionX = Number(parameters["positionX"] || 0);
  106.     const positionY = Number(parameters["positionY"] || 0);


  107.     const _Window_Message_startPause = Window_Message.prototype.startPause;
  108.     Window_Message.prototype.startPause = function() {
  109.         _Window_Message_startPause.apply(this, arguments);

  110.         this._refreshPauseSign();
  111.     };

  112.     Window_Message.prototype._refreshPauseSign = function() {
  113.         const sx = 144;
  114.         const sy = 96;
  115.         const p = 24;

  116.         // カーソル画像読み込み
  117.         if (imageName) {
  118.             this._pauseSignSprite.bitmap = ImageManager.loadSystem(imageName);
  119.         } else {
  120.             this._pauseSignSprite.bitmap = this._windowskin;
  121.             // MZのみカーソル画像の上部に謎の見切れ線?が入るので、縦を1px縮小
  122.             // this._pauseSignSprite.setFrame(sx, sy, p, p);
  123.             this._pauseSignSprite.setFrame(sx, sy + 1, p, p - 1);
  124.         }

  125.         this._pauseSignSprite.anchor.x = 0.5;
  126.         this._pauseSignSprite.anchor.y = 0.5;

  127.         // 画像が読み込まれたあとに実行
  128.         this._pauseSignSprite.bitmap.addLoadListener(function() {
  129.             switch (positionType) {
  130.                 case "leftBottom":
  131.                     this._pauseSignSprite.move((this._pauseSignSprite.width / 2) + positionX + this.padding, this._height - (this._pauseSignSprite.height / 2) + positionY - (this.padding / 2));
  132.                     break;
  133.                 case "centerBottom":
  134.                     this._pauseSignSprite.move((this._width / 2) + positionX, this._height - (this._pauseSignSprite.height / 2) + positionY);
  135.                     break;
  136.                 case "rightBottom":
  137.                     this._pauseSignSprite.move(this._width - (this._pauseSignSprite.width / 2) + positionX - this.padding, this._height - (this._pauseSignSprite.height / 2) + positionY - (this.padding / 2));
  138.                     break;
  139.                 case "textEnd":
  140.                     if (this._textState) {
  141.                         let textStateCalcY = this._textState.outputHeight - this._textState.height + this._textState.height;
  142.                         if (textStateCalcY < this._textState.height) textStateCalcY = this._textState.height;
  143.                         this._pauseSignSprite.move(this._textState.x + (this._pauseSignSprite.width / 2) + this.padding + positionX, textStateCalcY + positionY);
  144.                     } else {
  145.                         this._pauseSignSprite.move((this._width / 2) + positionX, this._height - (this._pauseSignSprite.height / 2) + positionY - (this.padding / 2));
  146.                     }
  147.                     break;
  148.             }
  149.         }.bind(this));

  150.         this._pauseSignSprite.alpha = 0;
  151.         this._pauseSignSprite.animationCount = 0;

  152.     };

  153.     Window_Message.prototype._updatePauseSign = function() {
  154.         const sprite = this._pauseSignSprite;
  155.         if (!this.pause) {
  156.             sprite.alpha = 0;
  157.         }
  158.         sprite.visible = this.isOpen();
  159.     };

  160.     const _Window_Message_update = Window_Message.prototype.update;
  161.     Window_Message.prototype.update = function() {
  162.         _Window_Message_update.apply(this, arguments);

  163.         // カーソルアニメーション
  164.         if (this.pause && this._pauseSignSprite) {
  165.             this._animationPauseSign();
  166.         }
  167.     };

  168.     Window_Message.prototype._animationPauseSign = function() {
  169.         const sprite = this._pauseSignSprite;
  170.         switch (animation) {
  171.             case "vertical":  // 上下
  172.                 if (sprite.animationCount === 0) {
  173.                     sprite.opacity = 255;
  174.                     sprite.animationCount += 1;
  175.                 } else if (sprite.animationCount < 31) {
  176.                     sprite.y += 0.25;
  177.                     sprite.animationCount += 1;
  178.                 } else if (sprite.animationCount < 61) {
  179.                     sprite.y -= 0.25;
  180.                     sprite.animationCount += 1;
  181.                 } else if (this._pauseSignSprite.animationCount === 61) {
  182.                     sprite.animationCount = 0;
  183.                 }
  184.                 break;
  185.             case "horizontal":  // 左右
  186.                 if (sprite.animationCount === 0) {
  187.                     sprite.opacity = 255;
  188.                     sprite.animationCount += 1;
  189.                 } else if (sprite.animationCount < 31) {
  190.                     sprite.x += 0.25;
  191.                     sprite.animationCount += 1;
  192.                 } else if (sprite.animationCount < 61) {
  193.                     sprite.x -= 0.25;
  194.                     sprite.animationCount += 1;
  195.                 } else if (this._pauseSignSprite.animationCount === 61) {
  196.                     sprite.animationCount = 0;
  197.                 }
  198.                 break;
  199.             case "blinking":  // 点滅
  200.                 if (sprite.animationCount === 0) {
  201.                     sprite.opacity = 255;
  202.                     sprite.animationCount += 1;
  203.                 } else if (sprite.animationCount < 31) {
  204.                     sprite.opacity -= 255 / 30;
  205.                     sprite.animationCount += 1;
  206.                 } else if (sprite.animationCount < 61) {
  207.                     sprite.opacity += 255 / 30;
  208.                     sprite.animationCount += 1;
  209.                 } else if (this._pauseSignSprite.animationCount === 61) {
  210.                     sprite.animationCount = 0;
  211.                 }
  212.                 break;
  213.             case "zoom":  // ズーム
  214.                 if (sprite.animationCount === 0) {
  215.                     sprite.opacity = 255;
  216.                     sprite.scale.x = 1;
  217.                     sprite.scale.y = 1;
  218.                     sprite.animationCount += 1;
  219.                 } else if (sprite.animationCount < 31) {
  220.                     sprite.scale.x += 0.5 / 30;
  221.                     sprite.scale.y += 0.5 / 30;
  222.                     sprite.animationCount += 1;
  223.                 } else if (sprite.animationCount < 61) {
  224.                     sprite.scale.x -= 0.5 / 30;
  225.                     sprite.scale.y -= 0.5 / 30;
  226.                     sprite.animationCount += 1;
  227.                 } else if (this._pauseSignSprite.animationCount === 61) {
  228.                     sprite.animationCount = 0;
  229.                 }
  230.                 break;
  231.             case "rotation":  // 回転
  232.                 sprite.opacity = 255;
  233.                 sprite.rotation += 1 / 30;
  234.                 break;
  235.             case "jumping":  // ジャンプ
  236.                 if (sprite.animationCount === 0) {
  237.                     sprite.opacity = 255;
  238.                     sprite.animationCount += 1;
  239.                 } else if (sprite.animationCount < 16) {
  240.                     sprite.y -= 0.5;
  241.                     sprite.animationCount += 1;
  242.                 } else if (sprite.animationCount < 31) {
  243.                     sprite.y += 0.5;
  244.                     sprite.animationCount += 1;
  245.                 } else if (sprite.animationCount < 61) {
  246.                     sprite.animationCount += 1;
  247.                 } else if (this._pauseSignSprite.animationCount === 61) {
  248.                     sprite.animationCount = 0;
  249.                 }
  250.                 break;
  251.             case "shootingstar":  // 流れ星
  252.                 if (sprite.animationCount === 0) {
  253.                     sprite.scale.x = 0;
  254.                     sprite.scale.y = 0;
  255.                     sprite.rotation = 1.5;

  256.                     sprite.animationCount += 1;
  257.                 } else if (sprite.animationCount < 31) {
  258.                     sprite.opacity = 255;
  259.                     sprite.scale.x += 1 / 30;
  260.                     sprite.scale.y += 1 / 30;
  261.                     sprite.rotation -= 1.5 / 30;

  262.                     sprite.animationCount += 1;
  263.                 } else if (sprite.animationCount < 61) {
  264.                     sprite.opacity -= 10;
  265.                     sprite.animationCount += 1;
  266.                 } else if (this._pauseSignSprite.animationCount === 61) {
  267.                     sprite.animationCount = 0;
  268.                 }
  269.                 break;
  270.             default:
  271.                 sprite.opacity = 255;
  272.         }
  273.     };
  274. })();
复制代码


MV 脚本:
  1. //=============================================================================
  2. // RPGツクールMV - LL_GalgePauseSignMV.js v1.0.2
  3. //-----------------------------------------------------------------------------
  4. // ルルの教会 (Lulu's Church)
  5. // https://nine-yusha.com/
  6. //
  7. // URL below for license details.
  8. // https://nine-yusha.com/plugin/
  9. //=============================================================================

  10. /*:
  11. * @target MV
  12. * @plugindesc 视觉小说风格文章继续图标
  13. * 汉化 by 烁灵 更多脚本请访问 www.hknmtt.com
  14. * @author ルルの教会
  15. * @url https://nine-yusha.com/plugin-galgepausesign/
  16. *
  17. * @help LL_GalgePauseSignMV.js
  18. *
  19. * 展示视觉小说风格的文章继续图标
  20. * 只需要 1 张继续图标图片
  21. * 不需要为动画准备图片
  22. *
  23. * 没有插件指令
  24. *
  25. * 利用規約:
  26. *   ・著作権表記は必要ございません。
  27. *   ・利用するにあたり報告の必要は特にございません。
  28. *   ・商用・非商用問いません。
  29. *   ・R18作品にも使用制限はありません。
  30. *   ・ゲームに合わせて自由に改変していただいて問題ございません。
  31. *   ・プラグイン素材としての再配布(改変後含む)は禁止させていただきます。
  32. *
  33. * 作者: ルルの教会
  34. * 作成日: 2021/8/15
  35. *
  36. * @param imageName
  37. * @text 图片文件名
  38. * @desc 文章继续图标的文件名,放在 img/system 文件夹
  39. * 推荐使用 24px~36px 的正方形尺寸
  40. * @dir img/system
  41. * @type file
  42. * @require 1
  43. *
  44. * @param animation
  45. * @text 动画
  46. * @desc 图标动画
  47. * @type select
  48. * @default vertical
  49. * @option 无
  50. * @value none
  51. * @option 上下移动
  52. * @value vertical
  53. * @option 左右移动
  54. * @value horizontal
  55. * @option 闪烁
  56. * @value blinking
  57. * @option 放大缩小
  58. * @value zoom
  59. * @option 旋转
  60. * @value rotation
  61. * @option 跳跃
  62. * @value jumping
  63. * @option 流星
  64. * @value shootingstar
  65. *
  66. * @param positionType
  67. * @text 位置类型
  68. * @desc 图标位置设置
  69. * @type select
  70. * @default centerBottom
  71. * @option 左下
  72. * @value leftBottom
  73. * @option 中心
  74. * @value centerBottom
  75. * @option 右下
  76. * @value rightBottom
  77. * @option 文章末尾
  78. * @value textEnd
  79. *
  80. * @param positionX
  81. * @text X 坐标
  82. * @desc X 坐标偏移值。(初始: 0)
  83. * 正数向右移动,负数向左移动
  84. * @default 0
  85. * @min -2000
  86. * @max 2000
  87. * @type number
  88. *
  89. * @param positionY
  90. * @text Y坐标
  91. * @desc Y 坐标偏移值。(初始: 0)
  92. * 正数向下移动,负数向上移动
  93. * @default 0
  94. * @min -2000
  95. * @max 2000
  96. * @type number
  97. */

  98. (function() {
  99.     "use strict";
  100.     var pluginName = "LL_GalgePauseSignMV";

  101.     var parameters = PluginManager.parameters(pluginName);
  102.     var animation = String(parameters["animation"] || "vertical");
  103.     var imageName = String(parameters["imageName"] || "");
  104.     var positionType = String(parameters["positionType"] || "centerBottom");
  105.     var positionX = Number(parameters["positionX"] || 0);
  106.     var positionY = Number(parameters["positionY"] || 0);


  107.     var _Window_Message_startPause = Window_Message.prototype.startPause;
  108.     Window_Message.prototype.startPause = function() {
  109.         _Window_Message_startPause.apply(this, arguments);

  110.         this._refreshPauseSign();
  111.     };

  112.     Window_Message.prototype._refreshPauseSign = function() {
  113.         var sx = 144;
  114.         var sy = 96;
  115.         var p = 24;

  116.         // カーソル画像読み込み
  117.         if (imageName) {
  118.             this._windowPauseSignSprite.bitmap = ImageManager.loadSystem(imageName);
  119.         } else {
  120.             this._windowPauseSignSprite.bitmap = this._windowskin;
  121.             this._windowPauseSignSprite.setFrame(sx, sy, p, p);
  122.         }

  123.         this._windowPauseSignSprite.anchor.x = 0.5;
  124.         this._windowPauseSignSprite.anchor.y = 0.5;

  125.         // 画像が読み込まれたあとに実行
  126.         this._windowPauseSignSprite.bitmap.addLoadListener(function() {
  127.             switch (positionType) {
  128.                 case "leftBottom":
  129.                     this._windowPauseSignSprite.move((this._windowPauseSignSprite.width / 2) + positionX + this.padding, this._height - (this._windowPauseSignSprite.height / 2) + positionY - (this.padding / 2));
  130.                     break;
  131.                 case "centerBottom":
  132.                     this._windowPauseSignSprite.move((this._width / 2) + positionX, this._height - (this._windowPauseSignSprite.height / 2) + positionY);
  133.                     break;
  134.                 case "rightBottom":
  135.                     this._windowPauseSignSprite.move(this._width - (this._windowPauseSignSprite.width / 2) + positionX - this.padding, this._height - (this._windowPauseSignSprite.height / 2) + positionY - (this.padding / 2));
  136.                     break;
  137.                 case "textEnd":
  138.                     if (this._textState) {
  139.                         var textStateCalcY = this._textState.outputHeight - this._textState.height + this._textState.height;
  140.                         if (textStateCalcY < this._textState.height) textStateCalcY = this._textState.height;
  141.                         this._windowPauseSignSprite.move(this._textState.x + (this._windowPauseSignSprite.width / 2) + this.padding + positionX, textStateCalcY + positionY);
  142.                     } else {
  143.                         this._windowPauseSignSprite.move((this._width / 2) + positionX, this._height - (this._windowPauseSignSprite.height / 2) + positionY);
  144.                     }
  145.                     break;
  146.             }
  147.         }.bind(this));

  148.         this._windowPauseSignSprite.alpha = 0;
  149.         this._windowPauseSignSprite.animationCount = 0;

  150.     };

  151.     Window_Message.prototype._updatePauseSign = function() {
  152.         var sprite = this._windowPauseSignSprite;
  153.         if (!this.pause) {
  154.             sprite.alpha = 0;
  155.         }
  156.         sprite.visible = this.isOpen();
  157.     };

  158.     var _Window_Message_update = Window_Message.prototype.update;
  159.     Window_Message.prototype.update = function() {
  160.         _Window_Message_update.apply(this, arguments);

  161.         // カーソルアニメーション
  162.         if (this.pause && this._windowPauseSignSprite) {
  163.             this._animationPauseSign();
  164.         }
  165.     };

  166.     Window_Message.prototype._animationPauseSign = function() {
  167.         var sprite = this._windowPauseSignSprite;
  168.         switch (animation) {
  169.             case "vertical":  // 上下
  170.                 if (sprite.animationCount === 0) {
  171.                     sprite.opacity = 255;
  172.                     sprite.animationCount += 1;
  173.                 } else if (sprite.animationCount < 31) {
  174.                     sprite.y += 0.25;
  175.                     sprite.animationCount += 1;
  176.                 } else if (sprite.animationCount < 61) {
  177.                     sprite.y -= 0.25;
  178.                     sprite.animationCount += 1;
  179.                 } else if (this._windowPauseSignSprite.animationCount === 61) {
  180.                     sprite.animationCount = 0;
  181.                 }
  182.                 break;
  183.             case "horizontal":  // 左右
  184.                 if (sprite.animationCount === 0) {
  185.                     sprite.opacity = 255;
  186.                     sprite.animationCount += 1;
  187.                 } else if (sprite.animationCount < 31) {
  188.                     sprite.x += 0.25;
  189.                     sprite.animationCount += 1;
  190.                 } else if (sprite.animationCount < 61) {
  191.                     sprite.x -= 0.25;
  192.                     sprite.animationCount += 1;
  193.                 } else if (this._windowPauseSignSprite.animationCount === 61) {
  194.                     sprite.animationCount = 0;
  195.                 }
  196.                 break;
  197.             case "blinking":  // 点滅
  198.                 if (sprite.animationCount === 0) {
  199.                     sprite.opacity = 255;
  200.                     sprite.animationCount += 1;
  201.                 } else if (sprite.animationCount < 31) {
  202.                     sprite.opacity -= 255 / 30;
  203.                     sprite.animationCount += 1;
  204.                 } else if (sprite.animationCount < 61) {
  205.                     sprite.opacity += 255 / 30;
  206.                     sprite.animationCount += 1;
  207.                 } else if (this._windowPauseSignSprite.animationCount === 61) {
  208.                     sprite.animationCount = 0;
  209.                 }
  210.                 break;
  211.             case "zoom":  // ズーム
  212.                 if (sprite.animationCount === 0) {
  213.                     sprite.opacity = 255;
  214.                     sprite.scale.x = 1;
  215.                     sprite.scale.y = 1;
  216.                     sprite.animationCount += 1;
  217.                 } else if (sprite.animationCount < 31) {
  218.                     sprite.scale.x += 0.5 / 30;
  219.                     sprite.scale.y += 0.5 / 30;
  220.                     sprite.animationCount += 1;
  221.                 } else if (sprite.animationCount < 61) {
  222.                     sprite.scale.x -= 0.5 / 30;
  223.                     sprite.scale.y -= 0.5 / 30;
  224.                     sprite.animationCount += 1;
  225.                 } else if (this._windowPauseSignSprite.animationCount === 61) {
  226.                     sprite.animationCount = 0;
  227.                 }
  228.                 break;
  229.             case "rotation":  // 回転
  230.                 sprite.opacity = 255;
  231.                 sprite.rotation += 1 / 30;
  232.                 break;
  233.             case "jumping":  // ジャンプ
  234.                 if (sprite.animationCount === 0) {
  235.                     sprite.opacity = 255;
  236.                     sprite.animationCount += 1;
  237.                 } else if (sprite.animationCount < 16) {
  238.                     sprite.y -= 0.5;
  239.                     sprite.animationCount += 1;
  240.                 } else if (sprite.animationCount < 31) {
  241.                     sprite.y += 0.5;
  242.                     sprite.animationCount += 1;
  243.                 } else if (sprite.animationCount < 61) {
  244.                     sprite.animationCount += 1;
  245.                 } else if (this._windowPauseSignSprite.animationCount === 61) {
  246.                     sprite.animationCount = 0;
  247.                 }
  248.                 break;
  249.             case "shootingstar":  // 流れ星
  250.                 if (sprite.animationCount === 0) {
  251.                     sprite.scale.x = 0;
  252.                     sprite.scale.y = 0;
  253.                     sprite.rotation = 1.5;

  254.                     sprite.animationCount += 1;
  255.                 } else if (sprite.animationCount < 31) {
  256.                     sprite.opacity = 255;
  257.                     sprite.scale.x += 1 / 30;
  258.                     sprite.scale.y += 1 / 30;
  259.                     sprite.rotation -= 1.5 / 30;

  260.                     sprite.animationCount += 1;
  261.                 } else if (sprite.animationCount < 61) {
  262.                     sprite.opacity -= 10;
  263.                     sprite.animationCount += 1;
  264.                 } else if (this._windowPauseSignSprite.animationCount === 61) {
  265.                     sprite.animationCount = 0;
  266.                 }
  267.                 break;
  268.             default:
  269.                 sprite.opacity = 255;
  270.         }
  271.     };


  272.     // for MV
  273.     var _Window_Message_startMessage = Window_Message.prototype.startMessage;
  274.     Window_Message.prototype.startMessage = function() {
  275.         _Window_Message_startMessage.apply(this, arguments);

  276.         // textStateにstartYとoutputHeightを追加
  277.         this._textState.startY = this._textState.y;
  278.         this._textState.outputHeight = 0;
  279.     };

  280.     var _Window_Message_processCharacter = Window_Message.prototype.processCharacter;
  281.     Window_Message.prototype.processCharacter = function(textState) {
  282.         this._textState.outputHeight = textState.y - textState.startY + textState.height;

  283.         _Window_Message_processCharacter.apply(this, arguments, textState);
  284.     };
  285. })();
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册用户

本版积分规则

Archiver|QQ群: 48625831|爱上RPG|哈库纳玛塔塔 |网站地图 Clicky

GMT+8, 2024-11-22 07:34 , Processed in 0.076029 second(s), 21 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表