Project1

标题: 用了脚本之后无法存档,TypeError [打印本页]

作者: 唯君    时间: 2013-8-3 03:01
标题: 用了脚本之后无法存档,TypeError
显示这个有错误 Marshal.dump(make_save_contents, file)
提示no marshal_dump is defined for Sprite_Bust

然后这个是我用的脚本↓具体情况就是,只要不使用半身像就可以存档,使用半身像的话就会发生上面的情况,希望各位大大解救!

#encoding:utf-8
#==============================================================================
# ■ 半身像对话框 by LBQ
#------------------------------------------------------------------------------
#  一个简单的半身像对话框罢了= =
#------------------------------------------------------------------------------
# ■ 用法一览
#     1:如何将半身像应用到游戏中?
#       ——如果想要把一个脸图替换成半身像,则需要找到这个脸图的编号,比如说拉尔
#           夫,就是Actor1的编号0,之后去在Graphics/Busts这个文件夹里面拷贝一个
#           叫做Actor1_0的图像,这个图像会被当做半身像替换原有图像。
#==============================================================================
$imported ||= {}
$imported[:LBQ_Bust]=true

module LBQ
  module Bust
    FOLDER="Busts"
    SUB1=[/【/,    "\\{\\c[6]-- "]
    SUB2=[/】/,    " --\\c[0]\\}"]

    TEXT_FOR_NEXT="[next]"
    TEXT_FOR_END ="[end]"

    INDENT=255 #半身像的缩进
  end
end

module Cache
  def self.busts(filename)
    load_bitmap("Graphics/#{LBQ::Bust::FOLDER}/", filename)
  end
end



class Sprite_Bust < Sprite_Base
  attr_accessor   :bust_graphics
  attr_accessor   :status   
  
  def initialize(viewport=nil)
    super(viewport)
    @bust_graphics=nil
    @status=:nothing
  end

  def slide_in
    @status=:sliding_in
  end

  def slide_out
    @status=:sliding_out
    if $game_message.do_not_slide_out
      @status=:slided_out
      set_pos
    end
  end




  def set_pos(slide_in=true)
    self.x=0 - self.bitmap.width
    self.y=Graphics.height-self.bitmap.height

    self.x=0 unless slide_in
  end


  def set_graphics(bust_graphics)
    self.bitmap=Cache.busts(bust_graphics)
  end
  
  def update
    super
    case @status
    when :nothing
      # Do Nothing
    when :sliding_in
      #Slide In
      self.x+=12
      if self.x>=0
        self.x=0
        @status=:slided_in
      end

    when :sliding_out
      self.x-=12
      if self.x<= -self.bitmap.width
        self.x= -self.bitmap.width
        @status=:slided_out
      end
      #Slide Out
    when :slided_in
      #Slided in
    when :slided_out
      #Sliede out
    end

  end


end


class Game_Message
  attr_accessor   :bust_name
  attr_accessor   :bust
  attr_accessor   :have_bust
  attr_accessor   :do_not_slide_out

  alias lbq_bust_shot_game_message_init initialize
  def initialize
    lbq_bust_shot_game_message_init
    @bust_name=""
    @bust=nil
    @have_bust=false
    @do_not_slide_out=false
  end



  #--------------------------------------------------------------------------
  # ● 添加内容
  #--------------------------------------------------------------------------
  def add(text)
    new_text=text.gsub(LBQ::Bust::SUB1[0],LBQ::Bust::SUB1[1])
    new_text2=new_text.gsub(LBQ::Bust::SUB2[0],LBQ::Bust::SUB2[1])
    if new_text2.include? LBQ::Bust::TEXT_FOR_NEXT
      new_text2.delete!(LBQ::Bust::TEXT_FOR_NEXT)
      $game_message.do_not_slide_out=true
    end

    if new_text2.include? LBQ::Bust::TEXT_FOR_END
      new_text2.delete!(LBQ::Bust::TEXT_FOR_END)
      $game_message.do_not_slide_out=false
    end
    @texts.push(new_text2)
  end
end



class Game_Interpreter
  alias lbq_bust_shot_command_101 command_101
  #--------------------------------------------------------------------------
  # ● 显示文字
  #--------------------------------------------------------------------------
  def command_101
    $game_message.bust=nil
      unless @params[0].empty?
        if File.exist?("Graphics/#{LBQ::Bust::FOLDER}/#{@params[0]}_#{@params[1]}.png")
          $game_message.have_bust=true
        else
          $game_message.have_bust=false
          $game_message.bust_name=""
        end
      end

    unless @params[3] == 2
      $game_message.have_bust=false
    end

    if $game_message.have_bust
      $game_message.bust_name="#{@params[0]}_#{@params[1]}"
      $game_message.bust=nil
      $game_message.bust=Sprite_Bust.new
      $game_message.bust.set_graphics($game_message.bust_name)
      $game_message.bust.z=99999
      unless $game_message.do_not_slide_out
        $game_message.bust.set_pos
        $game_message.bust.slide_in
      else
        $game_message.bust.set_pos(false)
        $game_message.bust.slide_in
      end
    end

    lbq_bust_shot_command_101
    if $game_message.have_bust
        $game_message.bust.slide_out
        Fiber.yield until $game_message.bust.status==:slided_out
    end
    $game_message.have_bust=false
    $game_message.bust_name=""

  end


  alias lbq_bust_int_update update
  def update
    lbq_bust_int_update
    $game_message.bust.update unless $game_message.bust.nil?
  end

end


