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

Project1

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

[已经解决] 存档页背景更替

[复制链接]

Lv2.观梦者 (版主)

迷途知返,恍如隔世

梦石
0
星屑
488
在线时间
1355 小时
注册时间
2011-2-17
帖子
1216

开拓者

跳转到指定楼层
1
发表于 2015-9-6 14:12:03 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
已经根据自己的需求更改了部分脚本。



↑图片大概是这样,10个框,选项在第一个,显示"1.jpg"是第一个亮,以此类推"10.jpg"是第十个亮。


想要实现的效果是默认显示背景是“1.jpg"(且左边的save00X的字显示着,隐藏掉默认的选框)

按下键,背景切换到"2.jpg"……依次类推,到第10个存档显示“10.jpg”

但因为存档位 >10个,10个后会下拉,所以到第十个往下按应该都显示的是"10.jpg",往上按会显示"9.jpg"


大概就是根据展示出来的10个存档位显示相应的背景,选中哪个显示的是哪个选项亮的背景,且隐藏command默认的选框,只显示字。

有点繁琐的感觉……自己修改无果,只能再来求大神相助。


使用的是这段脚本:

RUBY 代码复制
  1. #-----------------------------------------------------------------------------#
  2. # 脚本设定                                                                    #
  3. #-----------------------------------------------------------------------------#
  4. # 说明:                                                                      #
  5. # ①主要采用了Snap To Bitmap这脚本省去了DLL。                                 #
  6. # ②采用了禁术,各位不用到处改脚本了,不过冲突率也大增==                      #
  7. # ③脚本当中采用的脚本归原作者所有。                                          #
  8. # ④设置区域的变量请自行更改。                                                #
  9. #-----------------------------------------------------------------------------#
  10. SaveSettings = Struct.new(:max_save_file,:save_file_dir,:slot_name_format,
  11. :save_help,:load_help,:override_question,:snap_no_found,:no_save_file).new
  12. #-----------------------------------------------------------------------------#
  13. # 设置区域
  14. #-----------------------------------------------------------------------------#
  15. # 最大的存档量
  16. SaveSettings.max_save_file = 20
  17. # 存档所在文件夹
  18. SaveSettings.save_file_dir = "Save/"
  19. # 存档槽的名称的格式,具体请参考sprintf
  20. SaveSettings.slot_name_format = "Save%03d"
  21. # 存档界面所显示的字符串
  22. SaveSettings.save_help = ""
  23. # 读档界面所显示的字符串
  24. SaveSettings.load_help = ""
  25. # 需要覆盖存档时所发问的问题
  26. SaveSettings.override_question = "该档位已有存档,是否覆盖?"
  27. # 找不到截图时的信息
  28. SaveSettings.snap_no_found = "截图似乎有点问题……你都做了啥啊?"
  29. # 存档槽没有存档时显示的信息
  30. SaveSettings.no_save_file = "这里还没有存档哦"
  31.  
  32. #-----------------------------------------------------------------------------#
  33. # 创建存档文件夹                                                              #
  34. #-----------------------------------------------------------------------------#
  35. Dir.mkdir(SaveSettings.save_file_dir) unless FileTest.directory?(SaveSettings.save_file_dir)
  36.  
  37. #-----------------------------------------------------------------------------#
  38. # 游戏核心处理类                                                              #
  39. #-----------------------------------------------------------------------------#
  40. class Game_System
  41.   #---------------------------------------------------------------------------#
  42.   # 实例变量                                                                  #
  43.   #---------------------------------------------------------------------------#
  44.   attr_accessor:snap_bitmap
  45. end
  46.  
  47. #-----------------------------------------------------------------------------#
  48. # 拦截读档与存档界面的打开与地图进入菜单前截图                                #
  49. #-----------------------------------------------------------------------------#
  50. trace_var :$scene do
  51.   if $scene.is_a?(Scene_Save)
  52.     $scene = Scene_Save_Load.new
  53.   elsif $scene.is_a?(Scene_Load)
  54.     $scene = Scene_Save_Load.new(1)
  55.   end
  56.   if $scene.is_a?(Scene_Menu) and $_prev_scene == "Scene_Map"
  57.     $game_system.snap_bitmap = Graphics.snap_to_bitmap
  58.   end
  59.   $_prev_scene = $scene.class.name
  60. end
  61.  
  62. #-----------------------------------------------------------------------------#
  63. # 强改Scene_Title(禁术)                                                       #
  64. #-----------------------------------------------------------------------------#
  65. Scene_Title.class_eval do
  66.   instance_methods(false).each do |meth|
  67.     remove_method(meth)
  68.   end
  69.   def __found_save_file
  70.     for i in 1..SaveSettings.max_save_file
  71.       return true if File.exist?(SaveSettings.save_file_dir + "Save#{i}.rxdata")
  72.     end
  73.     return false
  74.   end
  75. end
  76. for i in 0...$RGSS_SCRIPTS.size
  77.   next if ("Section%03d" % i) == __FILE__
  78.   ary = $RGSS_SCRIPTS[i]
  79.   if ary[3][/class\s+Scene_Title/]
  80.     script = ary[3].clone.gsub(/(if|unless)\s+@continue_enabled/){"#{$1} __found_save_file"}
  81.     eval script, TOPLEVEL_BINDING, ("Section%03d" % i)
  82.   end
  83. end
  84.  
  85. #-----------------------------------------------------------------------------#
  86. # 存档界面用窗口                                                              #
  87. #-----------------------------------------------------------------------------#
  88. class Window_Save < Window_Base
  89.   #---------------------------------------------------------------------------#
  90.   # 初始化                                                                    #
  91.   #---------------------------------------------------------------------------#
  92.   def initialize
  93.     super(160,64,480,416)
  94.     self.contents = Bitmap.new(width-32,height-32)
  95.     self.opacity=0
  96.     @_index = -1
  97.     refresh(0)
  98.   end
  99.   #---------------------------------------------------------------------------#
  100.   # 刷新                                                                      #
  101.   #---------------------------------------------------------------------------#
  102.   def refresh(index)
  103.     if index != @_index
  104.       # 清除原有资料
  105.       self.contents.clear
  106.       @sprite.dispose if @sprite != nil
  107.       @sprite = nil
  108.       # 开始读取资料
  109.       @file_index = index
  110.       @filename = SaveSettings.save_file_dir + "Save#{@file_index + 1}.rxdata"
  111.       @time_stamp = Time.at(0)
  112.       @file_exist = FileTest.exist?(@filename)
  113.       if @file_exist
  114.         file = File.open(@filename, "r")
  115.         @time_stamp         = file.mtime
  116.         @characters         = Marshal.load(file)
  117.         @frame_count        = Marshal.load(file)
  118.         @game_system        = Marshal.load(file)
  119.         @game_switches      = Marshal.load(file)
  120.         @game_variables     = Marshal.load(file)
  121.         @game_self_switches = Marshal.load(file)
  122.         @game_screen        = Marshal.load(file)
  123.         @game_actors        = Marshal.load(file)
  124.         @game_party         = Marshal.load(file)
  125.         @game_troop         = Marshal.load(file)
  126.         @game_map           = Marshal.load(file)
  127.         @game_player        = Marshal.load(file)
  128.         @bitmap             = @game_system.snap_bitmap
  129.         @total_sec = @frame_count / Graphics.frame_rate
  130.         file.close
  131.         # 描绘截图的框与影子
  132.         self.contents.fill_rect(38,11,400,300,Color.new(0,0,0))
  133.         self.contents.fill_rect(27,0,402,302,system_color)
  134.         self.contents.fill_rect(28,1,400,300,Color.new(0,0,0,0))
  135.         # 如截图不为空的话
  136.         if @bitmap != nil
  137.           # 描绘截图
  138.           @sprite = Sprite.new
  139.           @sprite.bitmap = @bitmap
  140.           @sprite.x = 160+16+28
  141.           @sprite.y = 64+16+1
  142.           @sprite.zoom_x = @sprite.zoom_y = 0.625
  143.           @sprite.z = 99999
  144.         else
  145.           self.contents.draw_text(0,96,448,32,SaveSettings.snap_no_found,1)
  146.         end
  147.         # 描绘角色
  148.         for i in [url=mailto:0...@characters.size]0...@characters.size[/url]
  149.           x = i*35 +30
  150.           bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])
  151.           self.contents.blt(x,310,bitmap,Rect.new(0,0,bitmap.width/4,bitmap.height/4))
  152.         end
  153.         # 描绘游戏时间
  154.         hour = @total_sec / 60 / 60
  155.         min = @total_sec / 60 % 60
  156.         sec = @total_sec % 60
  157.         time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
  158.         self.contents.font.color = normal2_color
  159.         self.contents.draw_text(0-25,316,448,32,time_string,2)
  160.         # 描绘时间标记
  161.         self.contents.font.color = normal2_color
  162.         time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")
  163.         self.contents.draw_text(0-25,341,448,32,time_string, 2)
  164.       else
  165.         self.contents.draw_text(0,320,448,32,SaveSettings.no_save_file,1)
  166.       end
  167.       @_index = index
  168.     end
  169.   end
  170.   #---------------------------------------------------------------------------#
  171.   # 释放                                                                      #
  172.   #---------------------------------------------------------------------------#
  173.   def dispose
  174.     super
  175.     @sprite.dispose if @sprite != nil
  176.     @sprite = nil
  177.   end
  178. end
  179.  
  180. #-----------------------------------------------------------------------------#
  181. # 存档界面                                                                    #
  182. #-----------------------------------------------------------------------------#
  183. class Scene_Save_Load
  184.   #---------------------------------------------------------------------------#
  185.   # 初始化                                                                    #
  186.   #---------------------------------------------------------------------------#
  187.   def initialize(type=0)
  188.     @type = type == 0 ? "save" : "load"
  189.     case @type
  190.     when "save"
  191.       @word = SaveSettings.save_help
  192.     when "load"
  193.       @word = SaveSettings.load_help
  194.       $game_temp = Game_Temp.new
  195.     end
  196.   end
  197.   #---------------------------------------------------------------------------#
  198.   # 主执行                                                                    #
  199.   #---------------------------------------------------------------------------#
  200.   def main
  201.     # 生成帮助窗口
  202.     @help_window = Window_Help.new
  203.     @help_window.set_text(@word)
  204.     @help_window.opacity =0
  205.     # 选项窗口
  206.     choose = []
  207.     for i in 1..SaveSettings.max_save_file
  208.       choose.push(SaveSettings.slot_name_format % i)
  209.     end
  210.     @command_window = Window_Command.new(110,choose)
  211.     @command_window.width =110
  212.     @command_window.height = 350
  213.     @command_window.x = 53
  214.     @command_window.y = 85
  215.     @command_window.opacity=0
  216.     @command_window.active = true
  217.     # 存档资料窗口
  218.     @save_window = Window_Save.new
  219.     # 确认窗口
  220.     @confirm_window = Window_Base.new(80,176,480,128)
  221.     @confirm_window.contents = Bitmap.new(448,96)
  222.     @confirm_window.contents.draw_text(0,0,448,32,SaveSettings.override_question,1)
  223.     @confirm_window.contents.draw_text(0,64,216,32,"确定",1)
  224.     @confirm_window.contents.draw_text(232,64,216,32,"取消",1)
  225.     @confirm_window.cursor_rect.set(232,64,216,32)
  226.     @confirm_window.z = 999999
  227.     @confirm_window.visible = false
  228.     @confirm_ok = false
  229.     # 执行过渡
  230.     Graphics.transition
  231.     # 主循环
  232.     loop do
  233.       # 刷新游戏画面
  234.       Graphics.update
  235.       # 刷新输入信息
  236.       Input.update
  237.       # 刷新画面
  238.       update
  239.       # 如果画面切换的话的就中断循环
  240.       if $scene != self
  241.         break
  242.       end
  243.     end
  244.     # 准备过渡
  245.     Graphics.freeze
  246.     # 释放窗口
  247.     @help_window.dispose
  248.     @save_window.dispose
  249.     @command_window.dispose
  250.     @confirm_window.dispose
  251.     @sprite2.dispose
  252.   end
  253.   #---------------------------------------------------------------------------#
  254.   # 刷新                                                                      #
  255.   #---------------------------------------------------------------------------#
  256.   def update
  257.     # 选择存档窗口激活
  258.     unless @confirm_window.visible
  259.       update_command
  260.     else
  261.       update_confirm
  262.     end
  263.   end
  264.   #---------------------------------------------------------------------------#
  265.   # 选择存档窗口刷新                                                          #
  266.   #---------------------------------------------------------------------------#
  267.   def update_command
  268.     @command_window.update
  269.     @save_window.refresh(@command_window.index)
  270.     # 按下取消键
  271.     if Input.trigger?(Input::B)
  272.       case @type
  273.       when "save"
  274.         # 演奏取消 SE
  275.         $game_system.se_play($data_system.cancel_se)
  276.         # 如果被事件调用
  277.         if $game_temp.save_calling
  278.           # 清除存档调用标志
  279.           $game_temp.save_calling = false
  280.           # 切换到地图画面
  281.           $scene = Scene_Map.new
  282.           return
  283.         end
  284.         # 切换到菜单画面
  285.         $scene = Scene_Menu.new(4)
  286.       when "load"
  287.         # 演奏取消 SE
  288.         $game_system.se_play($data_system.cancel_se)
  289.         # 切换到标题画面
  290.         $scene = Scene_Title.new
  291.       end
  292.     end
  293.     # 按下确定键
  294.     if Input.trigger?(Input::C)
  295.       # 计算存档编号
  296.       filename = SaveSettings.save_file_dir + "Save#{@command_window.index+1}.rxdata"
  297.       case @type
  298.       when "save"
  299.         if File.exist?(filename)
  300.           @confirm_window.visible = true
  301.           @confirm_window.cursor_rect.set(232,64,216,32)
  302.           @confirm_ok = false
  303.         else
  304.           process_save
  305.         end
  306.       when "load"
  307.         # 文件不存在的情况下
  308.         unless FileTest.exist?(filename)
  309.           # 演奏冻结 SE
  310.           $game_system.se_play($data_system.buzzer_se)
  311.           return
  312.         end
  313.         # 演奏读档 SE
  314.         $game_system.se_play($data_system.load_se)
  315.         # 写入存档数据
  316.         file = File.open(filename, "rb")
  317.         read_save_data(file)
  318.         file.close
  319.         # 还原 BGM、BGS
  320.         $game_system.bgm_play($game_system.playing_bgm)
  321.         $game_system.bgs_play($game_system.playing_bgs)
  322.         # 刷新地图 (执行并行事件)
  323.         $game_map.update
  324.         # 切换到地图画面
  325.         $scene = Scene_Map.new
  326.       end
  327.     end
  328.   end
  329.   #---------------------------------------------------------------------------#
  330.   # 确认窗口刷新                                                              #
  331.   #---------------------------------------------------------------------------#
  332.   def update_confirm
  333.     @confirm_window.update
  334.     if Input.trigger?(Input::LEFT) or Input.trigger?(Input::UP)
  335.       $game_system.se_play($data_system.cursor_se)
  336.       @confirm_ok = true
  337.     elsif Input.trigger?(Input::RIGHT) or Input.trigger?(Input::DOWN)
  338.       $game_system.se_play($data_system.cursor_se)
  339.       @confirm_ok = false
  340.     elsif Input.trigger?(Input::C)
  341.       $game_system.se_play($data_system.decision_se)
  342.       process_save if @confirm_ok
  343.       @confirm_window.visible = false
  344.     elsif Input.trigger?(Input::B)
  345.       $game_system.se_play($data_system.cancel_se)
  346.       @confirm_window.visible = false
  347.     end
  348.     @confirm_window.cursor_rect.set(232,64,216,32)
  349.     @confirm_window.cursor_rect.set(0,64,216,32) if @confirm_ok
  350.   end
  351.   #---------------------------------------------------------------------------#
  352.   # 执行存档                                                                  #
  353.   #---------------------------------------------------------------------------#
  354.   def process_save
  355.     # 计算存档编号
  356.     filename = SaveSettings.save_file_dir + "Save#{@command_window.index+1}.rxdata"
  357.     # 演奏存档 SE
  358.     $game_system.se_play($data_system.save_se)
  359.     # 写入存档数据
  360.     file = File.open(filename, "wb")
  361.     write_save_data(file)
  362.     file.close
  363.     # 如果被事件调用
  364.     if $game_temp.save_calling
  365.       # 清除存档调用标志
  366.       $game_temp.save_calling = false
  367.       # 切换到地图画面
  368.       $scene = Scene_Map.new
  369.       return
  370.     end
  371.     # 切换到菜单画面
  372.     $scene = Scene_Menu.new(4)
  373.   end
  374.   #---------------------------------------------------------------------------#
  375.   # 存档                                                                      #
  376.   #---------------------------------------------------------------------------#
  377.   def write_save_data(file)
  378.     # 生成描绘存档文件用的角色图形
  379.     characters = []
  380.     for i in 0...$game_party.actors.size
  381.       actor = $game_party.actors[i]
  382.       characters.push([actor.character_name, actor.character_hue])
  383.     end
  384.     # 写入描绘存档文件用的角色数据
  385.     Marshal.dump(characters, file)
  386.     # 写入测量游戏时间用画面计数
  387.     Marshal.dump(Graphics.frame_count, file)
  388.     # 增加 1 次存档次数
  389.     $game_system.save_count += 1
  390.     # 保存魔法编号
  391.     # (将编辑器保存的值以随机值替换)
  392.     $game_system.magic_number = $data_system.magic_number
  393.     # 写入各种游戏对像
  394.     Marshal.dump($game_system, file)
  395.     Marshal.dump($game_switches, file)
  396.     Marshal.dump($game_variables, file)
  397.     Marshal.dump($game_self_switches, file)
  398.     Marshal.dump($game_screen, file)
  399.     Marshal.dump($game_actors, file)
  400.     Marshal.dump($game_party, file)
  401.     Marshal.dump($game_troop, file)
  402.     Marshal.dump($game_map, file)
  403.     Marshal.dump($game_player, file)
  404.   end
  405.   #---------------------------------------------------------------------------#
  406.   # 读档                                                                      #
  407.   #---------------------------------------------------------------------------#
  408.   def read_save_data(file)
  409.     # 读取描绘存档文件用的角色数据
  410.     characters = Marshal.load(file)
  411.     # 读取测量游戏时间用画面计数
  412.     Graphics.frame_count = Marshal.load(file)
  413.     # 读取各种游戏对像
  414.     $game_system        = Marshal.load(file)
  415.     $game_switches      = Marshal.load(file)
  416.     $game_variables     = Marshal.load(file)
  417.     $game_self_switches = Marshal.load(file)
  418.     $game_screen        = Marshal.load(file)
  419.     $game_actors        = Marshal.load(file)
  420.     $game_party         = Marshal.load(file)
  421.     $game_troop         = Marshal.load(file)
  422.     $game_map           = Marshal.load(file)
  423.     $game_player        = Marshal.load(file)
  424.     # 魔法编号与保存时有差异的情况下
  425.     # (加入编辑器的编辑过的数据)
  426.     if $game_system.magic_number != $data_system.magic_number
  427.       # 重新装载地图
  428.       $game_map.setup($game_map.map_id)
  429.       $game_player.center($game_player.x, $game_player.y)
  430.     end
  431.     # 刷新同伴成员
  432.     $game_party.refresh
  433.   end
  434. end
  435.  
  436. #-----------------------------------------------------------------------------#
  437. # Graphics.snap_to_bitmap(优化版)                                           #
  438. # 作者:神思                                                                  #
  439. # 优化:釣到一隻猴子@_@  (  AAM@_@  )                                         #
  440. # 出处:[url=www.66rpg.com]www.66rpg.com[/url]
  441. #-----------------------------------------------------------------------------#
  442. #-----------------------------------------------------------------------------#
  443. # Graphics                                                                    #
  444. #-----------------------------------------------------------------------------#
  445. class << Graphics
  446.   CreateDC = Win32API.new("gdi32", "CreateDC", "pppl", "l")
  447.   CreateCompatibleBitmap = Win32API.new("gdi32", "CreateCompatibleBitmap", "lll", "l")
  448.   CreateCompatibleDC = Win32API.new("gdi32", "CreateCompatibleDC", "l", "l")
  449.   SelectObject = Win32API.new("gdi32", "SelectObject", "ll", "l")
  450.   BitBlt = Win32API.new("gdi32", "BitBlt", "lllllllll", "l")
  451.   GetBitmapBits = Win32API.new("gdi32", "GetBitmapBits", "llp", "l")
  452.   ScreenToClient = Win32API.new("user32", "ScreenToClient", "ip", "i")
  453.   SRCCOPY = 0xCC0020
  454.   RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  455.   HWnd = Win32API.new("user32", "GetActiveWindow", nil, 'l').call
  456.   DwCount = (640 * 480 * 4) * 2
  457.   @@lpBits = "\000" * DwCount
  458.   #---------------------------------------------------------------------------#
  459.   # snap_to_bitmap                                                            #
  460.   #---------------------------------------------------------------------------#
  461.   def snap_to_bitmap
  462.     width, height = 640,480
  463.     hb = Bitmap.new(width, height)
  464.     rgbs = self.bitmap_data
  465.     len = width * 4
  466.     for y in 0...height
  467.       break if 2*y >= height - 1
  468.       nth1 = y * len
  469.       nth2 = (height - 1 - y) * len
  470.       tStr = rgbs[nth1,len]
  471.       rgbs[nth1, len] = rgbs[nth2, len]
  472.       rgbs[nth2, len] = tStr
  473.     end
  474.     RtlMoveMemory.call(hb.address, rgbs, 640 * 480 * 4)
  475.     return hb
  476.   end
  477.   #---------------------------------------------------------------------------#
  478.   # bitmap_data                                                          #
  479.   #---------------------------------------------------------------------------#
  480.   def bitmap_data
  481.     hScrDC = CreateDC.call("DISPLAY", "", "", 0)
  482.     hMemDC = CreateCompatibleDC.call(hScrDC)
  483.     hBitmap = CreateCompatibleBitmap.call(hScrDC, 640, 480)
  484.     hOldBitmap = SelectObject.call(hMemDC, hBitmap)
  485.     BitBlt.call(hMemDC, xsrc, ysrc, 640*2, 480*2, hScrDC, 0, 0, SRCCOPY)
  486.     hBitmap = SelectObject.call(hMemDC, hOldBitmap)
  487.     GetBitmapBits.call(hBitmap, DwCount, @@lpBits)
  488.     return @@lpBits
  489.   end
  490.   #---------------------------------------------------------------------------#
  491.   # 用户窗口的位置                                                            #
  492.   #---------------------------------------------------------------------------#
  493.   def xsrc
  494.     return self.point[0]
  495.   end
  496.   #---------------------------------------------------------------------------#
  497.   # 用户窗口的位置                                                            #
  498.   #---------------------------------------------------------------------------#
  499.   def ysrc
  500.     return self.point[1]
  501.   end
  502.   #---------------------------------------------------------------------------#
  503.   # 那个点                                                                    #
  504.   #---------------------------------------------------------------------------#
  505.   def point
  506.     point = [0,0].pack("LL")
  507.     ScreenToClient.call(HWnd, point)
  508.     return point.unpack("LL")
  509.   end
  510. end
  511.  
  512. #-----------------------------------------------------------------------------#
  513. # Font                                                                        #
  514. #-----------------------------------------------------------------------------#
  515. class Font
  516.   #---------------------------------------------------------------------------#
  517.   # marshal_dump                                                              #
  518.   #---------------------------------------------------------------------------#
  519.   def marshal_dump
  520.   end
  521.   #---------------------------------------------------------------------------#
  522.   # marshal_load                                                              #
  523.   #---------------------------------------------------------------------------#
  524.   def marshal_load(obj)
  525.   end
  526. end
  527.  
  528. #-----------------------------------------------------------------------------#
  529. # Bitmap                                                                      #
  530. #-----------------------------------------------------------------------------#
  531. class Bitmap
  532.   RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  533.   # 传送到内存的API函数
  534.   RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  535.   RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  536.   #---------------------------------------------------------------------------#
  537.   # _dump                                                                     #
  538.   #---------------------------------------------------------------------------#
  539.   def _dump(limit)
  540.     data = "rgba" * width * height
  541.     RtlMoveMemory_pi.call(data, address, data.length)
  542.     [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # 压缩
  543.   end
  544.   #---------------------------------------------------------------------------#
  545.   # _load                                                                     #
  546.   #---------------------------------------------------------------------------#
  547.   def self._load(str)
  548.     w, h, zdata = str.unpack("LLa*")
  549.     b = self.new(w, h)
  550.     RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4)
  551.     return b
  552.   end
  553.   #---------------------------------------------------------------------------#
  554.   # address                                                                   #
  555.   #---------------------------------------------------------------------------#
  556.   def address
  557.     # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
  558.     buffer, ad = "xxxx", object_id * 2 + 16
  559.     RtlMoveMemory.call(buffer, ad, 4)
  560.     ad = buffer.unpack("L")[0] + 8
  561.     RtlMoveMemory.call(buffer, ad, 4)
  562.     ad = buffer.unpack("L")[0] + 16
  563.     RtlMoveMemory.call(buffer, ad, 4)
  564.     return buffer.unpack("L")[0]
  565.   end
  566. end
  

