Project1

标题: Mog的菜单纸针在截图存档界面的左列表错位(已经解决) [打印本页]

作者: IndigoIX    时间: 2022-2-5 01:34
标题: Mog的菜单纸针在截图存档界面的左列表错位(已经解决)
本帖最后由 IndigoIX 于 2022-2-5 19:09 编辑


已解决……更新解决后的效果……
------------------------------------------------------------------------
用的脚本是这两个……Mog_Menu_Cursor和VA图书馆的截图存档脚本
几乎不懂脚本,完全不知道从哪里入手改
RUBY 代码复制
  1. #==============================================================================
  2. # +++ MOG - Animated Cursor (V1.2) +++
  3. #==============================================================================
  4. # By Moghunter
  5. # http://www.atelier-rgss.com/
  6. #==============================================================================
  7. # Adiciona um cursor animado nos menus de comandos.
  8. #==============================================================================
  9. # Será necessário ter a imagem
  10. #
  11. # Menu_Cursor.png
  12. #
  13. # gravado na pasta GRAPHICS/SYSTEM/
  14. #==============================================================================
  15. # Ativando a animação do cursor
  16. #
  17. # Basta criar uma imagem que tenha a largura com no minimo o dobro de altura da
  18. # imagem do cursor.
  19. #
  20. # EX
  21. # largura 32 pixel (width) altura 32 pixel = 1 frames de animação.(Sem animação)
  22. # largura 64 pixel (width) altura 32 pixel = 2 frames de animação.
  23. # largura 128 pixel (width) altura 32 pixel = 4 frames de animação.
  24. # largura 256 pixel (width) altura 32 pixel = 8 frames de animação
  25. # Etc...
  26. #
  27. # NOTA
  28. # Não há limite para quantidade de frames de animação, se não quiser a animação
  29. # basta criar uma imagem com a altura proporcional a largura da imagem.
  30. #
  31. #==============================================================================
  32. # ● Histórico (Version History)
  33. #==============================================================================
  34. # v 1.1 - Correção da posição do cursor na cena de batalha.
  35. #==============================================================================
  36.  
  37. module MOG_MENU_CURSOR
  38.   #Ativar animação do cursor se movimentando para os lados.
  39.   SIDE_ANIMATION = true
  40.   #Definição da posição do cursor. (Ajustes na posição)
  41.   CURSOR_POSITION = [0,0]
  42.   #Definição da velocidade da animação de frames.
  43.   CURSOR_ANIMATION_SPEED = 6
  44. end
  45.  
  46. #==============================================================================
  47. # ■ Game_System
  48. #==============================================================================
  49. class Game_System
  50.  
  51.   attr_accessor :menu_cursor_name
  52.  
  53.   #--------------------------------------------------------------------------
  54.   # ● Initialize
  55.   #--------------------------------------------------------------------------      
  56.   alias mog_menu_cursor_initialize initialize
  57.   def initialize
  58.       mog_menu_cursor_initialize
  59.       @menu_cursor_name = "Menu_Cursor"
  60.   end  
  61.  
  62. end  
  63.  
  64. #==============================================================================
  65. # ■ Game_Temp
  66. #==============================================================================
  67. class Game_Temp
  68.  
  69.   attr_accessor :menu_cursor   
  70.  
  71.   #--------------------------------------------------------------------------
  72.   # ● Initialize
  73.   #--------------------------------------------------------------------------      
  74.   alias mog_cursor_sprite_initialize initialize
  75.   def initialize
  76.       mog_cursor_sprite_initialize
  77.       @menu_cursor = [false,0,0,0]
  78.   end  
  79.  
  80. end  
  81.  
  82. #==============================================================================
  83. # ■ Sprite Cursor
  84. #==============================================================================
  85. class Sprite_Cursor < Sprite
  86.  
  87.   include MOG_MENU_CURSOR
  88.  
  89.   #--------------------------------------------------------------------------
  90.   # ● Initialize
  91.   #--------------------------------------------------------------------------   
  92.   def initialize(viewport = nil , x , y)
  93.       super(viewport)
  94.       @cursor_image = Cache.system($game_system.menu_cursor_name.to_s)
  95.       @frame_max = (@cursor_image.width / @cursor_image.height) rescue 1
  96.       @frame_range = @frame_max > 0 ? (@cursor_image.width  / @frame_max) : 1
  97.       @frame = 0
  98.       @ca_speed = CURSOR_ANIMATION_SPEED
  99.       self.bitmap = Bitmap.new(@frame_range,@frame_range)
  100.       self.z = 10000
  101.       self.opacity = 0
  102.       @cw = self.bitmap.width / 2
  103.       @c_p = [-@cw + CURSOR_POSITION[0],CURSOR_POSITION[1]]
  104.       @mx = [0,0,0]
  105.       refresh_animation(true)
  106.       update_move
  107.   end
  108.  
  109.   #--------------------------------------------------------------------------
  110.   # ● Dispose
  111.   #--------------------------------------------------------------------------   
  112.   def dispose
  113.       self.bitmap.dispose
  114.       self.bitmap = nil
  115.       @cursor_image.dispose
  116.       super
  117.   end  
  118.  
  119.   #--------------------------------------------------------------------------
  120.   # ● Update
  121.   #--------------------------------------------------------------------------  
  122.   def update
  123.       if cursor_visible?
  124.          self.visible = true
  125.          update_move
  126.          refresh_animation(false)
  127.       else   
  128.          self.visible = false
  129.       end  
  130.   end
  131.  
  132.   #--------------------------------------------------------------------------
  133.   # ● Initialize
  134.   #--------------------------------------------------------------------------      
  135.   def refresh_animation(start = false)
  136.       @ca_speed += 1
  137.       return if @frame_max == 1 and !start
  138.       return if @ca_speed < CURSOR_ANIMATION_SPEED
  139.       @ca_speed = 0
  140.       self.bitmap.clear
  141.       scr_rect = Rect.new(@frame_range * @frame,0,@frame_range,@frame_range)
  142.       self.bitmap.blt(0,0,@cursor_image, scr_rect)
  143.       @frame += 1
  144.       @frame = 0 if @frame >= @frame_max
  145.   end  
  146.  
  147.   #--------------------------------------------------------------------------
  148.   # ● Cursor Visible?
  149.   #--------------------------------------------------------------------------   
  150.   def cursor_visible?
  151.       px = $game_temp.menu_cursor[2]
  152.       py = $game_temp.menu_cursor[3]
  153.       return false if $game_temp.menu_cursor[1] == 0
  154.       return false if px < 0 or py < 0 or (px == 0 and py == 0)
  155.       return true
  156.   end  
  157.  
  158.   #--------------------------------------------------------------------------
  159.   # ● Update Move
  160.   #--------------------------------------------------------------------------   
  161.   def update_move
  162.       self.opacity += 25
  163.       @new_pos = [$game_temp.menu_cursor[2],$game_temp.menu_cursor[3]]
  164.       execute_animation_s
  165.       execute_move(0,self.x, @new_pos[0] + @mx[1] + @c_p[0])
  166.       execute_move(1,self.y, @new_pos[1] + @c_p[1])
  167.   end  
  168.  
  169.   #--------------------------------------------------------------------------
  170.   # ● Execute Animation S
  171.   #--------------------------------------------------------------------------      
  172.   def execute_animation_s
  173.       return if !SIDE_ANIMATION
  174.       @mx[2] += 1
  175.       return if @mx[2] < 4
  176.       @mx[2] = 0
  177.       @mx[0] += 1
  178.       case @mx[0]
  179.          when 1..7;  @mx[1] += 1            
  180.          when 8..14; @mx[1] -= 1
  181.          else
  182.            @mx[0] = 0
  183.            @mx[1] = 0
  184.       end
  185.   end
  186.  
  187.   #--------------------------------------------------------------------------
  188.   # ● Execute Move
  189.   #--------------------------------------------------------------------------      
  190.   def execute_move(type,cp,np)
  191.       sp = 5 + ((cp - np).abs / 5)
  192.       if cp > np
  193.          cp -= sp
  194.          cp = np if cp < np
  195.       elsif cp < np
  196.          cp += sp
  197.          cp = np if cp > np
  198.       end     
  199.       self.x = cp if type == 0
  200.       self.y = cp if type == 1
  201.   end  
  202.  
  203. end
  204.  
  205. #==============================================================================
  206. # ■ CURSOR_MENU SPRITE
  207. #==============================================================================
  208. module CURSOR_MENU_SPRITE
  209.  
  210.   #--------------------------------------------------------------------------
  211.   # ● Cursor Sprite Enable
  212.   #--------------------------------------------------------------------------      
  213.   def cursor_sprite_enable
  214.       return if self.index == nil rescue return
  215.       create_cursor_sprite
  216.       update_cursor_sprite
  217.       update_cusor_position
  218.       if !self.active
  219.          $game_temp.menu_cursor[1] -= 1 if $game_temp.menu_cursor[1] > 0
  220.       end
  221.   end
  222.  
  223.   #--------------------------------------------------------------------------
  224.   # ● Create Cursor Sprite
  225.   #--------------------------------------------------------------------------   
  226.   def create_cursor_sprite
  227.       return if @cursor != nil
  228.       return if $game_temp.menu_cursor[0]
  229.       $game_temp.menu_cursor[0] = true
  230.       reset_cursor_position
  231.       @cursor = Sprite_Cursor.new(nil,x,y)
  232.       @cursor_name = $game_system.menu_cursor_name
  233.   end   
  234.  
  235.   #--------------------------------------------------------------------------
  236.   # ● Dispose Cursor Sprite
  237.   #--------------------------------------------------------------------------      
  238.   def dispose_cursor_sprite
  239.       return if @cursor == nil
  240.       $game_temp.menu_cursor[0] = false
  241.       reset_cursor_position
  242.       @cursor.dispose
  243.       @cursor = nil
  244.   end  
  245.  
  246.   #--------------------------------------------------------------------------
  247.   # ● Reset Cursor Position
  248.   #--------------------------------------------------------------------------        
  249.   def reset_cursor_position
  250.       $game_temp.menu_cursor[1] = 0
  251.       $game_temp.menu_cursor[2] = -32
  252.       $game_temp.menu_cursor[3] = -32
  253.   end  
  254.  
  255.   #--------------------------------------------------------------------------
  256.   # ● Update Cursor
  257.   #--------------------------------------------------------------------------         
  258.   def update_cursor_sprite
  259.       return if @cursor == nil
  260.       @cursor.update
  261.       refresh_cursor_sprite if @cursor_name != $game_system.menu_cursor_name
  262.   end
  263.  
  264.   #--------------------------------------------------------------------------
  265.   # ● Refresh Cursor Sprite
  266.   #--------------------------------------------------------------------------            
  267.   def refresh_cursor_sprite
  268.       @cursor_name = $game_system.menu_cursor_name
  269.       dispose_cursor_sprite
  270.       create_cursor_sprite
  271.   end  
  272.  
  273.   #--------------------------------------------------------------------------
  274.   # ● Update Cursor Position
  275.   #--------------------------------------------------------------------------         
  276.   def update_cusor_position
  277.       return if !can_update_cursor_position?
  278.       x_v = [0,0]
  279.       if SceneManager.scene_is?(Scene_Battle)
  280.           if self.viewport != nil
  281.              x_v = [-self.viewport.ox, self.viewport.rect.y]
  282.           end
  283.       end      
  284.       x_e = (self.cursor_rect.x + self.x) - self.ox
  285.       $game_temp.menu_cursor[2] = x_e + x_v[0]
  286.       y_e = (self.cursor_rect.y + self.y + self.cursor_rect.height / 2) - self.oy
  287.       $game_temp.menu_cursor[3] = y_e + x_v[1]
  288.       $game_temp.menu_cursor[1] = 13
  289.    end
  290.  
  291.   #--------------------------------------------------------------------------
  292.   # ● Can Update Cursor
  293.   #--------------------------------------------------------------------------            
  294.    def can_update_cursor_position?
  295.        return false if !self.active     
  296.        return false if self.index < 0
  297.        return false if !self.visible
  298.        return true
  299.    end  
  300.  
  301. end
  302.  
  303. #==============================================================================
  304. # ■ Window Base
  305. #==============================================================================
  306. class Window_Base < Window
  307.   include CURSOR_MENU_SPRITE
  308.  
  309.   #--------------------------------------------------------------------------
  310.   # ● Dispose
  311.   #--------------------------------------------------------------------------              
  312.   alias mog_menu_cursor_base_dispose dispose
  313.   def dispose
  314.       mog_menu_cursor_base_dispose
  315.       dispose_cursor_sprite
  316.   end  
  317.  
  318.   #--------------------------------------------------------------------------
  319.   # ● Update
  320.   #--------------------------------------------------------------------------              
  321.   alias mog_cursor_update update
  322.   def update
  323.       mog_cursor_update
  324.       cursor_sprite_enable
  325.   end   
  326.  
  327. end
  328.  
  329. $mog_rgss3_animated_cursor = true

