设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4301|回复: 12
打印 上一主题 下一主题

[已经解决] 求教啊。超级整合里面的菜单优化脚本存档不能用

[复制链接]

Lv1.梦旅人

梦石
0
星屑
110
在线时间
210 小时
注册时间
2012-6-25
帖子
51
跳转到指定楼层
1
发表于 2013-6-15 15:21:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 Ayahiyano 于 2013-6-19 18:12 编辑

我一用来存档就死了
还出现这样的代码
  1. def draw_playtime(x, y, width, align)
  2.       hour = @total_sec / 60 / 60
  3.       min = @total_sec / 60 % 60
  4.       sec = @total_sec % 60
  5.       time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
  6.       draw_picture_number(x + 18 * 0, y ,0, "Save_Number_01",0,0,3,0) if hour < 10
  7.       draw_picture_number(x + 18 * 1, y ,hour, "Save_Number_01",0,0,3,0)
  8.       draw_picture_number(x + 18 * 3, y ,0, "Save_Number_01",0,0,3,0) if min < 10
  9.       draw_picture_number(x + 18 * 4, y ,min, "Save_Number_01",0,0,3,0)
  10.       draw_picture_number(x + 18 * 6, y ,0, "Save_Number_01",0,0,3,0) if sec < 10
  11.       draw_picture_number(x + 18 * 7, y ,sec , "Save_Number_01",0,0,3,0)     
  12.   end
复制代码
他说代码第2条错,要怎么改呢

Lv1.梦旅人

梦石
0
星屑
50
在线时间
137 小时
注册时间
2012-8-27
帖子
109
2
发表于 2013-6-15 19:44:19 手机端发表。 | 只看该作者
好像是冲突,反正我用没事
来自: Android客户端
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
210 小时
注册时间
2012-6-25
帖子
51
3
 楼主| 发表于 2013-6-15 19:57:33 | 只看该作者
liminglun 发表于 2013-6-15 19:44
好像是冲突,反正我用没事

方便发个工程看下嘛,我弄了3天都存不了档
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
帖子
1543
4
发表于 2013-6-16 08:06:09 | 只看该作者
那个代码第二行应该不可能有错,除非 @total_sec 的值为 nil,若您错误讯息是这样子,那表示确实脚本冲突了。
修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
210 小时
注册时间
2012-6-25
帖子
51
5
 楼主| 发表于 2013-6-16 08:32:34 | 只看该作者
j433463 发表于 2013-6-16 08:06
那个代码第二行应该不可能有错,除非 @total_sec 的值为 nil,若您错误讯息是这样子,那表示确实脚本冲突了 ...