class Window_Message
  #--------------------------------------------------------------------------
  # ● 获取换行位置
  #--------------------------------------------------------------------------
  def new_line_x
    value=0
    value=112 unless $game_message.face_name.empty?
    unless $game_message.face_name.empty? && $game_message.bust_name.empty?
      value=LBQ::Bust::INDENT
    end
   
    return value
  end
end


class Window_Message
  #--------------------------------------------------------------------------
  # ● 翻页处理
  #--------------------------------------------------------------------------
  def new_page(text, pos)
    contents.clear
    draw_face($game_message.face_name, $game_message.face_index, 0, 0) if $game_message.bust_name.empty?
    reset_font_settings
    pos[:x] = new_line_x
    pos[:y] = 0
    pos[:new_x] = new_line_x
    pos[:height] = calc_line_height(text)
    clear_flags
  end
end
作者: 1715063941    时间: 2013-8-3 09:28
少年死心吧,之后是无法读档的,可能原因是脚本记录文件发生了质的变化
作者: Sion    时间: 2013-8-3 10:25
$game_message 里面放入了一个精灵导致无法存档。
作者: xggzga117    时间: 2013-8-3 16:22
可能是脚本兼容的问题。
作者: 唯君    时间: 2013-8-3 19:59
1715063941 发表于 2013-8-3 09:28
少年死心吧,之后是无法读档的,可能原因是脚本记录文件发生了质的变化

总之还是谢谢了
作者: 唯君    时间: 2013-8-3 20:00
Sion 发表于 2013-8-3 10:25
$game_message 里面放入了一个精灵导致无法存档。

谢谢!!那怎么解决呢?
作者: 唯君    时间: 2013-8-3 20:01
xggzga117 发表于 2013-8-3 16:22
可能是脚本兼容的问题。

