Project1

标题: F9调试窗口加强 [打印本页]

作者: IamI    时间: 2008-8-29 18:48
标题: F9调试窗口加强
昨天晚上闲来无事,拿VX来研究,发现功能果然比XP强大(除了画风以外……)
练习脚本的时候就写了这么个东西,恩,就是这样,
截图:

功能4条:
   功能一:在Debug窗口当中添加“E”一条,允许修改事件的独立开关。
   功能二:在Debug窗口按下shift键,将存档于一号档位。
   功能三:在Debug窗口显示伪·FPS。并不是很准确。
   功能四:允许在独立开关中做一些邪恶的事情。范例内效果很明显
范例:
http://rpg.blue/upload_program/files/Debugging_100434961.rar
脚本:
  1. #==============================================================================
  2. # ■ Debug拓展VX版
  3. #    作者IamI
  4. #------------------------------------------------------------------------------
  5. #  这个脚本的功能是:拓展Debug窗口的功能。
  6. #   功能一:在Debug窗口当中添加“E”一条,允许修改事件的独立开关。
  7. #   功能二:在Debug窗口按下shift键,将存档于一号档位。
  8. #   功能三:在Debug窗口显示伪·FPS。并不是很准确。
  9. #   功能四:允许在独立开关中做一些邪恶的事情。范例内效果很明显。
  10. #   怨念:此脚本只是本人练习VX用,没想到这样一个脚本我也能磨蹭几个小时= =
  11. #         啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊我退化了吗……
  12. #==============================================================================
  13. #==============================================================================
  14. # ■ Game_Map
  15. #------------------------------------------------------------------------------
  16. #  追加定义,取得地图ID
  17. #==============================================================================
  18. class Game_Map
  19.   attr_reader :map_id
  20. end
  21. #==============================================================================
  22. # ■ Game_Event
  23. #------------------------------------------------------------------------------
  24. #  追加定义,开放Event。
  25. #==============================================================================
  26. class Game_Event
  27.   attr_reader :event
  28. end
  29. #==============================================================================
  30. # ■ Game_SelfSwitches
  31. #------------------------------------------------------------------------------
  32. #  追加定义。使独立开关能够保存其他类型的值
  33. #==============================================================================
  34. NULLSTR = "Nil[OFF]"
  35. class Game_SelfSwitches
  36.   #--------------------------------------------------------------------------
  37.   # ● 获取自我开关
  38.   #     key : 键
  39.   #--------------------------------------------------------------------------
  40.   def [](key)
  41.     if @data[key] == nil
  42.       if key[2] == "A" or key[2] == "B" or key[2] == "C" or key[2] == "D"
  43.         return false
  44.       else
  45.         return NULLSTR
  46.       end
  47.     end
  48.     return @data[key]
  49.   end
  50. end

  51. #==============================================================================
  52. # ■ Window_FPS
  53. #------------------------------------------------------------------------------
  54. #  伪·FPS计算窗
  55. #==============================================================================
  56. class Window_FPS < Window_Base
  57.   def initialize
  58.     super(424,366,120,50)
  59.     @time = Time.now
  60.     @fs = 0
  61.     @fps = 60
  62.     refresh
  63.   end
  64.   def update
  65.     @fs += 1
  66.     nt = Time.now
  67.     tc = (nt - @time)
  68.     if tc >= 1
  69.       @fps = @fs
  70.       @fs = 0
  71.       @time = nt
  72.       refresh
  73.     end
  74.   end
  75.   def refresh
  76.     self.contents.clear
  77.     self.contents.draw_text(self.contents.rect,"伪FPS:" + @fps.to_s)
  78.   end
  79. end

  80. #==============================================================================
  81. # ■ Window_DebugLeft
  82. #------------------------------------------------------------------------------
  83. #  调试画面、指定开关及变量块的窗口。
  84. #==============================================================================

  85. class Window_DebugLeft < Window_Selectable
  86.   #--------------------------------------------------------------------------
  87.   # ● 初始化对象
  88.   #     x     : 窗口的 X 坐标
  89.   #     y     : 窗口的 Y 坐标
  90.   #--------------------------------------------------------------------------
  91.   def initialize(x, y)
  92.     super(x, y, 176, 416)
  93.     self.index = 0
  94.     refresh
  95.   end
  96.   #--------------------------------------------------------------------------
  97.   # ● 刷新
  98.   #--------------------------------------------------------------------------
  99.   def refresh
  100.     @switch_max = ($data_system.switches.size - 1 + 9) / 10
  101.     @variable_max = ($data_system.variables.size - 1 + 9) / 10
  102.     @item_max = @switch_max + @variable_max + $game_map.events.values.size
  103.     create_contents
  104.     for i in 0...@item_max
  105.       draw_item(i)
  106.     end
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 描绘项目
  110.   #     index : 项目编号
  111.   #--------------------------------------------------------------------------
  112.   def draw_item(index)
  113.     if index < @switch_max
  114.       n = index * 10
  115.       text = sprintf("S [%04d-%04d]", n+1, n+10)
  116.     elsif index < @variable_max + @switch_max
  117.       n = (index - @switch_max) * 10
  118.       text = sprintf("V [%04d-%04d]", n+1, n+10)
  119.     else
  120.       n = (index - @switch_max - @variable_max)
  121.       text = "E " + $game_map.events.values[n].event.name
  122.     end
  123.     rect = item_rect(index)
  124.     rect.x += 4
  125.     rect.width -= 8
  126.     self.contents.clear_rect(rect)
  127.     self.contents.draw_text(rect, text)
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   # ● 获取模式
  131.   #--------------------------------------------------------------------------
  132.   def mode
  133.     if self.index < @switch_max
  134.       return 0
  135.     elsif self.index < @switch_max + @variable_max
  136.       return 1
  137.     else
  138.       return 2
  139.     end
  140.   end
  141.   #--------------------------------------------------------------------------
  142.   # ● 获取开头显示部分的 ID
  143.   #--------------------------------------------------------------------------
  144.   def top_id
  145.     if self.index < @switch_max
  146.       return self.index * 10 + 1
  147.     elsif self.index < @switch_max + @variable_max
  148.       return (self.index - @switch_max) * 10 + 1
  149.     else
  150.       return self.index - @switch_max - @variable_max
  151.     end
  152.   end
  153. end

  154. #==============================================================================
  155. # ■ Window_DebugRight
  156. #------------------------------------------------------------------------------
  157. #  调试画面、单独显示开关以及变量的窗口。
  158. #==============================================================================

  159. class Window_DebugRight < Window_Selectable
  160.   #--------------------------------------------------------------------------
  161.   # ● 定义实例变量
  162.   #--------------------------------------------------------------------------
  163.   attr_reader   :mode                     # 模式 (0:开关、1:变量)
  164.   attr_reader   :top_id                   # 最前显示部分的 ID
  165.   #--------------------------------------------------------------------------
  166.   # ● 初始化对象
  167.   #     x : 窗口的 X 坐标
  168.   #     y : 窗口的 Y 坐标
  169.   #--------------------------------------------------------------------------
  170.   def initialize(x, y)
  171.     super(x, y, 368, 10 * WLH + 32)
  172.     self.index = -1
  173.     self.active = false
  174.     @item_max = 10
  175.     @mode = 0
  176.     @top_id = 1
  177.     @hash = {0 => "A",1 => "B",2 => "C",3 => "D",4 => "E",5 => "F",6 => "G",7 => "H",8 => "I",9 => "J"}
  178.     refresh
  179.   end
  180.   #--------------------------------------------------------------------------
  181.   # ● 刷新
  182.   #--------------------------------------------------------------------------
  183.   def refresh
  184.     self.contents.clear
  185.     for i in 0...@item_max
  186.       draw_item(i)
  187.     end
  188.   end
  189.   #--------------------------------------------------------------------------
  190.   # ● 描绘项目
  191.   #     index   : 项目编号
  192.   #--------------------------------------------------------------------------
  193.   def draw_item(index)
  194.     current_id = @top_id + index
  195.     id_text = sprintf("%04d:", current_id)
  196.     if @mode == 2
  197.       id_text = ""
  198.     end
  199.     id_width = self.contents.text_size(id_text).width
  200.     ############################################
  201.     color = false
  202.     ############################################
  203.     if @mode == 0
  204.       name = $data_system.switches[current_id]
  205.       status = $game_switches[current_id] ? "[ON]" : "[OFF]"
  206.     elsif @mode == 1
  207.       name = $data_system.variables[current_id]
  208.       status = $game_variables[current_id]
  209.     else
  210.       name = "独立开关" + @hash[index].to_s
  211.       status = $game_self_switches[[$game_map.map_id,@top_id + 1,@hash[index]]]
  212.       if status.is_a?(TrueClass) or status.is_a?(FalseClass)
  213.         status = status ? "[ON]" : "[OFF]"
  214.       else
  215.         unless status == NULLSTR
  216.           ############
  217.           color = true
  218.           ############
  219.           status = "[" + status.type.to_s + ":" + status.inspect + "]"
  220.         end
  221.       end
  222.     end
  223.     if name == nil
  224.       name = ""
  225.     end
  226.     rect = item_rect(index)
  227.     rect.x += 4
  228.     rect.width -= 8
  229.     self.contents.clear_rect(rect)
  230.     if color == false
  231.       self.contents.font.color = normal_color
  232.     else
  233.       self.contents.font.color = system_color
  234.     end
  235.     self.contents.draw_text(rect, id_text)
  236.     rect.x += id_width
  237.     rect.width -= id_width + 60
  238.     self.contents.draw_text(rect, name)
  239.     rect.width += 60
  240.     self.contents.draw_text(rect, status, 2)
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● 设置模式
  244.   #     id : 新模式
  245.   #--------------------------------------------------------------------------
  246.   def mode=(mode)
  247.     if @mode != mode
  248.       @mode = mode
  249.       refresh
  250.     end
  251.   end
  252.   #--------------------------------------------------------------------------
  253.   # ● 设置最先显示的 ID
  254.   #     id : 新的 ID
  255.   #--------------------------------------------------------------------------
  256.   def top_id=(id)
  257.     if @top_id != id
  258.       @top_id = id
  259.       refresh
  260.     end
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # ● 囧方法,取得独立开关的三个数值,我实在懒得去逐个逐个算了……
  264.   #--------------------------------------------------------------------------
  265.   def tvt
  266.     return $game_map.map_id,@top_id + 1,@hash[self.index]
  267.   end
  268. end

  269. #==============================================================================
  270. # ■ Scene_Debug
  271. #------------------------------------------------------------------------------
  272. #  处理调试画面的类。
  273. #==============================================================================

  274. class Scene_Debug < Scene_Base
  275.   #--------------------------------------------------------------------------
  276.   # ● 开始处理
  277.   #--------------------------------------------------------------------------
  278.   def start
  279.     super
  280.     create_menu_background
  281.     @left_window = Window_DebugLeft.new(0, 0)
  282.     @right_window = Window_DebugRight.new(176, 0)
  283.     @help_window = Window_Base.new(176, 272, 368, 144)
  284.     @left_window.top_row = $game_temp.debug_top_row
  285.     @left_window.index = $game_temp.debug_index
  286.     @right_window.mode = @left_window.mode
  287.     @right_window.top_id = @left_window.top_id
  288.     @hash = {0 => "A",1 => "B",2 => "C",3 => "D",4 => "E",5 => "F",6 => "G",7 => "H",8 => "I",9 => "J"}
  289.     @fps_shower = Window_FPS.new
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # ● 结束处理
  293.   #--------------------------------------------------------------------------
  294.   def terminate
  295.     super
  296.     dispose_menu_background
  297.     $game_map.refresh
  298.     @left_window.dispose
  299.     @right_window.dispose
  300.     @help_window.dispose
  301.     @fps_shower.dispose
  302.     $game_map.need_refresh = true
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   # ● 更新画面
  306.   #--------------------------------------------------------------------------
  307.   def update
  308.     super
  309.     update_menu_background
  310.     @right_window.mode = @left_window.mode
  311.     @right_window.top_id = @left_window.top_id
  312.     @left_window.update
  313.     @right_window.update
  314.     @fps_shower.update
  315.     $game_temp.debug_top_row = @left_window.top_row
  316.     $game_temp.debug_index = @left_window.index
  317.     if @left_window.active
  318.       update_left_input
  319.     elsif @right_window.active
  320.       update_right_input
  321.     end
  322.    
  323.     if Input.trigger?(Input::SHIFT)
  324.       Sound.play_decision
  325.       file = File.open("Save1.rvdata", "wb")
  326.       write_save_data(file)
  327.       file.close
  328.       wlh = 24
  329.       @help_window.contents.clear
  330.       @help_window.contents.draw_text(4, wlh * 0, 336, wlh, "已保存于一号档。")
  331.     end
  332.   end
  333.   #--------------------------------------------------------------------------
  334.   # ● 更新左侧窗口的输入
  335.   #--------------------------------------------------------------------------
  336.   def update_left_input
  337.     if Input.trigger?(Input::B)
  338.       Sound.play_cancel
  339.       $scene = Scene_Map.new
  340.       return
  341.     elsif Input.trigger?(Input::C)
  342.       Sound.play_decision
  343.       wlh = 24
  344.       if @left_window.mode == 0
  345.         text1 = "C (Enter) : ON / OFF"
  346.         @help_window.contents.draw_text(4, 0, 336, wlh, text1)
  347.       elsif @left_window.mode == 1
  348.         text1 = "← (Left)    :  -1"
  349.         text2 = "→ (Right)   :  +1"
  350.         text3 = "L (Pageup)   : -10"
  351.         text4 = "R (Pagedown) : +10"
  352.         @help_window.contents.clear_rect(4, wlh * 0, 336, wlh)
  353.         @help_window.contents.draw_text(4, wlh * 0, 336, wlh, text1)
  354.         @help_window.contents.draw_text(4, wlh * 1, 336, wlh, text2)
  355.         @help_window.contents.draw_text(4, wlh * 2, 336, wlh, text3)
  356.         @help_window.contents.draw_text(4, wlh * 3, 336, wlh, text4)
  357.       else
  358.         text1 = "C (Enter) : ON / OFF"
  359.         @help_window.contents.draw_text(4, 0, 336, wlh, text1)        
  360.       end
  361.       @left_window.active = false
  362.       @right_window.active = true
  363.       @right_window.index = 0
  364.     end
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # ● 更新右侧窗口的输入
  368.   #--------------------------------------------------------------------------
  369.   def update_right_input
  370.     if Input.trigger?(Input::B)
  371.       Sound.play_cancel
  372.       @left_window.active = true
  373.       @right_window.active = false
  374.       @right_window.index = -1
  375.       @help_window.contents.clear
  376.     else
  377.       current_id = @right_window.top_id + @right_window.index
  378.       if @right_window.mode == 0
  379.         if Input.trigger?(Input::C)
  380.           Sound.play_decision
  381.           $game_switches[current_id] = (not $game_switches[current_id])
  382.           @right_window.refresh
  383.         end
  384.       elsif @right_window.mode == 1
  385.         last_value = $game_variables[current_id]
  386.         if Input.repeat?(Input::RIGHT)
  387.           $game_variables[current_id] += 1
  388.         elsif Input.repeat?(Input::LEFT)
  389.           $game_variables[current_id] -= 1
  390.         elsif Input.repeat?(Input::R)
  391.           $game_variables[current_id] += 10
  392.         elsif Input.repeat?(Input::L)
  393.           $game_variables[current_id] -= 10
  394.         end
  395.         if $game_variables[current_id] > 99999999
  396.           $game_variables[current_id] = 99999999
  397.         elsif $game_variables[current_id] < -99999999
  398.           $game_variables[current_id] = -99999999
  399.         end
  400.         if $game_variables[current_id] != last_value
  401.           Sound.play_cursor
  402.           @right_window.draw_item(@right_window.index)
  403.         end
  404.       elsif @right_window.mode == 2
  405.         if Input.trigger?(Input::C)
  406.           Sound.play_decision
  407.           $game_self_switches[@right_window.tvt] = (not $game_self_switches[@right_window.tvt])         
  408.           @right_window.refresh
  409.         end        
  410.       end
  411.     end
  412.   end
  413.   
  414.   #--------------------------------------------------------------------------
  415.   # ● 写入存档数据
  416.   #     file : 写入文件用对象 (已经打开)
  417.   #--------------------------------------------------------------------------
  418.   def write_save_data(file)
  419.     characters = []
  420.     for actor in $game_party.members
  421.       characters.push([actor.character_name, actor.character_index])
  422.     end
  423.     $game_system.save_count += 1
  424.     $game_system.version_id = $data_system.version_id
  425.     @last_bgm = RPG::BGM::last
  426.     @last_bgs = RPG::BGS::last
  427.     Marshal.dump(characters,           file)
  428.     Marshal.dump(Graphics.frame_count, file)
  429.     Marshal.dump(@last_bgm,            file)
  430.     Marshal.dump(@last_bgs,            file)
  431.     Marshal.dump($game_system,         file)
  432.     Marshal.dump($game_message,        file)
  433.     Marshal.dump($game_switches,       file)
  434.     Marshal.dump($game_variables,      file)
  435.     Marshal.dump($game_self_switches,  file)
  436.     Marshal.dump($game_actors,         file)
  437.     Marshal.dump($game_party,          file)
  438.     Marshal.dump($game_troop,          file)
  439.     Marshal.dump($game_map,            file)
  440.     Marshal.dump($game_player,         file)
  441.   end
  442.   
  443. end