你好,能帮我看看这个脚本怎么用么,我尝试改过但是没反应
RUBY 代码复制
  1. =begin{:4_156:}
  2.  ■ RGDS_Base ver 0.0.0.9
  3.  動画再生スクリプト(ベース)for DLL(ver0.0.0.8)
  4. =end
  5. module RGDS
  6.   DLL_NAME = "HNRGDS"
  7.  
  8.   module State
  9.     NO_CONNECT = 0
  10.     OPENING = 5
  11.     READY = 10
  12.     RUN   = 21
  13.     PAUSE = 22
  14.   end
  15.  
  16.   STATE_NO_CONNECT = 0
  17.   STATE_OPENING = 5
  18.   STATE_READY = 10
  19.   STATE_RUN   = 21
  20.   STATE_PAUSE = 22
  21.  
  22.   @@open = Win32API.new(DLL_NAME, 'OpenMovieA', 'ip', 'l')
  23.   @@get_size = Win32API.new(DLL_NAME, 'GetVideoSize', 'p', 'i')
  24.   @@close = Win32API.new(DLL_NAME, 'CloseMovie', 'v', 'i')
  25.   @@update_video = Win32API.new(DLL_NAME, 'UpdateVideo', 'n', 'i')
  26.   @@run = Win32API.new(DLL_NAME, 'RunMovie', 'v', 'i')
  27.   @@pause = Win32API.new(DLL_NAME, 'PauseMovie', 'v', 'i')
  28.   @@get_volume = Win32API.new(DLL_NAME, 'GetVolume', 'v', 'l')
  29.   @@set_volume = Win32API.new(DLL_NAME, 'SetVolume', 'l', 'l')
  30.   @@state = Win32API.new(DLL_NAME, 'GetState', 'v', 'i')
  31.  
  32.   @@state = 0
  33.   @@system_pause = false
  34.   @@volume = 10000
  35.   @@visible = true
  36.   @@x = 0
  37.   @@y = 0
  38.   @@width_max  = 0
  39.   @@height_max = 0
  40.   @@filename = ""
  41.  
  42.   @@bitmap = Bitmap.new(16, 16)
  43.   @@bitmap.clear
  44.   class << @@bitmap
  45.     alias :_dispose :dispose unless method_defined?(:_dispose)
  46.     def dispose
  47.     end
  48.   end
  49.   @@bitmap_changed = true
  50.  
  51.   def self.open(filename)
  52.     if @@filename != filename
  53.       self.close
  54.     end
  55.     result = @@open.call(filename.size, filename);
  56.     return result if result != 0
  57.     @@state = State::OPENING
  58.     @@filename = filename
  59.     return result
  60.   end
  61.  
  62.   def self.close
  63.     @@state = State::NO_CONNECT
  64.     @@filename = ""
  65.     @@close.call()
  66.     @@bitmap.clear
  67.   end
  68.  
  69.   def self.bitmap
  70.     @@bitmap
  71.   end
  72.  
  73.   def self.bitmap_changed?
  74.     @@bitmap_changed
  75.   end
  76.  
  77.   def self.bitmap_changed=(value)
  78.     @@bitmap_changed = value
  79.   end
  80.  
  81.   def self.filename
  82.     @@filename
  83.   end
  84.  
  85.   def self.update
  86.     return 0 if !@@visible
  87.     if @@state >= State::READY
  88.       result = @@update_video.call(@@bitmap.object_id)
  89.       if (result == 0)
  90.         return 0
  91.       else
  92.         self.close()
  93.         return result
  94.       end
  95.     else
  96.       return -1
  97.     end
  98.   end
  99.  
  100.   def self.wait_opening
  101.     return unless @@state == State::OPENING
  102.     buff_size = "\000" * 8
  103.     while(@@state == State::OPENING) do
  104.       result = @@get_size.call(buff_size)
  105.       if result == 0
  106.         break;
  107.       elsif result < 0
  108.         error_code = result
  109.         error_code = result & 0xFFFF
  110.         if DSError::JP_ERROR.key?(error_code)
  111.           print "エラー(#{error_code}):#{DSError::JP_ERROR[error_code]}"
  112.         else
  113.           print "エラー(#{error_code}):#{result}"
  114.         end
  115.         return result
  116.       end
  117.       5.times {Graphics.update}
  118.     end
  119.  
  120.     width, height = buff_size.unpack("ii")
  121.     if ( (@@bitmap.width != width) or (@@bitmap.height != height) )
  122.       @@bitmap._dispose
  123.       @@bitmap = Bitmap.new(width, height)
  124.       class << @@bitmap
  125.         alias :_dispose :dispose unless method_defined?(:_dispose)
  126.         def dispose
  127.         end
  128.       end
  129.       @@bitmap_changed = true
  130.     end
  131.     @@bitmap.clear
  132.     @@state = State::READY
  133.     return 0
  134.   end
  135.  
  136.   def self.run
  137.     self.wait_opening()
  138.     if @@state >= State::READY
  139.       self.set_volume(@@volume)
  140.       @@run.call()
  141.       @@state = State::RUN
  142.     end
  143.   end
  144.  
  145.   def self.pause
  146.     if @@state == State::RUN
  147.       @@pause.call()
  148.       @@state = State::PAUSE
  149.     end
  150.   end
  151.  
  152.   def self.get_volume
  153.     if @@state >= State::READY
  154.       @@volume = @@get_volume.call()
  155.     end
  156.     return @@volume
  157.   end
  158.  
  159.   def self.set_volume(volume)
  160.     volume = 0 if volume < 0
  161.     volume = 10000 if volume > 10000
  162.     @@volume = volume
  163.     if @@state >= State::READY
  164.       @@set_volume.call(volume)
  165.     end
  166.   end
  167.  
  168.   def self.active?
  169.     (@@state >= State::READY)
  170.   end
  171.  
  172.   def self.system_pause
  173.     if @@state == State::RUN
  174.       self.pause()
  175.       @@system_pause = true
  176.       @@state == State::PAUSE
  177.     end
  178.   end
  179.  
  180.   def self.system_resume
  181.     if @@system_pause
  182.       self.run()
  183.       @@system_pause = false
  184.     end
  185.   end
  186.  
  187.   def self.visible
  188.     (@@visible && self.active? )
  189.   end
  190.  
  191.   # リセット対策
  192.   self.close()
  193. end
  194.  
  195. module DSError
  196.   # HNRGDS.dll で独自に定義しているエラーコード
  197.   LOCAL_ERROR = {
  198.     -100001 => "ERROR_NO_WINDOW",
  199.     -100003 => "ERROR_WINDOW_OPENED",
  200.     -100004 => "ERROR_NO_CONNECT",
  201.     -100101 => "ERROR_CANT_OPEN_FILE",
  202.     -100201 => "ERROR_MOVIE_LODING",
  203.     -100205 => "ERROR_OPEN_TIMEOUT",
  204.     -100301 => "ERROR_NOT_PLAYING",
  205.     -100303 => "ERROR_DIFFERENT_SIZE",
  206.     -101404 => "ERROR_FILTER_NOT_FOUND",
  207.     -101406 => "ERROR_FILTER_UNSUPPORTED",
  208.   }
  209.   # DirectShowから返されるエラーの下位ビット
  210.   JP_ERROR = {
  211.     554 => "このピンは、提供されたメディア タイプを使えない",
  212.     555 => "このサンプルはレンダリングできない",
  213.     558 => "タイムアウト期間が過ぎた",
  214.     559 => "ファイル フォーマットが無効",
  215.     599 => "ビデオ ストリームを再生できない(レンダラ)",
  216.     600 => "オーディオ ストリームを再生できない(レンダラ)",
  217.     603 => "DirectShow はこのプロセッサ上で MPEG ムービーを再生できない",
  218.     604 => "オーディオ ストリームを再生できない(フォーマット)",
  219.     605 => "ビデオ ストリームを再生できない(フォーマット)",
  220.     606 => "規格に準拠していないので DirectShow で再生できない",
  221.     607 => "フィルタグラフに存在しないオブジェクトに要求された関数を実行できない",
  222.     612 => "バッファが十分に満たされていない",
  223.     613 => "ファイルを再生できない(フォーマット)",
  224.     614 => "同じ転送をサポートしていないのでピンどうしを接続できない",
  225.   }
  226. end