RUBY 代码复制
  1. #==============================================================================
  2. # [PS0]截图存档
  3. #      Window_SaveFile_Plus
  4. #------------------------------------------------------------------------------
  5. #     一种带有截图的存档,同时可以自定义存档数量。
  6. #==============================================================================
  7. # [核心脚本]
  8. #    - 快速储存Bitmap的Marshal         By 柳之一
  9. #------------------------------------------------------------------------------
  10. # [更新记录]
  11. #    - 2012.02.16 By 各种压力的猫君
  12. #      * 修正地图边缘时截图不完整的错误
  13. #    - 2012.01.28 By 各种压力的猫君
  14. #      * 去掉效率较差的双线性缩放算法;
  15. #      * 新增存档管理功能(F5键,复制/移动/删除存档)
  16. #    - 2011.12.27 By 各种压力的猫君
  17. #      * 补上截图阴影;
  18. #      * 新增“不缩放”截图(推荐使用,尤其是大分辨率);
  19. #      * 修正选择不存在的存档时存档列表窗口卡死以及奇怪的SE;
  20. #      * 新增“存档中”提示窗口、覆盖存档提示、删除存档功能(Z键,对应键盘D)
  21. #    - 2011.12.26 By 各种压力的猫君
  22. #      * 功能齐全的测试版
  23. #    - 2011.12.16 By 各种压力的猫君
  24. #      * 移植至RGSS3,遵循PS0协议;
  25. #      * 丰富自定义选项,整合双线性插值算法精简版
  26. #    - 2008.05.26 By 沉影不器
  27. #      * 蓝本(VX新截图存档)
  28. #------------------------------------------------------------------------------
  29. # [使用方法]
  30. #    - 删除原Scene_File、Window_SaveFile 并将本脚本插入到原Scene_File位置。
  31. #    - 或者直接将本脚本插入到MAIN以上,并确保本脚本位于上述两个脚本以下。
  32. #==============================================================================
  33. $_PS0 = {} if $_PS0 == nil  
  34. $_PS0["Window_SaveFile_Plus"] = 20120216
  35. #==============================================================================
  36. # [PS0] 通用配置模块  
  37. #==============================================================================
  38. module PS0
  39.   module Window_SaveFile_Plus
  40.  
  41.     # 最大存档数(范围正整数)
  42.     MAX_SAVE = 12
  43.  
  44.     # 存档目录(默认值 "Saves/";根目录 "")
  45.     SAVE_DIR = "Saves/"   
  46.  
  47.     # 无存档时显示的文字
  48.     NO_DATA  = "无存档"
  49.  
  50.     # 保存时显示的信息
  51.     SAVE_NOW = "存档中..."
  52.  
  53.     # 复制存档时的帮助文字
  54.     HELP_COPY = "要复制到哪个位置?"
  55.  
  56.     # 移动存档时的帮助文字
  57.     HELP_MOVE = "要移动到哪个位置?"
  58.  
  59.     # 是否显示存档中窗口(true:显示;false:不显示)
  60.     # - 分辨率较大时建议显示
  61.     SHOW_SAVE_NOW = false
  62.  
  63.     # 截图缩放使用的插值算法
  64.     # - "NN" 最邻近(速度最快,质量最差,RM默认算法)
  65.     # - "NZ" 不缩放(速度快,质量好,以主角为中心切边,非全屏)
  66.     Zoom_Type = "NZ"
  67.  
  68.     # 双线性插值能获得更好的截图缩放质量,但所需时间较最邻近插值更长。
  69.     # 缩略图尺寸(范围整数,单位像素)
  70.     # - VA默认分辨率(544×416)推荐使用340×260
  71.     # - VA最大分辨率(640×480)推荐使用425×325
  72.     # - 本脚本兼容分辨率解放,窗口大小将自动计算。
  73.     #   请自行计算截图分辨率,注意要确保宽高比一致,
  74.     #   若使用“不缩放”模式则可以不保持一致。
  75.     Thumbnail_Width  = 340  # 宽度
  76.     Thumbnail_Height = 260  # 高度
  77.  
  78.     # 缩略图位置微调(范围整数,单位像素)
  79.     Thumbnail_ox = -2    # 横向
  80.     Thumbnail_oy = -2-32 # 纵向
  81.  
  82.     # 各窗口切换时的渐变帧数
  83.     TRANS_DURATION = 5
  84.  
  85.   end
  86. end
  87. #==============================================================================
  88. # [核心脚本] 快速储存Bitmap的Marshal By 柳之一
  89. #==============================================================================
  90. class Font
  91.   def marshal_dump
  92.   end
  93.   def marshal_load(obj)
  94.   end
  95. end
  96. class Bitmap
  97.   RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  98.   RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  99.   def _dump(limit)
  100.     data = "rgba" * width * height
  101.     RtlMoveMemory_pi.call(data, address, data.length)
  102.     [width, height, Zlib::Deflate.deflate(data)].pack("LLa*")
  103.   end
  104.   def self._load(str)
  105.     w, h, zdata = str.unpack("LLa*")
  106.     b = self.new(w, h)
  107.     RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4)
  108.     return b
  109.   end
  110.   def address
  111.     buffer, ad = "rgba", object_id * 2 + 16
  112.     RtlMoveMemory_pi.call(buffer, ad, 4)
  113.     ad = buffer.unpack("L")[0] + 8
  114.     RtlMoveMemory_pi.call(buffer, ad, 4)
  115.     ad = buffer.unpack("L")[0] + 16
  116.     RtlMoveMemory_pi.call(buffer, ad, 4)
  117.     return buffer.unpack("L")[0]
  118.   end
  119. end
  120. #==============================================================================
  121. # ■ Game_Temp
  122. #==============================================================================
  123. class Game_Temp
  124.   attr_accessor :save_bitmap
  125.   attr_accessor :save_snapshoot
  126.   alias new_initialize initialize
  127.   def initialize
  128.     new_initialize
  129.     @save_bitmap = Bitmap.new(1, 1)
  130.     @save_snapshoot = Bitmap.new(1, 1)
  131.   end
  132. end
  133. #==============================================================================
  134. # ■ SceneManager
  135. #==============================================================================
  136. module SceneManager
  137.   def self.snapshot_for_save
  138.     $game_temp.save_bitmap = Graphics.snap_to_bitmap
  139.     unless FileTest.exist?(PS0::Window_SaveFile_Plus::SAVE_DIR)
  140.       Dir.mkdir(PS0::Window_SaveFile_Plus::SAVE_DIR)
  141.     end
  142.   end
  143. end
  144. #==============================================================================
  145. # ■ Scene_Map
  146. #==============================================================================
  147. class Scene_Map < Scene_Base
  148.   alias save_terminate terminate
  149.   def terminate
  150.     SceneManager.snapshot_for_save
  151.     save_terminate
  152.   end
  153. end
  154. #==============================================================================
  155. # ■ DataManager
  156. #==============================================================================
  157. module DataManager
  158.   def self.save_file_exists?
  159.     !Dir.glob(PS0::Window_SaveFile_Plus::SAVE_DIR + 'Save*.rvdata2').empty?
  160.   end
  161.   def self.make_filename(index)
  162.     sprintf(PS0::Window_SaveFile_Plus::SAVE_DIR + "Save%02d.rvdata2", index + 1)
  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # ● セーブヘッダの作成
  166.   #--------------------------------------------------------------------------
  167.   def self.make_save_header
  168.     d_rect = Rect.new(0, 0, PS0::Window_SaveFile_Plus::Thumbnail_Width,
  169.                             PS0::Window_SaveFile_Plus::Thumbnail_Height)
  170.     case PS0::Window_SaveFile_Plus::Zoom_Type
  171.     when "NN"
  172.       s_rect = $game_temp.save_bitmap.rect
  173.       $game_temp.save_snapshoot = Bitmap.new(d_rect.width, d_rect.height)
  174.       $game_temp.save_snapshoot.stretch_blt(d_rect, $game_temp.save_bitmap, s_rect)
  175.     when "NZ"
  176.       x = [$game_player.screen_x - d_rect.width/2, 0].max
  177.       x = [x, Graphics.width - d_rect.width].min
  178.       y = [$game_player.screen_y - d_rect.height/2, 0].max
  179.       y = [y, Graphics.height - d_rect.height].min
  180.       s_rect = Rect.new(x, y, d_rect.width, d_rect.height)
  181.       $game_temp.save_snapshoot = Bitmap.new(d_rect.width, d_rect.height)
  182.       $game_temp.save_snapshoot.blt(0, 0, $game_temp.save_bitmap, s_rect)
  183.     end
  184.     header = {}
  185.     header[:characters] = $game_party.characters_for_savefile
  186.     header[:playtime_s] = $game_system.playtime_s
  187.     header[:snapshoot]  = $game_temp.save_snapshoot
  188.     header
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # ● セーブの実行
  192.   #--------------------------------------------------------------------------
  193.   def self.save_game(index)
  194.     saving_window = Window_Saving.new
  195.     Graphics.update
  196.     begin
  197.       save_game_without_rescue(index)
  198.     rescue
  199.        delete_save_file(index)
  200.        false
  201.     end
  202.     saving_window.dispose
  203.     return true
  204.   end
  205. end
  206. #==============================================================================
  207. # ■ Window_Yes_Or_No
  208. #------------------------------------------------------------------------------
  209. #  提供“是”、“否”两个选项的窗口(替换、删除存档用)
  210. #==============================================================================
  211. class Window_Yes_Or_No < Window_HorzCommand
  212.   #--------------------------------------------------------------------------
  213.   # ● オブジェクト初期化
  214.   #--------------------------------------------------------------------------
  215.   def initialize(yes, no)
  216.     @yes = yes
  217.     @no = no
  218.     super(130, 0)
  219.     self.visible = false
  220.     self.active = false
  221.     @index = 0
  222.   end
  223.   #--------------------------------------------------------------------------
  224.   # ● 桁数の取得
  225.   #--------------------------------------------------------------------------
  226.   def col_max
  227.     return 2
  228.   end
  229.   #--------------------------------------------------------------------------
  230.   # ● コマンドリストの作成
  231.   #--------------------------------------------------------------------------
  232.   def make_command_list
  233.     add_command(@yes,   :yes)
  234.     add_command(@no,    :cancel)
  235.   end
  236.   #--------------------------------------------------------------------------
  237.   # ● 決定ボタンが押されたときの処理
  238.   #--------------------------------------------------------------------------
  239.   def process_ok
  240.     Input.update
  241.     call_ok_handler
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # ● 按下取消键时的处理
  245.   #--------------------------------------------------------------------------
  246.   def process_cancel
  247.     Input.update
  248.     call_cancel_handler
  249.   end
  250.   #--------------------------------------------------------------------------
  251.   # ● 启用窗口
  252.   #--------------------------------------------------------------------------
  253.   def activate
  254.     temp = self.y + self.height - Graphics.height
  255.     if temp > 0
  256.       self.y -= (temp + 12)
  257.     end
  258.     self.active = true
  259.     self
  260.   end
  261. end
  262. #==============================================================================
  263. # ■ Window_Saving
  264. #------------------------------------------------------------------------------
  265. #  显示保存信息的窗口
  266. #==============================================================================
  267. class Window_Saving < Window_Base
  268.   #--------------------------------------------------------------------------
  269.   # ● オブジェクト初期化
  270.   #--------------------------------------------------------------------------
  271.   def initialize
  272.     w = PS0::Window_SaveFile_Plus::SAVE_NOW.length * 16 + 32
  273.     x = (Graphics.width - w)/2
  274.     y = (Graphics.height - fitting_height(1))/2
  275.     super(x, y, w, fitting_height(1))
  276.     self.visible = PS0::Window_SaveFile_Plus::SHOW_SAVE_NOW
  277.     draw_text_ex(4, 0, PS0::Window_SaveFile_Plus::SAVE_NOW)
  278.   end
  279. end
  280. #==============================================================================
  281. # ■ Window_SaveManagerCommand
  282. #------------------------------------------------------------------------------
  283. #  存档管理窗口
  284. #==============================================================================
  285. class Window_SaveManagerCommand < Window_Command
  286.   #--------------------------------------------------------------------------
  287.   # ● 初始化对象
  288.   #--------------------------------------------------------------------------
  289.   def initialize(*args)
  290.     @copy, @move, @delete, @cancel = args[0..3]
  291.     super(130, 0)
  292.     self.visible = false
  293.     self.active = false
  294.     @index = 0
  295.   end
  296.   #--------------------------------------------------------------------------
  297.   # ● 获取窗口的宽度
  298.   #--------------------------------------------------------------------------
  299.   def window_width
  300.     return 100
  301.   end
  302.   #--------------------------------------------------------------------------
  303.   # ● 获取项目数
  304.   #--------------------------------------------------------------------------
  305.   def item_max
  306.     return 4
  307.   end
  308.   #--------------------------------------------------------------------------
  309.   # ● 生成指令列表
  310.   #--------------------------------------------------------------------------
  311.   def make_command_list
  312.     add_command(@copy,   :copy  )
  313.     add_command(@move,   :move  )
  314.     add_command(@delete, :delete)
  315.     add_command(@cancel, :cancel)
  316.   end
  317.   #--------------------------------------------------------------------------
  318.   # ● 按下确定键时的处理
  319.   #--------------------------------------------------------------------------
  320.   def process_ok
  321.     Input.update
  322.     call_ok_handler
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # ● 启用窗口
  326.   #--------------------------------------------------------------------------
  327.   def activate
  328.     temp = self.y + self.height - Graphics.height
  329.     if temp > 0
  330.       self.y -= (temp + 12)
  331.     end
  332.     self.active = true
  333.     self
  334.   end
  335. end
  336. #==============================================================================
  337. # ■ Window_FileCommand
  338. #------------------------------------------------------------------------------
  339. #  截图存档左侧的选择窗口。
  340. #==============================================================================
  341. class Window_FileCommand < Window_Command
  342.   #--------------------------------------------------------------------------
  343.   # ● オブジェクト初期化
  344.   #--------------------------------------------------------------------------
  345.   def initialize
  346.     super(0, 0)
  347.   end
  348.   #--------------------------------------------------------------------------
  349.   # ● ウィンドウ幅の取得
  350.   #--------------------------------------------------------------------------
  351.   def window_height
  352.     return Graphics.height-fitting_height(1)
  353.   end
  354.   #--------------------------------------------------------------------------
  355.   # ● 表示行数の取得
  356.   #--------------------------------------------------------------------------
  357.   def visible_line_number
  358.     item_max
  359.   end
  360.   #--------------------------------------------------------------------------
  361.   # ● コマンドリストの作成
  362.   #--------------------------------------------------------------------------
  363.   def make_command_list
  364.     add_main_commands
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # ● 主要コマンドをリストに追加
  368.   #--------------------------------------------------------------------------
  369.   def add_main_commands
  370.     for i in 1..PS0::Window_SaveFile_Plus::MAX_SAVE
  371.       if i < 10
  372.         text = Vocab::File + " 0" + i.to_s
  373.       else
  374.         text = Vocab::File + " " + i.to_s
  375.       end
  376.       add_command(text, :file)
  377.     end
  378.   end
  379.   #--------------------------------------------------------------------------
  380.   # ● 決定ボタンが押されたときの処理
  381.   #--------------------------------------------------------------------------
  382.   def process_ok
  383.   end
  384. end
  385. #==============================================================================
  386. # ■ Window_SaveFile
  387. #------------------------------------------------------------------------------
  388. #  セーブ画面およびロード画面で表示する、セーブファイルのウィンドウです。
  389. #==============================================================================
  390. class Window_SaveFile < Window_Base
  391.   #--------------------------------------------------------------------------
  392.   # ● オブジェクト初期化
  393.   #     index : セーブファイルのインデックス
  394.   #--------------------------------------------------------------------------
  395.   def initialize(index)
  396.     super(160, 0, Graphics.width-160, Graphics.height-fitting_height(1))
  397.     @file_index = index
  398.     @selected = true
  399.     refresh
  400.   end
  401.   #--------------------------------------------------------------------------
  402.   # ● リフレッシュ
  403.   #--------------------------------------------------------------------------
  404.   def refresh
  405.     contents.clear
  406.     change_color(normal_color)
  407.     w = (self.width-PS0::Window_SaveFile_Plus::Thumbnail_Width-16)/2
  408.     h = (self.height-PS0::Window_SaveFile_Plus::Thumbnail_Height-16)/2
  409.     width  = w + PS0::Window_SaveFile_Plus::Thumbnail_ox
  410.     height = h + PS0::Window_SaveFile_Plus::Thumbnail_oy
  411.     draw_shadow(width+5, height+5)
  412.     draw_text((self.width-32-PS0::Window_SaveFile_Plus::NO_DATA.length*16)/2,
  413.               self.height/2-32, PS0::Window_SaveFile_Plus::NO_DATA.length*32,
  414.               line_height, PS0::Window_SaveFile_Plus::NO_DATA)
  415.     draw_party_characters(32, Graphics.height-fitting_height(1)-32)
  416.     draw_playtime(-10, contents.height - line_height-10, contents.width - 4, 2)
  417.     draw_snapshoot(width, height)
  418.   end
  419.   #--------------------------------------------------------------------------
  420.   # ● パーティキャラの描画
  421.   #--------------------------------------------------------------------------
  422.   def draw_party_characters(x, y)
  423.     header = DataManager.load_header(@file_index)
  424.     return unless header
  425.     header[:characters].each_with_index do |data, i|
  426.       draw_character(data[0], data[1], x + i * 48, y)
  427.     end
  428.   end
  429.   #--------------------------------------------------------------------------
  430.   # ● プレイ時間の描画
  431.   #--------------------------------------------------------------------------
  432.   def draw_playtime(x, y, width, align)
  433.     header = DataManager.load_header(@file_index)
  434.     return unless header
  435.     draw_text(x, y, width, line_height, header[:playtime_s], 2)
  436.   end
  437.   #--------------------------------------------------------------------------
  438.   # ● 绘制截图
  439.   #--------------------------------------------------------------------------
  440.   def draw_snapshoot(x, y)
  441.     header = DataManager.load_header(@file_index)
  442.     return unless header
  443.     bitmap = header[:snapshoot]
  444.     contents.blt(x, y, bitmap, bitmap.rect)
  445.     bitmap.dispose
  446.   end
  447.   #--------------------------------------------------------------------------
  448.   # ● 绘制阴影
  449.   #--------------------------------------------------------------------------
  450.   def draw_shadow(x, y)
  451.     header = DataManager.load_header(@file_index)
  452.     return unless header
  453.     contents.fill_rect(x, y, PS0::Window_SaveFile_Plus::Thumbnail_Width,
  454.                              PS0::Window_SaveFile_Plus::Thumbnail_Height, Color.new(0, 0, 0))
  455.     contents.blur
  456.   end
  457. end
  458. #==============================================================================
  459. # ■ Scene_File
  460. #------------------------------------------------------------------------------
  461. #  セーブ画面とロード画面の共通処理を行うクラスです。
  462. #==============================================================================
  463. class Scene_File < Scene_MenuBase
  464.   #--------------------------------------------------------------------------
  465.   # ● 開始処理
  466.   #--------------------------------------------------------------------------
  467.   def start
  468.     super
  469.     create_help_window
  470.     create_savefile_viewport
  471.     create_command_window
  472.     create_savefile_window
  473.     create_manager_window
  474.     create_replace_window
  475.     create_delete_window
  476.   end
  477.   #--------------------------------------------------------------------------
  478.   # ● 終了処理
  479.   #--------------------------------------------------------------------------
  480.   def terminate
  481.     super
  482.     @savefile_viewport.dispose
  483.     @savefile_window.dispose
  484.     @command_window.dispose
  485.     @window_manager.dispose
  486.     @window_replace.dispose
  487.     @window_delete.dispose
  488.   end
  489.   #--------------------------------------------------------------------------
  490.   # ● フレーム更新
  491.   #--------------------------------------------------------------------------
  492.   def update
  493.     super
  494.     update_savefile_selection
  495.   end
  496.   #--------------------------------------------------------------------------
  497.   # ● 创建替换窗口
  498.   #--------------------------------------------------------------------------
  499.   def create_replace_window
  500.     @window_replace = Window_Yes_Or_No.new("替换", "取消")
  501.     @window_replace.set_handler(:yes,    method(:do_replace))
  502.     @window_replace.set_handler(:cancel, method(:do_cancel))
  503.   end
  504.   #--------------------------------------------------------------------------
  505.   # ● 创建删除窗口
  506.   #--------------------------------------------------------------------------
  507.   def create_delete_window
  508.     @window_delete  = Window_Yes_Or_No.new("删除", "取消")
  509.     @window_delete.set_handler(:yes,    method(:do_delete))
  510.     @window_delete.set_handler(:cancel, method(:do_return_manager))
  511.     @window_delete.x += 40
  512.   end
  513.   #--------------------------------------------------------------------------
  514.   # ● 创建管理窗口
  515.   #--------------------------------------------------------------------------
  516.   def create_manager_window
  517.     @window_manager = Window_SaveManagerCommand.new("复制", "移动", "删除", "取消")
  518.     @window_manager.set_handler(:copy  , method(:on_copy?))
  519.     @window_manager.set_handler(:move  , method(:on_move?))
  520.     @window_manager.set_handler(:delete, method(:on_delete?))
  521.     @window_manager.set_handler(:cancel, method(:do_cancel))
  522.   end
  523.   #--------------------------------------------------------------------------
  524.   # ● ヘルプウィンドウの作成
  525.   #--------------------------------------------------------------------------
  526.   def create_help_window
  527.     @help_window = Window_Help.new(1)
  528.     @help_window.set_text(help_window_text)
  529.   end
  530.   #--------------------------------------------------------------------------
  531.   # ● ヘルプウィンドウのテキストを取得
  532.   #--------------------------------------------------------------------------
  533.   def help_window_text
  534.     return ""
  535.   end
  536.   #--------------------------------------------------------------------------
  537.   # ● セーブファイルビューポートの作成
  538.   #--------------------------------------------------------------------------
  539.   def create_savefile_viewport
  540.     @savefile_viewport = Viewport.new
  541.     @savefile_viewport.rect.y = @help_window.height
  542.     @savefile_viewport.rect.height -= @help_window.height
  543.   end
  544.   #--------------------------------------------------------------------------
  545.   # ● セーブファイルウィンドウの作成
  546.   #--------------------------------------------------------------------------
  547.   def create_savefile_window
  548.     @savefile_window = Window_SaveFile.new(@index)
  549.     @savefile_window.viewport = @savefile_viewport
  550.   end
  551.   #--------------------------------------------------------------------------
  552.   # ● 生成存档列表窗口
  553.   #--------------------------------------------------------------------------
  554.   def create_command_window
  555.     @command_window = Window_FileCommand.new
  556.     @command_window.index = first_savefile_index
  557.     @index = @command_window.index
  558.     @command_window.viewport = @savefile_viewport
  559.     @command_window.set_handler(:file,      method(:on_savefile_ok))
  560.   end
  561.   #--------------------------------------------------------------------------
  562.   # ● セーブファイル選択の更新
  563.   #--------------------------------------------------------------------------
  564.   def update_savefile_selection
  565.     if @source_index != nil
  566.       if Input.trigger?(:C)
  567.         if @index == @source_index
  568.           Sound.play_buzzer
  569.         elsif FileTest.exist?(DataManager.make_filename(@index))
  570.           Graphics.freeze
  571.           @command_window.deactivate
  572.           @window_replace.y = 72 + @index * 24
  573.           @window_replace.activate
  574.           @window_replace.visible = true
  575.           @window_replace.refresh
  576.           Sound.play_ok
  577.           Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  578.         else
  579.           return on_copy_ok
  580.         end
  581.       elsif Input.trigger?(:B)
  582.         return do_return_manager
  583.       end
  584.     else
  585.       if Input.trigger?(:C)
  586.         if self.is_a?(Scene_Save) and FileTest.exist?(DataManager.make_filename(@index))
  587.           Graphics.freeze
  588.           @command_window.deactivate
  589.           @window_replace.y = 72 + @index * 24
  590.           @window_replace.activate
  591.           @window_replace.visible = true
  592.           @window_replace.refresh
  593.           Sound.play_ok
  594.           Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  595.         else
  596.           return on_savefile_ok
  597.         end
  598.       elsif Input.trigger?(:B)
  599.         return on_savefile_cancel
  600.       elsif Input.trigger?(:F5)
  601.         unless @window_manager.active == true or
  602.                @window_delete.active == true or
  603.                @window_replace.active == true
  604.           return on_manager?
  605.         end
  606.       end
  607.     end
  608.     @need_refresh = true if @index != @command_window.index
  609.     if @need_refresh
  610.       Graphics.freeze
  611.       @index = @command_window.index
  612.       @savefile_window.dispose
  613.       create_savefile_window
  614.       @need_refresh = false
  615.       Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  616.     end
  617.   end
  618.   #--------------------------------------------------------------------------
  619.   # ● セーブファイル[決定]
  620.   #--------------------------------------------------------------------------
  621.   def on_savefile_ok
  622.   end
  623.   #--------------------------------------------------------------------------
  624.   # ● セーブファイル[キャンセル]
  625.   #--------------------------------------------------------------------------
  626.   def on_savefile_cancel
  627.     Sound.play_cancel
  628.     return_scene
  629.   end
  630.   #--------------------------------------------------------------------------
  631.   # ● セーブファイル[決定]
  632.   #--------------------------------------------------------------------------
  633.   def on_copy_ok
  634.     Graphics.freeze
  635.     source_name = DataManager.make_filename(@source_index)
  636.     new_name    = DataManager.make_filename(@index)
  637.     case @source_type
  638.     when "copy"
  639.       # 复制存档文件(API)
  640.       Win32API.new('kernel32',"CopyFileA",'ppl','').call(source_name,new_name,0)
  641.     when "move"
  642.       # 重命名存档
  643.       File.rename(source_name, new_name)
  644.     end
  645.     # 返回
  646.     @help_window.set_text(help_window_text)
  647.     @source_index = nil
  648.     do_return_savelist
  649.   end
  650.   #--------------------------------------------------------------------------
  651.   # ● セーブファイル[复制]
  652.   #--------------------------------------------------------------------------
  653.   def on_copy?
  654.     Graphics.freeze
  655.     @help_window.set_text(PS0::Window_SaveFile_Plus::HELP_COPY)
  656.     @source_index = @index
  657.     @source_type = "copy"
  658.     do_return_savelist
  659.   end
  660.   #--------------------------------------------------------------------------
  661.   # ● セーブファイル[移动]
  662.   #--------------------------------------------------------------------------
  663.   def on_move?
  664.     Graphics.freeze
  665.     @help_window.set_text(PS0::Window_SaveFile_Plus::HELP_MOVE)
  666.     @source_index = @index
  667.     @source_type = "move"
  668.     do_return_savelist
  669.   end
  670.   #--------------------------------------------------------------------------
  671.   # ● セーブファイル[管理]
  672.   #--------------------------------------------------------------------------
  673.   def on_manager?
  674.     if FileTest.exist?(DataManager.make_filename(@index))
  675.       Graphics.freeze
  676.       @command_window.deactivate
  677.       @window_manager.y = 72 + @index * 24
  678.       @window_manager.activate
  679.       @window_manager.visible = true
  680.       @window_manager.refresh
  681.       Sound.play_ok
  682.       Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  683.     else
  684.       Sound.play_buzzer
  685.     end
  686.   end
  687.   #--------------------------------------------------------------------------
  688.   # ● セーブファイル[删除]
  689.   #--------------------------------------------------------------------------
  690.   def on_delete?
  691.     Graphics.freeze
  692.     @window_manager.deactivate
  693.     @command_window.deactivate
  694.     @window_delete.y = 72 + 72 + @index * 24
  695.     @window_delete.activate
  696.     @window_delete.visible = true
  697.     @window_delete.refresh
  698.     Sound.play_ok
  699.     Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  700.   end
  701.   #--------------------------------------------------------------------------
  702.   # ● 删除
  703.   #--------------------------------------------------------------------------
  704.   def do_delete
  705.     Graphics.freeze
  706.     File.delete(DataManager.make_filename(@index))
  707.     @window_delete.index  = 0
  708.     @window_manager.index = 0
  709.     @window_delete.visible  = false
  710.     @window_manager.visible = false
  711.     @window_delete.deactivate
  712.     @window_manager.deactivate
  713.     @command_window.activate
  714.     @need_refresh = true
  715.     Sound.play_save
  716.     if DataManager.save_file_exists?
  717.       Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  718.     else
  719.       return_scene
  720.     end
  721.   end
  722.   #--------------------------------------------------------------------------
  723.   # ● 替换
  724.   #--------------------------------------------------------------------------
  725.   def do_replace
  726.     Graphics.freeze
  727.     if @source_index != nil
  728.       return on_copy_ok
  729.     else
  730.       return on_savefile_ok
  731.     end
  732.     @window_replace.visible = false
  733.     @window_replace.deactivate
  734.     @need_refresh = true
  735.   end
  736.   #--------------------------------------------------------------------------
  737.   # ● 取消
  738.   #--------------------------------------------------------------------------
  739.   def do_cancel
  740.     Graphics.freeze
  741.     Sound.play_cancel
  742.     @window_delete.index  = 0
  743.     @window_replace.index = 0
  744.     @window_manager.index = 0
  745.     @window_delete.visible  = false
  746.     @window_replace.visible = false
  747.     @window_manager.visible = false
  748.     @window_delete.deactivate
  749.     @window_replace.deactivate
  750.     @window_manager.deactivate
  751.     @command_window.activate
  752.     Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  753.   end
  754.   #--------------------------------------------------------------------------
  755.   # ● 返回管理菜单
  756.   #--------------------------------------------------------------------------
  757.   def do_return_manager
  758.     Graphics.freeze
  759.     @help_window.set_text(help_window_text)
  760.     @command_window.index = @source_index unless @source_index == nil
  761.     @source_index = nil
  762.     @source_type = nil
  763.     @command_window.deactivate
  764.     @window_delete.index  = 0
  765.     @window_replace.index = 0
  766.     @window_delete.visible  = false
  767.     @window_replace.visible = false
  768.     @window_delete.deactivate
  769.     @window_replace.deactivate
  770.     @window_manager.y = 72 + @index * 24
  771.     @window_manager.activate
  772.     @window_manager.visible = true
  773.     @window_manager.refresh
  774.     Sound.play_cancel
  775.     Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  776.   end
  777.   #--------------------------------------------------------------------------
  778.   # ● 返回文件列表(复制、移动 用)
  779.   #--------------------------------------------------------------------------
  780.   def do_return_savelist
  781.     @window_manager.visible = false
  782.     @window_manager.deactivate
  783.     @command_window.activate
  784.     @need_refresh = true
  785.     Sound.play_ok
  786.   end
  787. end
  788. #==============================================================================
  789. # [PS0] End of Script
  790. #==============================================================================

截图0002.PNG (531.84 KB, 下载次数: 30)

在别的所有地方都正常

在别的所有地方都正常

截图0001.PNG (528.24 KB, 下载次数: 31)

附图,只有选择存档的地方会错位

附图,只有选择存档的地方会错位

作者: IndigoIX    时间: 2022-2-5 19:04
本帖最后由 IndigoIX 于 2022-2-6 13:27 编辑

啊,自己摸索着居然解决了……
不知道有没有人未来会遇到和我相同的问题,在这里po一下我的解决方案……
把截图存档脚本里第346行改成    super(0, fitting_height(1));然后第396行改成    super(160, fitting_height(1), Graphics.width-160, Graphics.height-fitting_height(1));最后再删去第541和第542行就可以了
我在检查脚本的时候发现它的思路是先在创建窗口的时候都令y=0,最后生成场景的时候又把y下调来留出帮助窗口的位置,而菜单指针读取的依然还是原先的y值,导致出现了错位。修改思路也是从这里入手,直接把fitting_height(1)插入一开始的窗口设定,避免了后期再次调动。
好像不能在回复里带图,我加到主贴里吧(




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