复制代码

恩,附带练习正则表达式的时候对话加强脚本一只:
  1. #==============================================================================
  2. # ■ 信息显示Orz版
  3. #------------------------------------------------------------------------------
  4. #  功能很简单,实现更简单
  5. #   \B 加粗开始
  6. #   \b 加粗中断
  7. #   \I 倾斜开始
  8. #   \i 倾斜中断
  9. #   \S 阴影开始
  10. #   \s 阴影中断
  11. #   \oC[r,g,b] 将颜色设成RGB。
  12. #==============================================================================
  13. #==============================================================================
  14. # ■ Window_Message
  15. #------------------------------------------------------------------------------
  16. #  显示文章的信息窗口。
  17. #==============================================================================
  18. class Window_Message
  19.   #--------------------------------------------------------------------------
  20.   # ● 特殊文字变换
  21.   #--------------------------------------------------------------------------
  22.   alias oooooorz_convert_special_characters convert_special_characters
  23.   def convert_special_characters
  24.     oooooorz_convert_special_characters
  25.     @text.gsub!(/\\B/)              { "\x09" }
  26.     @text.gsub!(/\\b/)              { "\x10" }
  27.     @text.gsub!(/\\I/)              { "\x11" }
  28.     @text.gsub!(/\\i/)              { "\x12" }
  29.     @text.gsub!(/\\S/)              { "\x13" }
  30.     @text.gsub!(/\\s/)              { "\x14" }   
  31.     #@text.gsub!(/\\oC\[([0-255]+)\,([0-255]+)\,([0-255]+)\/i]) { "\x15[#{$1},#{$2},#{$3}]"}
  32.     @text.gsub!(/\\oC\[([0-9]+)\,([0-9]+)\,([0-9]+)\]/i) { "\x15[#{$1},#{$2},#{$3}]" }
  33.   end
  34.   #--------------------------------------------------------------------------
  35.   # ● 更新消息
  36.   #--------------------------------------------------------------------------
  37.   def update_message
  38.     loop do
  39.       c = @text.slice!(/./m)            # 获取下一条文字
  40.       case c
  41.       when nil                          # 没有可以显示的文字
  42.         finish_message                  # 更新结束
  43.         break
  44.       when "\x00"                       # 换行
  45.         new_line
  46.         if @line_count >= MAX_LINE      # 行数为最大时
  47.           unless @text.empty?           # 如果还有增加则继续
  48.             self.pause = true           # 等待输入
  49.             break
  50.           end
  51.         end
  52.       when "\x01"                       # \C[n]  (更改文字色)
  53.         @text.sub!(/\[([0-9]+)\]/, "")
  54.         contents.font.color = text_color($1.to_i)
  55.         next
  56.       when "\x02"                       # \G  (显示所持金)
  57.         @gold_window.refresh
  58.         @gold_window.open
  59.       when "\x03"                       # \.  (等待 1/4 秒)
  60.         @wait_count = 15
  61.         break
  62.       when "\x04"                       # \|  (等待 1 秒)
  63.         @wait_count = 60
  64.         break
  65.       when "\x05"                       # \!  (等待输入)
  66.         self.pause = true
  67.         break
  68.       when "\x06"                       # \>  (瞬间显示 ON)
  69.         @line_show_fast = true
  70.       when "\x07"                       # \<  (瞬间显示 OFF)
  71.         @line_show_fast = false
  72.       when "\x08"                       # \^  (不等待输入)
  73.         @pause_skip = true
  74.       ##############################################
  75.       when "\x09"
  76.         self.contents.font.bold = true
  77.       when "\x10"
  78.         self.contents.font.bold = false
  79.       when "\x11"
  80.         self.contents.font.italic = true
  81.       when "\x12"
  82.         self.contents.font.italic = false
  83.       when "\x13"
  84.         self.contents.font.shadow = true
  85.       when "\x14"
  86.         self.contents.font.shadow = false
  87.       when "\x15"                       # \C[n]  (更改文字色)
  88.         @text.sub!(/\[([0-9]+)\,([0-9]+)\,([0-9]+)\]/, "")
  89.         contents.font.color = Color.new($1.to_i,$2.to_i,$3.to_i)
  90.         next
  91.       ##############################################
  92.       else                              # 普通文字
  93.         contents.draw_text(@contents_x, @contents_y, 40, WLH, c)
  94.         c_width = contents.text_size(c).width
  95.         @contents_x += c_width
  96.       end
  97.       break unless @show_fast or @line_show_fast
  98.     end
  99.   end
  100. end
复制代码

就是这样……
作者: 越前リョーマ    时间: 2008-8-29 20:09
竟然到J了…… = =
作者: trentswd    时间: 2008-8-29 21:06
好奇独立开关后面几个东西怎么各种数据类型都有了OTZ

好物……膜拜……收走
作者: 火鸡三毛老大    时间: 2008-8-29 21:33
汗……
DEBUG还显示FPS干什么……
直接按F2即可……
作者: IamI    时间: 2008-8-29 21:37
以下引用火鸡三毛老大于2008-8-29 13:33:33的发言:

汗……
DEBUG还显示FPS干什么……
直接按F2即可……

这……这……本来写上去只是为了检验上次yangff计算FPS的方法是不是准……结论是……不准{/ll}
这渣去掉很方便的。
作者: 木葬枫    时间: 2009-1-3 19:08
发布完毕   VIP + 2
发布地址:http://rpg.blue/web/htm/news1233.htm
作者: DeathKing    时间: 2009-7-26 14:28
有了调试独立开关的东西……这的确是个强物。

同意4#,F2王道




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