=begin
 ■ RGDS_SP ver 0.0.1.2
動画再生スクリプト(表示系)for VX Ace
動画再生スクリプト(ベース)より下に配置してください。

=end
module RGDS_SP
  @@visible = false
  
  # ■ 動画設定クラス $game_system.movie_infoで使用
  class MovieInfo
    attr_reader :x
    attr_reader :y
    attr_reader :z
    attr_reader :width_max
    attr_reader :height_max
    attr_reader :origin_center
    attr_accessor :mode
    attr_accessor :refresh_flag
    def initialize
      @x = Graphics.width / 2
      @y = Graphics.height / 2
      @z = 500
      @width_max  = 0
      @height_max = 0
      @origin_center = true
      @mode = 0
      @refresh_flag = false
    end
   
    # セッター
    def x=(n)
      @x = n
      @refresh_flag = true
    end
    def y=(n)
      @y = n
      @refresh_flag = true
    end
    def z=(n)
      @z = n
      @refresh_flag = true
    end
    def width_max=(n)
      @width_max = n
      @refresh_flag = true
    end
    def width_max=(n)
      @width_max = n
      @refresh_flag = true
    end
    def origin_center=(flag)
      @origin_center = flag
      @refresh_flag = true
    end

    # ■ 表示位置、サイズを指定します。
    #- x, y: 表示座標
    #- width_max, height_max: 表示枠。この内部に収まるように拡大縮小します。
    #                       : どちらかが0以下の場合拡大縮小は行われません。
    #- orogin: 表示位置基準点 false(デフォ): 動画の左上, true: 動画の中心を上記
    #-         の[x,y]にあわせます
    def set_position(x=0,y=0,width_max=0,height_max=0,origin=false)
      @x = x
      @y = y
      @width_max  = width_max
      @height_max = height_max
      @origin_center = origin
      @refresh_flag = true
    end
   
    # ■ 以降の表示位置、サイズをデフォルトに戻します。
    # 拡大縮小なし、左上にあわせて表示
    def reset_position
      @x = Graphics.width / 2
      @y = Graphics.height / 2
      @width_max  = 0
      @height_max = 0
      @origin_center = true
      @refresh_flag = true
    end
   
  end
  
  
  class MovieSprite < ::Sprite
    # 初期化
    def initialize(viewport=nil)
      super
      self.visible = false
      self.bitmap = RGDS.bitmap
      fix_position()
    end

    # 拡大縮小処理
    def change_zoom
      zoom = 1.0
      bw = self.bitmap.width
      bh = self.bitmap.height
      return if bw <= 0 or bh <= 0
      if $game_system.movie_info.width_max > 0 and $game_system.movie_info.height_max > 0
        zoom_w = $game_system.movie_info.width_max.to_f / bw.to_f
        zoom_h = $game_system.movie_info.height_max.to_f / bh.to_f
        zoom = [zoom_w, zoom_h].min
      end
      self.zoom_x = zoom
      self.zoom_y = zoom
    end

    # 表示位置変更
    def fix_position
      self.x = $game_system.movie_info.x
      self.y = $game_system.movie_info.y
      self.z = $game_system.movie_info.z
      if $game_system.movie_info.origin_center
        self.ox = self.bitmap.width / 2
        self.oy = self.bitmap.height / 2
      end
      change_zoom()
    end
   
    def update
      if (self.visible = RGDS.visible)
        if RGDS.bitmap_changed? or self.bitmap.disposed?
          self.bitmap = RGDS.bitmap
          fix_position()
          RGDS.bitmap_changed = false
          $game_system.movie_info.refresh_flag = false
        elsif $game_system.movie_info.refresh_flag
          fix_position()
          $game_system.movie_info.refresh_flag = false
        end
      end
      super
    end
  end

  module_function

  # ■ 動画をオープンします。初回は1~2秒ほどかかる場合もあります。
  def open(filename)
    RGDS.open(filename)
  end
  
  # ■ 動画を停止しクローズします。
  def close
    RGDS.close()
  end
  
  # ■ openされた動画を再生します。一時停止中なら再開します。
  # 再生が終わると自動的にクローズします。
  def run
    RGDS.run()
  end
  
  # ■ 動画を一時停止します。再開はrunで行います。
  def pause
    RGDS.pause()
  end

  # ■ 動画をオープンして自動再生します。
  #- 決定キーでスキップします。
  def start_movie(filename, option={})
   
    # スキップ検出オプション
    if option.key?(:skip_sw)
      skip_sw = option[:skip_sw].to_i
    else
      skip_sw = 0
    end
   
    # スキップ禁止モードオプション
    if option.key?(:nsm)
      nsm_mode = option[:nsm]
    else
      nsm_mode = false
    end
   
    if skip_sw > 0
      $game_switches[skip_sw] = true
    end
    scene_temp = SceneManager.scene
    if scene_temp.is_a?(Scene_Map) or scene_temp.is_a?(Scene_Battle)
      msgv = SceneManager.scene.instance_variable_get(:@message_window)
      msgv.update
      tempv = msgv.visible
      msgv.visible = false
      # オープン
      RGDS.open(filename)
      RGDS.run()
      # 終了またはボタンが押されるまでループ
      loop do
        break if scene_temp != SceneManager.scene

        # 画面の更新
        if SceneManager.scene.is_a?(Scene_Map)
          SceneManager.scene.update_for_fade
        else
          SceneManager.scene.update_basic
        end
        
        if !RGDS.active? # 再生終了
          if skip_sw > 0
            $game_switches[skip_sw] = false
          end
          break
        end
        unless nsm_mode
          if Input.trigger?(Input::C) or Input.trigger?(Input::B)
            break
          end
        end
      end
      RGDS.close()
      msgv.visible = tempv
    end
  end
  

  # ■ 以降の表示位置、サイズを指定します。
  #- x, y: 表示座標
  #- width_max, height_max: 表示枠。この内部に収まるように拡大縮小します。
  #                       : どちらかが0以下の場合拡大縮小は行われません。
  #- origin: 表示位置基準点 false: 動画の左上, true: 動画の中心を上記
  #-         の[x,y]にあわせます
  def set_position(x=0,y=0,width_max=0,height_max=0,origin=false)
    $game_system.movie_info.set_position(x,y,width_max,height_max,origin)
  end
  
  # ■ 以降の表示位置、サイズをデフォルトに戻します。
  # 拡大縮小なし、中央にあわせて表示
  def reset_position
    $game_system.movie_info.reset_position()
  end
  
  # 再生音量取得
  def get_volume
    return RGDS.get_volume()
  end

  # 再生音量設定
  def set_volume(volume)
    return RGDS.set_volume(volume)
  end
  