评分

参与人数 1星屑 +35 收起 理由
RyanBern + 35 手动认可奖励

查看全部评分

Lv2.观梦者 (版主)

迷途知返,恍如隔世

梦石
0
星屑
488
在线时间
1355 小时
注册时间
2011-2-17
帖子
1216

开拓者

3
 楼主| 发表于 2015-9-6 16:55:13 | 只看该作者
RyanBern 发表于 2015-9-6 16:01
稍稍修改了一下脚本,由于没有制作好的图片无法完整测试。
去掉了窗口的光标(但是保留了滚屏的功能)。
ps ...


再次感谢!非常符合预期效果。
不过滚屏光标好像有点漂移,想让其居中应该调试何处?

点评

宽度在我脚本246行调节(原来为120),x坐标是248行  发表于 2015-9-6 17:28
适当调整@command_window的x坐标和宽度(目测宽度应该为110~120之间),x坐标也要相应变化一些  发表于 2015-9-6 17:26

评分

参与人数 1星屑 +23 收起 理由
kuerlulu + 23 前辈诈尸啦

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

2
发表于 2015-9-6 16:01:19 | 只看该作者
稍稍修改了一下脚本,由于没有制作好的图片无法完整测试。
去掉了窗口的光标(但是保留了滚屏的功能)。
ps原来窗口的宽高设置得有点问题,我给稍微调整了一下。
做好的图片请放到Graphics/Pictures/文件夹下,并命名为0.png~9.png
RUBY 代码复制
  1. #-----------------------------------------------------------------------------#
  2. # 脚本设定                                                                    #
  3. #-----------------------------------------------------------------------------#
  4. # 说明:                                                                      #
  5. # ①主要采用了Snap To Bitmap这脚本省去了DLL。                                 #
  6. # ②采用了禁术,各位不用到处改脚本了,不过冲突率也大增==                      #
  7. # ③脚本当中采用的脚本归原作者所有。                                          #
  8. # ④设置区域的变量请自行更改。                                                #
  9. #-----------------------------------------------------------------------------#
  10. SaveSettings = Struct.new(:max_save_file,:save_file_dir,:slot_name_format,
  11. :save_help,:load_help,:override_question,:snap_no_found,:no_save_file).new
  12. #-----------------------------------------------------------------------------#
  13. # 设置区域
  14. #-----------------------------------------------------------------------------#
  15. # 最大的存档量
  16. SaveSettings.max_save_file = 20
  17. # 存档所在文件夹
  18. SaveSettings.save_file_dir = "Save/"
  19. # 存档槽的名称的格式,具体请参考sprintf
  20. SaveSettings.slot_name_format = "Save%03d"
  21. # 存档界面所显示的字符串
  22. SaveSettings.save_help = ""
  23. # 读档界面所显示的字符串
  24. SaveSettings.load_help = ""
  25. # 需要覆盖存档时所发问的问题
  26. SaveSettings.override_question = "该档位已有存档,是否覆盖?"
  27. # 找不到截图时的信息
  28. SaveSettings.snap_no_found = "截图似乎有点问题……你都做了啥啊?"
  29. # 存档槽没有存档时显示的信息
  30. SaveSettings.no_save_file = "这里还没有存档哦"
  31.  
  32. #-----------------------------------------------------------------------------#
  33. # 创建存档文件夹                                                              #
  34. #-----------------------------------------------------------------------------#
  35. Dir.mkdir(SaveSettings.save_file_dir) unless FileTest.directory?(SaveSettings.save_file_dir)
  36.  
  37. #-----------------------------------------------------------------------------#
  38. # 游戏核心处理类                                                              #
  39. #-----------------------------------------------------------------------------#
  40. class Game_System
  41.   #---------------------------------------------------------------------------#
  42.   # 实例变量                                                                  #
  43.   #---------------------------------------------------------------------------#
  44.   attr_accessor:snap_bitmap
  45. end
  46.  
  47. #-----------------------------------------------------------------------------#
  48. # 拦截读档与存档界面的打开与地图进入菜单前截图                                #
  49. #-----------------------------------------------------------------------------#
  50. trace_var :$scene do
  51.   if $scene.is_a?(Scene_Save)
  52.     $scene = Scene_Save_Load.new
  53.   elsif $scene.is_a?(Scene_Load)
  54.     $scene = Scene_Save_Load.new(1)
  55.   end
  56.   if $scene.is_a?(Scene_Menu) and $_prev_scene == "Scene_Map"
  57.     $game_system.snap_bitmap = Graphics.snap_to_bitmap
  58.   end
  59.   $_prev_scene = $scene.class.name
  60. end
  61.  
  62. #-----------------------------------------------------------------------------#
  63. # 强改Scene_Title(禁术)                                                       #
  64. #-----------------------------------------------------------------------------#
  65. Scene_Title.class_eval do
  66.   instance_methods(false).each do |meth|
  67.     remove_method(meth)
  68.   end
  69.   def __found_save_file
  70.     for i in 1..SaveSettings.max_save_file
  71.       return true if File.exist?(SaveSettings.save_file_dir + "Save#{i}.rxdata")
  72.     end
  73.     return false
  74.   end
  75. end
  76. for i in 0...$RGSS_SCRIPTS.size
  77.   next if ("Section%03d" % i) == __FILE__
  78.   ary = $RGSS_SCRIPTS[i]
  79.   if ary[3][/class\s+Scene_Title/]
  80.     script = ary[3].clone.gsub(/(if|unless)\s+@continue_enabled/){"#{$1} __found_save_file"}
  81.     eval script, TOPLEVEL_BINDING, ("Section%03d" % i)
  82.   end
  83. end
  84.  
  85. #-----------------------------------------------------------------------------#
  86. # 存档界面用窗口                                                              #
  87. #-----------------------------------------------------------------------------#
  88. class Window_Save < Window_Base
  89.   #---------------------------------------------------------------------------#
  90.   # 初始化                                                                    #
  91.   #---------------------------------------------------------------------------#
  92.   def initialize
  93.     super(160,64,480,416)
  94.     self.contents = Bitmap.new(width-32,height-32)
  95.     self.opacity=0
  96.     @_index = -1
  97.     refresh(0)
  98.   end
  99.   #---------------------------------------------------------------------------#
  100.   # 刷新                                                                      #
  101.   #---------------------------------------------------------------------------#
  102.   def refresh(index)
  103.     if index != @_index
  104.       # 清除原有资料
  105.       self.contents.clear
  106.       @sprite.dispose if @sprite != nil
  107.       @sprite = nil
  108.       # 开始读取资料
  109.       @file_index = index
  110.       @filename = SaveSettings.save_file_dir + "Save#{@file_index + 1}.rxdata"
  111.       @time_stamp = Time.at(0)
  112.       @file_exist = FileTest.exist?(@filename)
  113.       if @file_exist
  114.         file = File.open(@filename, "r")
  115.         @time_stamp         = file.mtime
  116.         @characters         = Marshal.load(file)
  117.         @frame_count        = Marshal.load(file)
  118.         @game_system        = Marshal.load(file)
  119.         @game_switches      = Marshal.load(file)
  120.         @game_variables     = Marshal.load(file)
  121.         @game_self_switches = Marshal.load(file)
  122.         @game_screen        = Marshal.load(file)
  123.         @game_actors        = Marshal.load(file)
  124.         @game_party         = Marshal.load(file)
  125.         @game_troop         = Marshal.load(file)
  126.         @game_map           = Marshal.load(file)
  127.         @game_player        = Marshal.load(file)
  128.         @bitmap             = @game_system.snap_bitmap
  129.         @total_sec = @frame_count / Graphics.frame_rate
  130.         file.close
  131.         # 描绘截图的框与影子
  132.         self.contents.fill_rect(38,11,400,300,Color.new(0,0,0))
  133.         self.contents.fill_rect(27,0,402,302,system_color)
  134.         self.contents.fill_rect(28,1,400,300,Color.new(0,0,0,0))
  135.         # 如截图不为空的话
  136.         if @bitmap != nil
  137.           # 描绘截图
  138.           @sprite = Sprite.new
  139.           @sprite.bitmap = @bitmap
  140.           @sprite.x = 160+16+28
  141.           @sprite.y = 64+16+1
  142.           @sprite.zoom_x = @sprite.zoom_y = 0.625
  143.           @sprite.z = 99999
  144.         else
  145.           self.contents.draw_text(0,96,448,32,SaveSettings.snap_no_found,1)
  146.         end
  147.         # 描绘角色
  148.         for i in [email]0...@characters.size[/email]
  149.           x = i*35 +30
  150.           bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])
  151.           self.contents.blt(x,310,bitmap,Rect.new(0,0,bitmap.width/4,bitmap.height/4))
  152.         end
  153.         # 描绘游戏时间
  154.         hour = @total_sec / 60 / 60
  155.         min = @total_sec / 60 % 60
  156.         sec = @total_sec % 60
  157.         time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
  158.         self.contents.font.color = normal2_color
  159.         self.contents.draw_text(0-25,316,448,32,time_string,2)
  160.         # 描绘时间标记
  161.         self.contents.font.color = normal2_color
  162.         time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")
  163.         self.contents.draw_text(0-25,341,448,32,time_string, 2)
  164.       else
  165.         self.contents.draw_text(0,320,448,32,SaveSettings.no_save_file,1)
  166.       end
  167.       @_index = index
  168.     end
  169.   end
  170.   #---------------------------------------------------------------------------#
  171.   # 释放                                                                      #
  172.   #---------------------------------------------------------------------------#
  173.   def dispose
  174.     super
  175.     @sprite.dispose if @sprite != nil
  176.     @sprite = nil
  177.   end
  178. end
  179.  
  180. #-----------------------------------------------------------------------------#
  181. # 自定义 Window_Command_R : 不显示光标,但是可以滚动                          #
  182. #-----------------------------------------------------------------------------#
  183. class Window_Command_R < Window_Command
  184.   #---------------------------------------------------------------------------#
  185.   # 初始化 : 去掉光标                                                         #
  186.   #---------------------------------------------------------------------------#
  187.   def initialize(width, commands)
  188.     super(width, commands)
  189.     self.cursor_rect.empty
  190.   end
  191.   #--------------------------------------------------------------------------
  192.   # ● 更新光标矩形 : 去掉设置光标的部分
  193.   #--------------------------------------------------------------------------
  194.   def update_cursor_rect
  195.     # 获取当前的行
  196.     row = @index / @column_max
  197.     # 当前行被显示开头行前面的情况下
  198.     if row < self.top_row
  199.       # 从当前行向开头行滚动
  200.       self.top_row = row
  201.     end
  202.     # 当前行被显示末尾行之后的情况下
  203.     if row > self.top_row + (self.page_row_max - 1)
  204.       # 从当前行向末尾滚动
  205.       self.top_row = row - (self.page_row_max - 1)
  206.     end
  207.   end
  208.   #---------------------------------------------------------------------------#
  209.   # 获取光标当前位置行                                                        #
  210.   #---------------------------------------------------------------------------#
  211.   def cursor_row
  212.     self.index / @column_max - top_row
  213.   end
  214. end
  215.  
  216. #-----------------------------------------------------------------------------#
  217. # 存档界面                                                                    #
  218. #-----------------------------------------------------------------------------#
  219. class Scene_Save_Load
  220.   #---------------------------------------------------------------------------#
  221.   # 初始化                                                                    #
  222.   #---------------------------------------------------------------------------#
  223.   def initialize(type=0)
  224.     @type = type == 0 ? "save" : "load"
  225.     case @type
  226.     when "save"
  227.       @word = SaveSettings.save_help
  228.     when "load"
  229.       @word = SaveSettings.load_help
  230.       $game_temp = Game_Temp.new
  231.     end
  232.   end
  233.   #---------------------------------------------------------------------------#
  234.   # 主执行                                                                    #
  235.   #---------------------------------------------------------------------------#
  236.   def main
  237.     # 生成帮助窗口
  238.     @help_window = Window_Help.new
  239.     @help_window.set_text(@word)
  240.     @help_window.opacity =0
  241.     # 选项窗口
  242.     choose = []
  243.     for i in 1..SaveSettings.max_save_file
  244.       choose.push(SaveSettings.slot_name_format % i)
  245.     end
  246.     @command_window = Window_Command_R.new(120,choose)
  247.     @command_window.height = 352
  248.     @command_window.x = 53
  249.     @command_window.y = 85
  250.     @command_window.opacity=0
  251.     @command_window.active = true
  252.     @command_window.cursor_rect.empty
  253.     # 存档资料窗口
  254.     @save_window = Window_Save.new
  255.     # 确认窗口
  256.     @confirm_window = Window_Base.new(80,176,480,128)
  257.     @confirm_window.contents = Bitmap.new(448,96)
  258.     @confirm_window.contents.draw_text(0,0,448,32,SaveSettings.override_question,1)
  259.     @confirm_window.contents.draw_text(0,64,216,32,"确定",1)
  260.     @confirm_window.contents.draw_text(232,64,216,32,"取消",1)
  261.     @confirm_window.cursor_rect.set(232,64,216,32)
  262.     @confirm_window.z = 999999
  263.     @confirm_window.visible = false
  264.     @confirm_ok = false
  265.     # 背景选框
  266.     @pic_index = @command_window.cursor_row
  267.     @sprite_back_choice = Sprite.new
  268.     @sprite_back_choice.bitmap = RPG::Cache.picture("#{@pic_index}.png")
  269.     # 执行过渡
  270.     Graphics.transition
  271.     # 主循环
  272.     loop do
  273.       # 刷新游戏画面
  274.       Graphics.update
  275.       # 刷新输入信息
  276.       Input.update
  277.       # 刷新画面
  278.       update
  279.       # 如果画面切换的话的就中断循环
  280.       if $scene != self
  281.         break
  282.       end
  283.     end
  284.     # 准备过渡
  285.     Graphics.freeze
  286.     # 释放窗口
  287.     @help_window.dispose
  288.     @save_window.dispose
  289.     @command_window.dispose
  290.     @confirm_window.dispose
  291.     @sprite_back_choice.dispose
  292.   end
  293.   #---------------------------------------------------------------------------#
  294.   # 刷新                                                                      #
  295.   #---------------------------------------------------------------------------#
  296.   def update
  297.     # 选择存档窗口激活
  298.     unless @confirm_window.visible
  299.       update_command
  300.     else
  301.       update_confirm
  302.     end
  303.   end
  304.   #---------------------------------------------------------------------------#
  305.   # 选择存档窗口刷新                                                          #
  306.   #---------------------------------------------------------------------------#
  307.   def update_command
  308.     @command_window.update
  309.     @save_window.refresh(@command_window.index)
  310.     # 刷新背景选框
  311.     if @pic_index != @command_window.cursor_row
  312.       @pic_index = @command_window.cursor_row
  313.       @sprite_back_choice.bitmap = RPG::Cache.picture("#{@pic_index}.png")
  314.     end
  315.     # 按下取消键
  316.     if Input.trigger?(Input::B)
  317.       case @type
  318.       when "save"
  319.         # 演奏取消 SE
  320.         $game_system.se_play($data_system.cancel_se)
  321.         # 如果被事件调用
  322.         if $game_temp.save_calling
  323.           # 清除存档调用标志
  324.           $game_temp.save_calling = false
  325.           # 切换到地图画面
  326.           $scene = Scene_Map.new
  327.           return
  328.         end
  329.         # 切换到菜单画面
  330.         $scene = Scene_Menu.new(4)
  331.       when "load"
  332.         # 演奏取消 SE
  333.         $game_system.se_play($data_system.cancel_se)
  334.         # 切换到标题画面
  335.         $scene = Scene_Title.new
  336.       end
  337.     end
  338.     # 按下确定键
  339.     if Input.trigger?(Input::C)
  340.       # 计算存档编号
  341.       filename = SaveSettings.save_file_dir + "Save#{@command_window.index+1}.rxdata"
  342.       case @type
  343.       when "save"
  344.         if File.exist?(filename)
  345.           @confirm_window.visible = true
  346.           @confirm_window.cursor_rect.set(232,64,216,32)
  347.           @confirm_ok = false
  348.         else
  349.           process_save
  350.         end
  351.       when "load"
  352.         # 文件不存在的情况下
  353.         unless FileTest.exist?(filename)
  354.           # 演奏冻结 SE
  355.           $game_system.se_play($data_system.buzzer_se)
  356.           return
  357.         end
  358.         # 演奏读档 SE
  359.         $game_system.se_play($data_system.load_se)
  360.         # 写入存档数据
  361.         file = File.open(filename, "rb")
  362.         read_save_data(file)
  363.         file.close
  364.         # 还原 BGM、BGS
  365.         $game_system.bgm_play($game_system.playing_bgm)
  366.         $game_system.bgs_play($game_system.playing_bgs)
  367.         # 刷新地图 (执行并行事件)
  368.         $game_map.update
  369.         # 切换到地图画面
  370.         $scene = Scene_Map.new
  371.       end
  372.     end
  373.   end
  374.   #---------------------------------------------------------------------------#
  375.   # 确认窗口刷新                                                              #
  376.   #---------------------------------------------------------------------------#
  377.   def update_confirm
  378.     @confirm_window.update
  379.     if Input.trigger?(Input::LEFT) or Input.trigger?(Input::UP)
  380.       $game_system.se_play($data_system.cursor_se)
  381.       @confirm_ok = true
  382.     elsif Input.trigger?(Input::RIGHT) or Input.trigger?(Input::DOWN)
  383.       $game_system.se_play($data_system.cursor_se)
  384.       @confirm_ok = false
  385.     elsif Input.trigger?(Input::C)
  386.       $game_system.se_play($data_system.decision_se)
  387.       process_save if @confirm_ok
  388.       @confirm_window.visible = false
  389.     elsif Input.trigger?(Input::B)
  390.       $game_system.se_play($data_system.cancel_se)
  391.       @confirm_window.visible = false
  392.     end
  393.     @confirm_window.cursor_rect.set(232,64,216,32)
  394.     @confirm_window.cursor_rect.set(0,64,216,32) if @confirm_ok
  395.   end
  396.   #---------------------------------------------------------------------------#
  397.   # 执行存档                                                                  #
  398.   #---------------------------------------------------------------------------#
  399.   def process_save
  400.     # 计算存档编号
  401.     filename = SaveSettings.save_file_dir + "Save#{@command_window.index+1}.rxdata"
  402.     # 演奏存档 SE
  403.     $game_system.se_play($data_system.save_se)
  404.     # 写入存档数据
  405.     file = File.open(filename, "wb")
  406.     write_save_data(file)
  407.     file.close
  408.     # 如果被事件调用
  409.     if $game_temp.save_calling
  410.       # 清除存档调用标志
  411.       $game_temp.save_calling = false
  412.       # 切换到地图画面
  413.       $scene = Scene_Map.new
  414.       return
  415.     end
  416.     # 切换到菜单画面
  417.     $scene = Scene_Menu.new(4)
  418.   end
  419.   #---------------------------------------------------------------------------#
  420.   # 存档                                                                      #
  421.   #---------------------------------------------------------------------------#
  422.   def write_save_data(file)
  423.     # 生成描绘存档文件用的角色图形
  424.     characters = []
  425.     for i in 0...$game_party.actors.size
  426.       actor = $game_party.actors[i]
  427.       characters.push([actor.character_name, actor.character_hue])
  428.     end
  429.     # 写入描绘存档文件用的角色数据
  430.     Marshal.dump(characters, file)
  431.     # 写入测量游戏时间用画面计数
  432.     Marshal.dump(Graphics.frame_count, file)
  433.     # 增加 1 次存档次数
  434.     $game_system.save_count += 1
  435.     # 保存魔法编号
  436.     # (将编辑器保存的值以随机值替换)
  437.     $game_system.magic_number = $data_system.magic_number
  438.     # 写入各种游戏对像
  439.     Marshal.dump($game_system, file)
  440.     Marshal.dump($game_switches, file)
  441.     Marshal.dump($game_variables, file)
  442.     Marshal.dump($game_self_switches, file)
  443.     Marshal.dump($game_screen, file)
  444.     Marshal.dump($game_actors, file)
  445.     Marshal.dump($game_party, file)
  446.     Marshal.dump($game_troop, file)
  447.     Marshal.dump($game_map, file)
  448.     Marshal.dump($game_player, file)
  449.   end
  450.   #---------------------------------------------------------------------------#
  451.   # 读档                                                                      #
  452.   #---------------------------------------------------------------------------#
  453.   def read_save_data(file)
  454.     # 读取描绘存档文件用的角色数据
  455.     characters = Marshal.load(file)
  456.     # 读取测量游戏时间用画面计数
  457.     Graphics.frame_count = Marshal.load(file)
  458.     # 读取各种游戏对像
  459.     $game_system        = Marshal.load(file)
  460.     $game_switches      = Marshal.load(file)
  461.     $game_variables     = Marshal.load(file)
  462.     $game_self_switches = Marshal.load(file)
  463.     $game_screen        = Marshal.load(file)
  464.     $game_actors        = Marshal.load(file)
  465.     $game_party         = Marshal.load(file)
  466.     $game_troop         = Marshal.load(file)
  467.     $game_map           = Marshal.load(file)
  468.     $game_player        = Marshal.load(file)
  469.     # 魔法编号与保存时有差异的情况下
  470.     # (加入编辑器的编辑过的数据)
  471.     if $game_system.magic_number != $data_system.magic_number
  472.       # 重新装载地图
  473.       $game_map.setup($game_map.map_id)
  474.       $game_player.center($game_player.x, $game_player.y)
  475.     end
  476.     # 刷新同伴成员
  477.     $game_party.refresh
  478.   end
  479. end
  480.  
  481. #-----------------------------------------------------------------------------#
  482. # Graphics.snap_to_bitmap(优化版)                                           #
  483. # 作者:神思                                                                  #
  484. # 优化:釣到一隻猴子@_@  (  AAM@_@  )                                         #
  485. # 出处:[url=www.66rpg.com]www.66rpg.com[/url]
  486. #-----------------------------------------------------------------------------#
  487. #-----------------------------------------------------------------------------#
  488. # Graphics                                                                    #
  489. #-----------------------------------------------------------------------------#
  490. class << Graphics
  491.   CreateDC = Win32API.new("gdi32", "CreateDC", "pppl", "l")
  492.   CreateCompatibleBitmap = Win32API.new("gdi32", "CreateCompatibleBitmap", "lll", "l")
  493.   CreateCompatibleDC = Win32API.new("gdi32", "CreateCompatibleDC", "l", "l")
  494.   SelectObject = Win32API.new("gdi32", "SelectObject", "ll", "l")
  495.   BitBlt = Win32API.new("gdi32", "BitBlt", "lllllllll", "l")
  496.   GetBitmapBits = Win32API.new("gdi32", "GetBitmapBits", "llp", "l")
  497.   ScreenToClient = Win32API.new("user32", "ScreenToClient", "ip", "i")
  498.   SRCCOPY = 0xCC0020
  499.   RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  500.   HWnd = Win32API.new("user32", "GetActiveWindow", nil, 'l').call
  501.   DwCount = (640 * 480 * 4) * 2
  502.   @@lpBits = "\000" * DwCount
  503.   #---------------------------------------------------------------------------#
  504.   # snap_to_bitmap                                                            #
  505.   #---------------------------------------------------------------------------#
  506.   def snap_to_bitmap
  507.     width, height = 640,480
  508.     hb = Bitmap.new(width, height)
  509.     rgbs = self.bitmap_data
  510.     len = width * 4
  511.     for y in 0...height
  512.       break if 2*y >= height - 1
  513.       nth1 = y * len
  514.       nth2 = (height - 1 - y) * len
  515.       tStr = rgbs[nth1,len]
  516.       rgbs[nth1, len] = rgbs[nth2, len]
  517.       rgbs[nth2, len] = tStr
  518.     end
  519.     RtlMoveMemory.call(hb.address, rgbs, 640 * 480 * 4)
  520.     return hb
  521.   end
  522.   #---------------------------------------------------------------------------#
  523.   # bitmap_data                                                          #
  524.   #---------------------------------------------------------------------------#
  525.   def bitmap_data
  526.     hScrDC = CreateDC.call("DISPLAY", "", "", 0)
  527.     hMemDC = CreateCompatibleDC.call(hScrDC)
  528.     hBitmap = CreateCompatibleBitmap.call(hScrDC, 640, 480)
  529.     hOldBitmap = SelectObject.call(hMemDC, hBitmap)
  530.     BitBlt.call(hMemDC, xsrc, ysrc, 640*2, 480*2, hScrDC, 0, 0, SRCCOPY)
  531.     hBitmap = SelectObject.call(hMemDC, hOldBitmap)
  532.     GetBitmapBits.call(hBitmap, DwCount, @@lpBits)
  533.     return @@lpBits
  534.   end
  535.   #---------------------------------------------------------------------------#
  536.   # 用户窗口的位置                                                            #
  537.   #---------------------------------------------------------------------------#
  538.   def xsrc
  539.     return self.point[0]
  540.   end
  541.   #---------------------------------------------------------------------------#
  542.   # 用户窗口的位置                                                            #
  543.   #---------------------------------------------------------------------------#
  544.   def ysrc
  545.     return self.point[1]
  546.   end
  547.   #---------------------------------------------------------------------------#
  548.   # 那个点                                                                    #
  549.   #---------------------------------------------------------------------------#
  550.   def point
  551.     point = [0,0].pack("LL")
  552.     ScreenToClient.call(HWnd, point)
  553.     return point.unpack("LL")
  554.   end
  555. end
  556.  
  557. #-----------------------------------------------------------------------------#
  558. # Font                                                                        #
  559. #-----------------------------------------------------------------------------#
  560. class Font
  561.   #---------------------------------------------------------------------------#
  562.   # marshal_dump                                                              #
  563.   #---------------------------------------------------------------------------#
  564.   def marshal_dump
  565.   end
  566.   #---------------------------------------------------------------------------#
  567.   # marshal_load                                                              #
  568.   #---------------------------------------------------------------------------#
  569.   def marshal_load(obj)
  570.   end
  571. end
  572.  
  573. #-----------------------------------------------------------------------------#
  574. # Bitmap                                                                      #
  575. #-----------------------------------------------------------------------------#
  576. class Bitmap
  577.   RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  578.   # 传送到内存的API函数
  579.   RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  580.   RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  581.   #---------------------------------------------------------------------------#
  582.   # _dump                                                                     #
  583.   #---------------------------------------------------------------------------#
  584.   def _dump(limit)
  585.     data = "rgba" * width * height
  586.     RtlMoveMemory_pi.call(data, address, data.length)
  587.     [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # 压缩
  588.   end
  589.   #---------------------------------------------------------------------------#
  590.   # _load                                                                     #
  591.   #---------------------------------------------------------------------------#
  592.   def self._load(str)
  593.     w, h, zdata = str.unpack("LLa*")
  594.     b = self.new(w, h)
  595.     RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4)
  596.     return b
  597.   end
  598.   #---------------------------------------------------------------------------#
  599.   # address                                                                   #
  600.   #---------------------------------------------------------------------------#
  601.   def address
  602.     # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
  603.     buffer, ad = "xxxx", object_id * 2 + 16
  604.     RtlMoveMemory.call(buffer, ad, 4)
  605.     ad = buffer.unpack("L")[0] + 8
  606.     RtlMoveMemory.call(buffer, ad, 4)
  607.     ad = buffer.unpack("L")[0] + 16
  608.     RtlMoveMemory.call(buffer, ad, 4)
  609.     return buffer.unpack("L")[0]
  610.   end
  611. end
  

评分

参与人数 1星屑 +50 收起 理由
Anson + 50 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-1 13:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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