唔……谢谢。
作者: 1715063941    时间: 2013-8-4 04:44
就是读取脚本错误的问题
因为有一定可能性,系统存档时同时存档了脚本的信息
当读取时发现存档的版本不同,所以读取会失败
另外大量脚本都是这样的
作者: scottyfan    时间: 2013-8-5 01:23
用这个,半身像放在PICTURE文件夹下,和Faces文件夹下人物头像名称对应,比如头像那张图片名字叫Actor1的第 1个,对应半身像图片名称就写成Actor1_0
日文我也不太懂,具体你得再问问别人。
  1. #===========================================================================
  2. # ◆ A1 Scripts ◆
  3. #    立ち絵表示(RGSS3)
  4. #
  5. # バージョン   : 1.20 (2012/01/09)
  6. # 作者         : A1
  7. # URL     : http://a1tktk.web.fc2.com/
  8. #---------------------------------------------------------------------------
  9. # 機能:
  10. # ・「ピクチャの表示」などを使わなくても立ち絵を表示・非表示・移動します
  11. #---------------------------------------------------------------------------
  12. # 更新履歴   :2011/12/15 Ver1.00 リリース
  13. #            :2012/01/02 Ver1.10 A1共通スクリプトVer3.30対応
  14. #            :2012/01/09 Ver1.20 高さ指定機能追加
  15. #            :2012/01/09 Ver1.20 名前の置き換え指定方法変更
  16. #---------------------------------------------------------------------------
  17. # 設置場所      
  18. #  A1共通スクリプトより下
  19. #    (ネームウィンドウ以下)
  20. #
  21. # 必要スクリプト
  22. #    A1共通スクリプトVer3.30以上
  23. #---------------------------------------------------------------------------
  24. # 使い方
  25. #  ■ 設定項目 を設定
  26. #  顔グラフィックに対応した立ち絵を
  27. #  Picturesフォルダにインポートすれば機能します
  28. #
  29. #  対応する立ち絵のファイル名は
  30. #  [顔グラフィックファイル名]_[顔グラフィックスインデックス]_[0 or 1]
  31. #  
  32. #  例:顔グラフィック Actor1 のIndex 0 (ラルフ) の場合
  33. #    Actor1_0_0 が対応立ち絵になります
  34. #    Actor1_0_1 があれば口パクします
  35. #
  36. #  立ち絵表示フラグをOnにすると、立ち絵が表示されるようになります
  37. #  立ち絵表示フラグの番号は設定項目で設定できます
  38. #
  39. # 名前の置き換え
  40. #  設定項目の「名前の置き換え」を設定することで
  41. #  顔グラフィックファイル名と、表示する立ちグラフィックの関連付けができます
  42. #
  43. #  例1(1つの顔グラフィックファイルを複数キャラで使用する場合)
  44. #        "Actor1_0" => ["ラルフ",0],
  45. #        "Actor1_1" => ["アリシア",0],
  46. #
  47. #   顔グラフィックファイル「Actor1」のIndex0を表示した際
  48. #   ラルフ_0_0 が対応立ち絵になります
  49. #   ラルフ_0_1 があれば口パクします
  50. #
  51. #   「Actor1」のIndex1を表示した際は
  52. #   アリシア_0_0 が対応立ち絵になります
  53. #   アリシア_0_1 があれば口パクします
  54. #
  55. #  例2(複数の顔グラフィックファイルを1キャラで使用する場合)
  56. #   "ラルフ"     => ["ラルフ",0]  (省略可能)
  57. #   "ラルフ_ex"  => ["ラルフ",1]
  58. #
  59. #   顔グラフィックファイル「ラルフ」「ラルフ_ex」に対応した
  60. #   全ての立ち絵を、「ラルフ」の立ち絵として扱います
  61. #---------------------------------------------------------------------------
  62. # 追加文章中コマンド
  63. #
  64. #  \TURN[direction]              立ち絵を左右反転させます
  65. #                                direction = 向きを指定します (L or R)
  66. #
  67. #                                L : 元の立ち絵を反転させます
  68. #                                R : 反転を元の立ち絵に戻します
  69. #                                使用例:\TURN[L]
  70. #
  71. #  \RETURN[duration]             立ち絵を所定の位置に戻します
  72. #                                duration = 移動完了までの時間(フレーム)
  73. #
  74. #  \ERASE                        立ち絵を消去します
  75. #
  76. #  \SHOW                         消去した立ち絵を表示させます
  77. #
  78. #  \TONE[duration,red,green,blue,gray]
  79. #                                立ち絵の色調を変更します
  80. #                                duration = 色調変更完了までの時間(フレーム)
  81. #                                red      = 色調の赤要素
  82. #                                green    = 色調の緑要素
  83. #                                blue     = 色調の青要素
  84. #                                gray     = 色調のグレー要素(省略可)
  85. #
  86. #  \MV[x,y,duration]             立ち絵を移動します(絶対座標)
  87. #                                x        = 移動先のx座標
  88. #                                y        = 移動先のy座標
  89. #                                duration = 移動完了までの時間(フレーム)
  90. #
  91. #  \MVA[x,y,duration]            立ち絵を移動します(相対座標)
  92. #                                x        = x方向の移動距離
  93. #                                y        = y方向の移動距離
  94. #                                duration = 移動完了までの時間(フレーム)
  95. #
  96. #  \OP[opacity,duration]         立ち絵の透明度を変更します
  97. #                                opacity  = 透明度
  98. #                                duration = 透明度変更完了までの時間(フレーム)
  99. #
  100. #
  101. #  \BYE[direction,duration]      立ち絵を画面外に移動させます
  102. #                                direction = 向きを指定します (L or R or D)
  103. #                                duration  = 移動完了までの時間(フレーム)
  104. #
  105. #                                L : 画面左に退場します
  106. #                                R : 画面右に退場します
  107. #                                D : 画面下に退場します
  108. #                                使用例:\BYE[L,60]
  109. #==============================================================================
  110. $imported ||= {}
  111. $imported["A1_Stand_Picture"] = true
  112. if $imported["A1_Common_Script"]
  113. old_common_script("立ち絵表示", "3.30") if common_version < 3.30
  114. #==============================================================================
  115. # ■ 設定項目
  116. #==============================================================================
  117. module A1_System::StandPicture
  118.   #--------------------------------------------------------------------------
  119.   # オートy座標指定
  120.   #   画面下      :画面の一番下に合わせます
  121.   #   ウィンドウ上:メッセージウィンドウの上に合わせます
  122.   #--------------------------------------------------------------------------
  123.   AUTO_Y = "画面下"
  124.   #--------------------------------------------------------------------------
  125.   # y座標個別指定
  126.   #--------------------------------------------------------------------------
  127.   PERSONAL_Y = {
  128.     "Actor1_0" => 128,
  129.     "Actor1_1" => 128,
  130.   }
  131.   #--------------------------------------------------------------------------
  132.   # 名前の置き換え
  133.   #--------------------------------------------------------------------------
  134.   NAME_CHANGE = {
  135.     "Actor1_0" => ["ラルフ",0],
  136.     "Actor1_1" => ["アリシア",0],
  137.   }
  138. end
  139. #==============================================================================
  140. # ■ Window_Message
  141. #------------------------------------------------------------------------------
  142. #  文章表示に使うメッセージウィンドウです。
  143. #==============================================================================

  144. class Window_Message < Window_Base
  145.   #--------------------------------------------------------------------------
  146.   # ○ 定数
  147.   #--------------------------------------------------------------------------
  148.   LEFT  = 0
  149.   RIGHT = 1
  150.   BYE_DURATION = 30
  151.   MOVE_DURATION = 30
  152.   #--------------------------------------------------------------------------
  153.   # ☆ オブジェクト初期化
  154.   #--------------------------------------------------------------------------
  155.   alias a1_stand_picture_window_message_initialize initialize
  156.   def initialize
  157.     @stand_pic = {}
  158.     @show_pos = []
  159.     @prev_name = ""
  160.     @pre_message = false
  161.     a1_stand_picture_window_message_initialize
  162.   end
  163.   #--------------------------------------------------------------------------
  164.   # ☆ 改ページ処理
  165.   #--------------------------------------------------------------------------
  166.   alias a1_stand_picture_window_message_new_page new_page
  167.   def new_page(text, pos)
  168.     file_name = $game_message.face_name
  169.     file_index = $game_message.face_index
  170.    
  171.     file_info = find_name(file_name, file_index)
  172.     name = file_info[0]
  173.     index = file_info[1]
  174.    
  175.     # 顔グラフィックがない
  176.     return a1_stand_picture_window_message_new_page(text, pos) if name.empty?
  177.     # 立ち絵作成(新顔なら表示)
  178.     new_face = false
  179.     new_face = create_stand_pic(file_name, name, index) if @stand_pic[name] == nil
  180.     # 立ち絵がない
  181.     return a1_stand_picture_window_message_new_page(text, pos) unless stand_pic_enable?(name)
  182.     # 新顔以外は立ち絵変更
  183.     change_picture(file_name, index, name) unless new_face
  184.     # 顔グラフィックスを一度emptyにする
  185.     $game_message.face_name = "" if @stand_pic[name].enable_bitmap?(index)
  186.     # 従来の改ページ処理
  187.     a1_stand_picture_window_message_new_page(text, pos)
  188.     # 顔グラフィックスを戻す
  189.     $game_message.face_name = file_name
  190.     # 直前に話した名前を入れる
  191.     @prev_name = name
  192.     # ネームウィンドウの処理
  193.     proc_name_window(file_name, file_index, name) if $imported["A1_Name_Window"]
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   # ○ ネームウィンドウの処理
  197.   #--------------------------------------------------------------------------
  198.   def proc_name_window(file_name, file_index, name)
  199.     pos = show_pos(name)
  200.     return show_name_window(file_name, file_index, 0) unless stand_pic_enable?(name)
  201.     bitmap_width = @stand_pic[name].pic_sprite.bitmap.width
  202.     x = bitmap_width / 2 if pos == 0
  203.     x = Graphics.width - bitmap_width / 2 if pos == 1
  204.     show_name_window(file_name, file_index, x, 0)
  205.   end
  206.   #--------------------------------------------------------------------------
  207.   # ○ 立ち絵変更
  208.   #--------------------------------------------------------------------------
  209.   def change_picture(file_name, index, name)
  210.     return @stand_pic[name].change_face(file_name, index) if show_pos(name) > -1
  211.     return change_character(file_name, name, index) if @show_pos.size == 2
  212.     create_stand_pic(file_name, name, index)
  213.   end
  214.   #--------------------------------------------------------------------------
  215.   # ☆ 改行処理
  216.   #--------------------------------------------------------------------------
  217.   alias a1_stand_picture_window_message_new_line_x new_line_x
  218.   def new_line_x
  219.     file_name = $game_message.face_name
  220.     file_index = $game_message.face_index
  221.    
  222.     file_info = find_name(file_name, file_index)
  223.     name = file_info[0]
  224.     index = file_info[1]
  225.    
  226.     # 顔グラフィックがない
  227.     return a1_stand_picture_window_message_new_line_x if name.empty?
  228.     # 立ち絵がない
  229.     return a1_stand_picture_window_message_new_line_x unless stand_pic_enable?(name)
  230.     # 顔グラフィックスを一度emptyにする
  231.     $game_message.face_name = "" if @stand_pic[name].enable_bitmap?(index)
  232.     # 従来の改行処理
  233.     ret = a1_stand_picture_window_message_new_line_x
  234.     # 顔グラフィックスを戻す
  235.     $game_message.face_name = file_name
  236.     return ret
  237.   end
  238.   #--------------------------------------------------------------------------
  239.   # ○ 立ち絵作成
  240.   #--------------------------------------------------------------------------
  241.   def create_stand_pic(file_name, name, index, duration = MOVE_DURATION)
  242.    
  243.     @stand_pic[name] = Game_StandPic.new(name, index, self.height)
  244.    
  245.     return if @stand_pic[name].pic_sprite == nil
  246.     return unless $game_system.show_stand_picture
  247.    
  248.     if @show_pos.size == 0
  249.       pos = LEFT
  250.       @show_pos[0] = name
  251.       
  252.     elsif @show_pos.size == 1
  253.       pos = RIGHT
  254.       @show_pos[1] = name
  255.    
  256.     else
  257.       change_character(file_name, name, index)
  258.       return true
  259.     end
  260.    
  261.     @stand_pic[name].show(file_name, pos,index, duration)
  262.     return true
  263.    
  264.   end
  265.   #--------------------------------------------------------------------------
  266.   # ○ 表示する立ち絵の変更
  267.   #--------------------------------------------------------------------------
  268.   def change_character(file_name, name, index, duration = MOVE_DURATION)
  269.    
  270.     return if @stand_pic[name].pic_sprite == nil
  271.     return unless $game_system.show_stand_picture
  272.    
  273.     no_index = no_prev_index
  274.     no_prev_name = @show_pos[no_index]
  275.    
  276.     case no_index
  277.     when 0
  278.       @stand_pic[no_prev_name].bye("L",BYE_DURATION) if stand_pic_enable?(no_prev_name)
  279.       pos = LEFT
  280.       @show_pos[0] = name
  281.       
  282.     when 1
  283.       @stand_pic[no_prev_name].bye("R",BYE_DURATION) if stand_pic_enable?(no_prev_name)
  284.       pos = RIGHT
  285.       @show_pos[1] = name
  286.     end
  287.     @stand_pic[name].show(file_name, pos,index, duration) if stand_pic_enable?(name)
  288.   end
  289.   #--------------------------------------------------------------------------
  290.   # ○ 直前に話していないIndexを取得
  291.   #--------------------------------------------------------------------------
  292.   def no_prev_index
  293.     return 0 if @show_pos[0] != @prev_name
  294.     return 1 if @show_pos[1] != @prev_name
  295.   end
  296.   #--------------------------------------------------------------------------
  297.   # ○ 表示されているか調べる
  298.   #--------------------------------------------------------------------------
  299.   def show_pos(name)
  300.     return 0 if @show_pos[0] == name
  301.     return 1 if @show_pos[1] == name
  302.     return -1
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   # ☆ フレーム更新
  306.   #--------------------------------------------------------------------------
  307.   alias a1_stand_pic_window_message_update update
  308.   def update
  309.     update_stand_pic
  310.     a1_stand_pic_window_message_update
  311.   end
  312.   #--------------------------------------------------------------------------
  313.   # ○ 立ち絵のアップデート
  314.   #--------------------------------------------------------------------------
  315.   def update_stand_pic
  316.     for name in @stand_pic.keys
  317.       @stand_pic[name].update
  318.     end
  319.   end
  320.   #--------------------------------------------------------------------------
  321.   # ○ 文章のチェック
  322.   #--------------------------------------------------------------------------
  323.   alias a1_stand_pic_wm_chk_text chk_text
  324.   def chk_text(text)
  325.     text.gsub!(/\eERASE/,"")
  326.     text.gsub!(/\eSHOW/,"")
  327.     return a1_stand_pic_wm_chk_text(text)
  328.   end
  329.   #--------------------------------------------------------------------------
  330.   # ☆ 制御文字の処理
  331.   #     code : 制御文字の本体部分(「\C[1]」なら「C」)
  332.   #     text : 描画処理中の文字列バッファ(必要なら破壊的に変更)
  333.   #     pos  : 描画位置 {:x, :y, :new_x, :height}
  334.   #--------------------------------------------------------------------------
  335.   alias a1_stand_pic_wm_process_escape_character process_escape_character
  336.   def process_escape_character(code, text, pos)
  337.    
  338.     file_name = $game_message.face_name
  339.     file_index = $game_message.face_index
  340.    
  341.     file_info = find_name(file_name, file_index)
  342.     name = file_info[0]
  343.     index = file_info[1]
  344.    
  345.     case code.upcase
  346.     when 'TURN'
  347.       text.slice!(/\[(.)\]/) rescue 0
  348.       if stand_bitmap_enable?(name, index)
  349.         case $1
  350.         when 'L'
  351.           @stand_pic[name].pic_sprite.mirror = true
  352.         when 'R'
  353.           @stand_pic[name].pic_sprite.mirror = false
  354.         end
  355.       end
  356.       return true
  357.       
  358.     when 'RETURN'
  359.       text.slice!(/\[(\d+)\]/) rescue 0
  360.       if stand_bitmap_enable?(name, index)
  361.         index = show_pos(name)
  362.         return if index == -1
  363.         duration = $1.to_i
  364.         @stand_pic[name].return_pos(index, duration)
  365.       end
  366.       
  367.     when 'SHOW'
  368.       if stand_bitmap_enable?(name, index)
  369.         return if @stand_pic[name].pic_sprite == nil or name.empty?
  370.         @stand_pic[name].pic_sprite.visible = true
  371.       end
  372.       
  373.     when 'ERASE'
  374.       if stand_bitmap_enable?(name, index)
  375.         return if @stand_pic[name].pic_sprite == nil or name.empty?
  376.         @stand_pic[name].pic_sprite.visible = false
  377.       end
  378.       
  379.     when 'TONE'
  380.       text.slice!(/\[(.+)\]/) rescue 0
  381.       if stand_bitmap_enable?(name, index)
  382.         params = $1.to_s.split(",")
  383.         duration = params[0].to_i
  384.         red   = $a1_common.minus_to_i(params[1])
  385.         green = $a1_common.minus_to_i(params[2])
  386.         blue  = $a1_common.minus_to_i(params[3])
  387.         gray  = $a1_common.minus_to_i(params[4]) unless params[4] == nil
  388.         if gray == nil
  389.           tone = Tone.new(red, green, blue)
  390.         else
  391.           tone = Tone.new(red, green, blue, gray)
  392.         end
  393.         @stand_pic[name].start_tone_change(tone, duration)
  394.       end
  395.       
  396.     when 'MV'
  397.       text.slice!(/\[([-]*\d+)[,]([-]*\d+)[,](\d+)\]/) rescue 0
  398.       if stand_bitmap_enable?(name, index)
  399.         x = $a1_common.minus_to_i($1)
  400.         y = $a1_common.minus_to_i($2)
  401.         duration = $3.to_i
  402.         @stand_pic[name].move(x, y, duration)
  403.       end
  404.       
  405.     when 'MVA'
  406.       text.slice!(/\[([-]*\d+)[,]([-]*\d+)[,](\d+)\]/) rescue 0
  407.       if stand_bitmap_enable?(name, index)
  408.         x = $a1_common.minus_to_i($1)
  409.         y = $a1_common.minus_to_i($2)
  410.         duration = $3.to_i
  411.         @stand_pic[name].move_plus(x, y, duration)
  412.       end
  413.       
  414.     when 'OP'
  415.       text.slice!(/\[(\d+)[,](\d+)\]/) rescue 0
  416.       if stand_bitmap_enable?(name, index)
  417.         @stand_pic[name].change_opacity($1.to_i,$2.to_i)
  418.       end
  419.       
  420.     when 'BYE'
  421.       text.slice!(/^\[(.)[,](\d+)\]/) rescue 0
  422.       if stand_bitmap_enable?(name, index)
  423.         @show_pos.delete_at(show_pos(name))
  424.         @stand_pic[name].bye($1,$2.to_i)
  425.       end
  426.       
  427.     else
  428.       a1_stand_pic_wm_process_escape_character(code, text, pos)
  429.     end
  430.   end
  431.   #--------------------------------------------------------------------------
  432.   # ☆ 通常文字の処理
  433.   #--------------------------------------------------------------------------
  434.   alias a1_stand_pic_wm_process_normal_character process_normal_character
  435.   def process_normal_character(c, pos)
  436.    
  437.     file_name = $game_message.face_name
  438.     file_index = $game_message.face_index
  439.    
  440.     file_info = find_name(file_name, file_index)
  441.     name = file_info[0]
  442.     index = file_info[1]
  443.    
  444.     if stand_bitmap_enable?(name, index)
  445.       @stand_pic[name].mouth_move
  446.     end
  447.     a1_stand_pic_wm_process_normal_character(c, pos)
  448.   end
  449.   #--------------------------------------------------------------------------
  450.   # ○ 立ち絵が有効?
  451.   #--------------------------------------------------------------------------
  452.   def stand_pic_enable?(name)
  453.     return false if name.empty?
  454.     return false if @stand_pic[name] == nil
  455.     return false if @stand_pic[name].pic_sprite == nil
  456.     return false unless $game_system.show_stand_picture
  457.     return true
  458.   end
  459.   #--------------------------------------------------------------------------
  460.   # ○ ビットマップが有効?
  461.   #--------------------------------------------------------------------------
  462.   def stand_bitmap_enable?(name, index)
  463.     return false if name.empty?
  464.     return false if @stand_pic[name].pic_sprite == nil
  465.     return false unless @stand_pic[name].enable_bitmap?(index)
  466.     return false unless $game_system.show_stand_picture
  467.     return true
  468.   end
  469.   #--------------------------------------------------------------------------
  470.   # ☆ 解放
  471.   #--------------------------------------------------------------------------
  472.   alias a1_stand_pic_window_message_dispose dispose
  473.   def dispose
  474.     a1_stand_pic_window_message_dispose
  475.     dispose_stand_picture
  476.   end
  477.   #--------------------------------------------------------------------------
  478.   # ○ 立ち絵の解放
  479.   #--------------------------------------------------------------------------
  480.   def dispose_stand_picture
  481.     for name in @stand_pic.keys
  482.       next if @stand_pic[name] == nil
  483.       next if @stand_pic[name].bitmap == nil
  484.       @stand_pic[name].erase
  485.     end
  486.   end
  487.   #--------------------------------------------------------------------------
  488.   # ○ 名前の検索
  489.   #--------------------------------------------------------------------------
  490.   def find_name(filename, fileindex)
  491.     list = A1_System::StandPicture::NAME_CHANGE["#{filename}_#{fileindex}"]
  492.     list = A1_System::StandPicture::NAME_CHANGE[filename] unless list
  493.     return [filename, fileindex] unless list
  494.     return list
  495.   end
  496. end
  497. #==============================================================================
  498. # ■ Game_StandPic
  499. #==============================================================================

  500. class Game_StandPic
  501.   #--------------------------------------------------------------------------
  502.   # ○ 定数
  503.   #--------------------------------------------------------------------------
  504.   LEFT                = 0
  505.   RIGHT               = 1
  506.   MOVE_DURATION       = 30
  507.   MOUTH_MOVE_DURATION = 4
  508.   AUTO_Y              = A1_System::StandPicture::AUTO_Y
  509.   PERSONAL_Y          = A1_System::StandPicture::PERSONAL_Y
  510.   #--------------------------------------------------------------------------
  511.   # ○ 公開インスタンス変数
  512.   #--------------------------------------------------------------------------
  513.   attr_reader   :x                        # X 座標
  514.   attr_reader   :y                        # Y 座標
  515.   attr_reader   :opacity                  # 不透明度
  516.   attr_reader   :tone                     # 色調
  517.   attr_reader   :mirror                   # 左右反転
  518.   attr_reader   :pic_sprite               # スプライト
  519.   attr_reader   :bitmap                   # ビットマップの配列
  520.   #--------------------------------------------------------------------------
  521.   # ○ オブジェクト初期化
  522.   #--------------------------------------------------------------------------
  523.   def initialize(name, index, window_height)
  524.     @name = name
  525.     @duration = 0
  526.     @target_opacity = 255.0
  527.     @tone = Tone.new(0, 0, 0, 0)
  528.     @tone_target = Tone.new(0, 0, 0, 0)
  529.     @tone_duration = 0
  530.     [url=home.php?mod=space&uid=111303]@mirror[/url] = false
  531.     @pic_sprite = nil
  532.    
  533.     @window_height = window_height
  534.     @face_index    = index
  535.    
  536.     @face_index = 0
  537.     @mouth_index = 0
  538.     @mouth_move_duration = 0
  539.     @pos = -1
  540.    
  541.     @bitmap = []
  542.     @bitmap_test = []
  543.     plus = (index / 8) * 8
  544.     create_bitmap(name, plus)
  545.    
  546.     @pic_sprite = create_sprite if @bitmap.size > 0
  547.   end
  548.   #--------------------------------------------------------------------------
  549.   # ○ スプライトの作成
  550.   #--------------------------------------------------------------------------
  551.   def create_sprite
  552.     pic_sprite = Sprite.new
  553.     pic_sprite.visible = false
  554.     return pic_sprite
  555.   end
  556.   #--------------------------------------------------------------------------
  557.   # ○ ビットマップの作成
  558.   #--------------------------------------------------------------------------
  559.   def create_bitmap(name, plus = 0)
  560.     file = sprintf("Graphics/Pictures/%s",name)
  561.     Dir::glob(sprintf("%s*.*",file)).each {|f|
  562.       next unless f =~ /#{file}_(\d+)_(\d+)/i
  563.       next unless FileTest.file?(f)
  564.       next unless file_ext(f)
  565.       index = $1.to_i + plus
  566.       @bitmap[index] = [] if @bitmap[index] == nil
  567.       file_name = File.basename(f,".*")
  568.       @bitmap[index][$2.to_i] = Cache.picture(file_name)
  569.       @bitmap_test[index] = true
  570.     }
  571.   end
  572.   #--------------------------------------------------------------------------
  573.   # ○ 拡張子を調べる
  574.   #--------------------------------------------------------------------------
  575.   def file_ext(f)
  576.     return true if File::extname(f) == ".png"
  577.     return true if File::extname(f) == ".bmp"
  578.     return false
  579.   end
  580.   #--------------------------------------------------------------------------
  581.   # ○ ビットマップの存在を調べる
  582.   #--------------------------------------------------------------------------
  583.   def enable_bitmap?(index)
  584.     return false if @bitmap[index] == nil
  585.     return true
  586.   end
  587.   #--------------------------------------------------------------------------
  588.   # ○ 代替ビットマップの検索
  589.   #--------------------------------------------------------------------------
  590.   def search_bitmap
  591.     for bitmap in @bitmap
  592.       next if bitmap == nil
  593.       return bitmap[0]
  594.     end
  595.   end
  596.   #--------------------------------------------------------------------------
  597.   # ○ ピクチャの表示
  598.   #--------------------------------------------------------------------------
  599.   def show(file_name, pos, index, duration, opacity = 255)
  600.    
  601.     @face_index = index
  602.     @pos = pos
  603.    
  604.     if @bitmap[@face_index] == nil and @bitmap_test[@face_index] != true
  605.       plus = (@face_index / 8) * 8
  606.       create_bitmap(file_name, plus)
  607.     end
  608.    
  609.     if @bitmap[@face_index] == nil or $game_system.show_stand_picture == false
  610.       @pic_sprite.bitmap = nil
  611.       @pic_sprite.visible = false
  612.       bitmap = search_bitmap
  613.     else
  614.       @pic_sprite.visible = true
  615.       @pic_sprite.bitmap = @bitmap[@face_index][0]
  616.       bitmap = @pic_sprite.bitmap
  617.     end
  618.    
  619.     fix_pos(pos, duration, bitmap, opacity)
  620.    
  621.     return true
  622.   end
  623.   #--------------------------------------------------------------------------
  624.   # ○ 場所確定
  625.   #--------------------------------------------------------------------------
  626.   def fix_pos(pos, duration, bitmap, opacity)
  627.     case pos
  628.     when LEFT
  629.       @pic_sprite.x = (0 - bitmap.width).to_f
  630.       @target_x = 0.0
  631.       @duration = duration
  632.       @pic_sprite.mirror = false
  633.       
  634.     when RIGHT
  635.       @pic_sprite.x = Graphics.width.to_f
  636.       @target_x = (Graphics.width - bitmap.width).to_f
  637.       @duration = duration
  638.       @pic_sprite.mirror = true
  639.     end
  640.     @pic_sprite.opacity = opacity.to_f
  641.     @pic_sprite.visible = true
  642.     @pic_sprite.y = set_basic_y(bitmap.height).to_f
  643.     @target_y = @pic_sprite.y
  644.   end
  645.   #--------------------------------------------------------------------------
  646.   # ○ 基本y座標の設定
  647.   #--------------------------------------------------------------------------
  648.   def set_basic_y(height)
  649.     by = PERSONAL_Y["#{@name}_#{@face_index}"]
  650.     return by if by
  651.     by = PERSONAL_Y[@name]
  652.     return by if by
  653.     return Graphics.height - height - @window_height if AUTO_Y == "ウィンドウ上"
  654.     return Graphics.height - height
  655.   end
  656.   #--------------------------------------------------------------------------
  657.   # ○ 定位置に戻る
  658.   #--------------------------------------------------------------------------
  659.   def return_pos(pos, duration)
  660.     case pos
  661.     when LEFT
  662.       @target_x = 0.0
  663.       @duration = duration
  664.       @pic_sprite.mirror = false
  665.       
  666.     when RIGHT
  667.       @target_x = (Graphics.width - @pic_sprite.bitmap.width).to_f
  668.       @duration = duration
  669.       @pic_sprite.mirror = true
  670.     end
  671.     @target_y = set_basic_y(@pic_sprite.bitmap.height).to_f
  672.   end
  673.   #--------------------------------------------------------------------------
  674.   # ○ 顔変更
  675.   #--------------------------------------------------------------------------
  676.   def change_face(name, index)
  677.     @face_index = index
  678.    
  679.     if @bitmap[@face_index] == nil and @bitmap_test[@face_index] != true
  680.       plus = (@face_index / 8) * 8
  681.       create_bitmap(name, plus)
  682.     end
  683.    
  684.     if @bitmap[@face_index] == nil or $game_system.show_stand_picture == false
  685.       @pic_sprite.bitmap = nil
  686.       @pic_sprite.visible = false
  687.       
  688.     else
  689.       @pic_sprite.bitmap = @bitmap[@face_index][0]
  690.       case @pos
  691.       when LEFT
  692.         @pic_sprite.x = 0.0
  693.         
  694.       when RIGHT
  695.         @pic_sprite.x = (Graphics.width - @pic_sprite.bitmap.width).to_f
  696.       end
  697.       @pic_sprite.y = set_basic_y(@pic_sprite.bitmap.height).to_f
  698.       @target_x = @pic_sprite.x
  699.       @target_y = @pic_sprite.y
  700.       
  701.       @pic_sprite.visible = true
  702.     end
  703.   end
  704.   #--------------------------------------------------------------------------
  705.   # ○ 口パク
  706.   #--------------------------------------------------------------------------
  707.   def mouth_move
  708.    
  709.     return if @mouth_move_duration > 0
  710.     return if bitmap[@face_index] == nil
  711.     return if bitmap[@face_index].size == 1
  712.    
  713.     @mouth_move_duration = MOUTH_MOVE_DURATION
  714.    
  715.     if @mouth_index == 0 and bitmap[@face_index][1] != nil
  716.       @mouth_index = 1
  717.     elsif @mouth_index == 1
  718.       @mouth_index = 0
  719.     end
  720.     @pic_sprite.bitmap = bitmap[@face_index][@mouth_index]
  721.   end
  722.   #--------------------------------------------------------------------------
  723.   # ○ ピクチャの移動
  724.   #--------------------------------------------------------------------------
  725.   def move(x, y, duration)
  726.     @target_x = x
  727.     @target_y = y
  728.     @duration = duration
  729.   end
  730.   #--------------------------------------------------------------------------
  731.   # ○ 透明度変更
  732.   #--------------------------------------------------------------------------
  733.   def change_opacity(opacity, duration)
  734.     @target_opacity = opacity
  735.     @duration = duration
  736.   end
  737.   #--------------------------------------------------------------------------
  738.   # ○ 相対移動
  739.   #--------------------------------------------------------------------------
  740.   def move_plus(x, y, duration)
  741.     @target_x = @pic_sprite.x + x
  742.     @target_y = @pic_sprite.y + y
  743.     @duration = duration
  744.   end
  745.   #--------------------------------------------------------------------------
  746.   # ○ 退場
  747.   #--------------------------------------------------------------------------
  748.   def bye(direction, duration)
  749.    
  750.     return if @pic_sprite.bitmap == nil
  751.    
  752.     case direction
  753.     when "D"
  754.       @target_y = Graphics.height
  755.     when "R"
  756.       @target_x = Graphics.width
  757.     when "L"
  758.       @target_x = 0 - @pic_sprite.bitmap.width
  759.     end
  760.     @duration = duration
  761.   end
  762.   #--------------------------------------------------------------------------
  763.   # ○ 色調変更の開始
  764.   #--------------------------------------------------------------------------
  765.   def start_tone_change(tone, duration)
  766.     @tone_target = tone.clone
  767.     @tone_duration = duration
  768.     if @tone_duration == 0
  769.       @tone = @tone_target.clone
  770.     end
  771.   end
  772.   #--------------------------------------------------------------------------
  773.   # ○ ピクチャの消去
  774.   #--------------------------------------------------------------------------
  775.   def erase
  776.     for arr in @bitmap
  777.       next if arr == nil
  778.       for bitmap in arr
  779.         next if bitmap == nil
  780.         bitmap.dispose
  781.       end
  782.     end
  783.     @bitmap = nil
  784.     return if @pic_sprite == nil
  785.     @pic_sprite.dispose
  786.     @pic_sprite = nil
  787.   end
  788.   #--------------------------------------------------------------------------
  789.   # ○ フレーム更新
  790.   #--------------------------------------------------------------------------
  791.   def update
  792.    
  793.     return if @pic_sprite == nil
  794.    
  795.     @mouth_move_duration -= 1 if @mouth_move_duration > 0
  796.     if @duration >= 1
  797.       d = @duration
  798.       @pic_sprite.x = (@pic_sprite.x * (d - 1) + @target_x) / d
  799.       @pic_sprite.y = (@pic_sprite.y * (d - 1) + @target_y) / d
  800.       @pic_sprite.opacity = (@pic_sprite.opacity * (d - 1) + @target_opacity) / d
  801.       @duration -= 1
  802.       @pic_sprite.z = 101
  803.     end
  804.     if @tone_duration >= 1
  805.       d = @tone_duration
  806.       @tone.red = (@tone.red * (d - 1) + @tone_target.red) / d
  807.       @tone.green = (@tone.green * (d - 1) + @tone_target.green) / d
  808.       @tone.blue = (@tone.blue * (d - 1) + @tone_target.blue) / d
  809.       @tone.gray = (@tone.gray * (d - 1) + @tone_target.gray) / d
  810.       @tone_duration -= 1
  811.       @pic_sprite.tone = @tone
  812.     end
  813.   end
  814. end
  815. #==============================================================================
  816. # ■ Game_System
  817. #------------------------------------------------------------------------------
  818. #  システム周りのデータを扱うクラスです。乗り物や BGM などの管理も行います。
  819. # このクラスのインスタンスは $game_system で参照されます。
  820. #==============================================================================

  821. class Game_System
  822.   #--------------------------------------------------------------------------
  823.   # ○ 公開インスタンス変数
  824.   #--------------------------------------------------------------------------
  825.   attr_accessor :show_stand_picture                # 立ち絵表示フラグ
  826.   #--------------------------------------------------------------------------
  827.   # ☆ オブジェクト初期化
  828.   #--------------------------------------------------------------------------
  829.   alias a1_stand_picture_game_system_initialize initialize
  830.   def initialize
  831.     a1_stand_picture_game_system_initialize
  832.     @show_stand_picture = false
  833.   end
  834. end
  835. #==============================================================================
  836. # ■ A1_System::CommonModule
  837. #==============================================================================

  838. class A1_System::CommonModule
  839.   #--------------------------------------------------------------------------
  840.   # ☆ 注釈コマンド定義
  841.   #--------------------------------------------------------------------------
  842.   alias a1_stand_picture_define_command define_command
  843.   def define_command
  844.     a1_stand_picture_define_command
  845.     @cmd_108["立ち絵表示"] = :stand_picture
  846.   end
  847. end
  848. #==============================================================================
  849. # ■ Game_Interpreter
  850. #------------------------------------------------------------------------------
  851. #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
  852. # Game_Troop クラス、Game_Event クラスの内部で使用されます。
  853. #==============================================================================

  854. class Game_Interpreter
  855.   #--------------------------------------------------------------------------
  856.   # ○ 立ち絵表示
  857.   #--------------------------------------------------------------------------
  858.   def stand_picture(params)
  859.     $game_system.show_stand_picture = params[0] == "on" ? true : false
  860.   end
  861. end
  862. end
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1