end

class Game_System
  def init_movie_info
    @movie_info = RGDS_SP::MovieInfo.new
  end
  def movie_info
    init_movie_info() if @movie_info.nil?
    return @movie_info
  end
end


class Spriteset_Map
  alias :_hn_movie__initialize :initialize unless private_method_defined?(:_hn_movie__initialize)
  def initialize
    # 元の処理
    _hn_movie__initialize
    # 追加処理
    create_movie
    update_movie
  end

  alias :_hn_movie__dispose :dispose unless method_defined?(:_hn_movie__dispose)
  def dispose
    dispose_movie
    _hn_movie__dispose
  end

  alias :_hn_movie__update :update unless method_defined?(:_hn_movie__update)
  def update
    update_movie
    _hn_movie__update
  end

  # ■ シーン移行時に動画を待機モードにします。
  def create_movie
    @sp_movie = RGDS_SP::MovieSprite.new()
    @sp_movie.viewport = @viewport1
    RGDS.system_resume
  end

  # ■ シーン移行時に動画を待機モードにします。
  def dispose_movie
    RGDS.system_pause
    @sp_movie.viewport = nil
    @sp_movie.dispose
    @sp_movie = nil
  end

  def update_movie
    if RGDS.active?
      RGDS.update
    end
    @sp_movie.update unless @sp_movie.nil?
  end
end

class Spriteset_Battle
  alias :_hn_movie__initialize :initialize unless private_method_defined?(:_hn_movie__initialize)
  def initialize
    # 元の処理
    _hn_movie__initialize
    # 追加処理
    create_movie
    update_movie
  end

  alias :_hn_movie__dispose :dispose unless method_defined?(:_hn_movie__dispose)
  def dispose
    dispose_movie
    _hn_movie__dispose
  end

  alias :_hn_movie__update :update unless method_defined?(:_hn_movie__update)
  def update
    update_movie
    _hn_movie__update
  end

  # ■ シーン移行時に動画を待機モードにします。
  def create_movie
    @sp_movie = RGDS_SP::MovieSprite.new()
    @sp_movie.viewport = @viewport1
    RGDS.system_resume
  end

  # ■ シーン移行時に動画を待機モードにします。
  def dispose_movie
    RGDS.system_pause
    @sp_movie.viewport = nil
    @sp_movie.dispose
    @sp_movie = nil
  end

  def update_movie
    if RGDS.active?
      RGDS.update
    end
    @sp_movie.update unless @sp_movie.nil?
  end
end
=begin
■ RGDS_OP_Movie ver 0.0.1.0
RGDS_base, RGDS_SP より下に配置してください

=end
class Scene_OpeningMovie < Scene_Base
  MOVIE_FILE = "Movies/opening.mpg"
  NSM = false
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    if $BTEST                         # 戦闘テストの場合
      $scene = next_scene()
    else                              # 通常のプレイの場合
      super                           # 本来のメイン処理
    end
  end
  
  def next_scene
    Scene_Title.new
  end
  
  def start
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    RGDS.open(MOVIE_FILE)
    @movie_sprite = RGDS_SP::MovieSprite.new
    super
  end
  
  def post_start
    super
    RGDS.run
  end
  
  def update
    super
    RGDS.update
    @movie_sprite.update
    if !RGDS.active? # 再生終了
      SceneManager.goto(Scene_Title)
      return
    end
    unless NSM
      if Input.trigger?(Input::C) or Input.trigger?(Input::B)
        SceneManager.goto(Scene_Title)
        return
      end
    end
  end

  def pre_terminate
    RGDS.close()
    @movie_sprite.dispose
    super
  end
end

module SceneManager
  #--------------------------------------------------------------------------
  # ● 最初のシーンクラスを取得
  #--------------------------------------------------------------------------
  def self.first_scene_class
    $BTEST ? Scene_Battle : Scene_OpeningMovie
  end
end

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
帖子
1543
6
发表于 2013-6-16 08:41:00 | 只看该作者
这应该还有一个 DLL 档才能用吧,tseyik 大大不是有给载点和说明范例吗?您不会只抓了脚本吧?
修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
210 小时
注册时间
2012-6-25
帖子
51
7
 楼主| 发表于 2013-6-16 08:44:20 | 只看该作者
j433463 发表于 2013-6-16 08:41
这应该还有一个 DLL 档才能用吧,tseyik 大大不是有给载点和说明范例吗?您不会只抓了脚本吧? ...

范例我看了,但是我研究了半天,都不能用自己的视频啊

点评

我没有玩过这视频的脚本,最好还是请 tseyik 大大来讲解吧,一是脚本的前后顺序,一是 dll 档放的位置,都要正确才行。  发表于 2013-6-16 14:24
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
16 小时
注册时间
2013-4-3
帖子
10
8
发表于 2013-6-17 08:52:40 | 只看该作者
超级整合里面有个存读档的图片素材貌似放错位置了,不知道你是不是因为没有搞这个才有错。。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
210 小时
注册时间
2012-6-25
帖子
51
9
 楼主| 发表于 2013-6-17 14:20:17 | 只看该作者
JuventusYzh 发表于 2013-6-17 08:52
超级整合里面有个存读档的图片素材貌似放错位置了,不知道你是不是因为没有搞这个才有错。。 ...

求教啊。哪里放错了呢
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
16 小时
注册时间
2013-4-3
帖子
10
10
发表于 2013-6-17 14:43:08 | 只看该作者
Ayahiyano 发表于 2013-6-17 14:20
求教啊。哪里放错了呢

没记错的话是要把Graphics的Gallery里面的图放到Pictures里面,
你去试试吧。。。

jt03.jpg (17.46 KB, 下载次数: 42)

jt03.jpg
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-18 12:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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