Войти на сайт

Авторизация, ждите ...
×

ТЕМА: [VX Ace]Отладочный оверлей

[VX Ace]Отладочный оверлей 5 года 6 мес. назад #96571

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Проект месяца 2 местоОрганизатор конкурсовУчительПисатель 3 место3 местоПрограммист RubyПроект месяца 1 место1 место в ГотвВетеран
Отладочный оверлей
Debug Overlay

Информация:
Автор: DeadElf79
Версия: 1.0

Описание:
Добавляет инструмент для визуальной отладки разрабатываемой игры. Для всех сцен, являющихся потомками Scene_Base (то есть для всех вообще) создает изображение, которое расположено поверх всего. На это изображение можно выводить различную информацию - тексты, значения переменных, обводить прямоугольниками какие-нибудь места на экране.

По умолчанию при включенных переключателях 161 и 162 на оверлей выводятся прямоугольники окон и квадратики с обозначением расположения событий на карте.

Примеры различных настроек (прошу не обращать внимания на недорисованный графоний):
Вывод на оверлей всех ивентов [ Нажмите, чтобы развернуть ]

Вывод на оверлей ивентов, которые имеют не пустую графику и не графику из тайлсета [ Нажмите, чтобы развернуть ]


Код:
# DeadElf79's Debug Overlay
# version: 1.0
 
$imported = {} if $imported.nil?
$imported["De79 Debug Overlay"] = true
 
module De79DebugOverlay
  # overlay settings
  COLOR_DEFAULT = Color.new(255,128,0)
  FONT_DEFAULT_SIZE = 20
  FONT_DEFAULT_NAME = ['Arial']
  FONT_DEFAULT_OUTLINE = false
  FONT_DEFAULT_SHADOW = false
  FONT_DEFAULT_OUTLINE_COLOR = Color.new(0,0,0,128)
 
  # overlay settings
  HASH_SWITCHES = {
    161 => [Scene_Base, :debug_window_rects],
    162 => [Scene_Map,  :debug_event_rects]
  }
  INT_LINE_HEIGHT = 26
 
  # 'debug events' settings
  BOOL_SHOW_TILED_EVENTS = false
  BOOL_SHOW_NOGFX_EVENTS = false
  HASH_SHOW_EVENT_ID = {
    :for_tiled => false,
    :for_no_gfx => false,
    :for_all_other => true
  }
 
  # no settings anymore!
end
 
def debug_clear
  return if SceneManager.scene.nil?
  return if SceneManager.scene.overlay.nil?
  SceneManager.scene.overlay.bitmap.clear
end
 
def debug_text(x,y,text,flags=[],color=nil)
  return if SceneManager.scene.overlay.nil?
  ov = SceneManager.scene.overlay.bitmap
  px, py = x, y
  tw = ov.text_size(text.to_s).width
  th = ov.text_size(text.to_s).height
  unless flags.empty?
    px = x - tw/2   if flags.include?(:center_x)
    py = y - th/2  if flags.include?(:center_y)
  end
  ov.draw_text(px,py,tw,th,text)
end
 
def debug_text_array(x,y,text_aray,flags=[],color=nil)
  return if SceneManager.scene.overlay.nil?
  ov = SceneManager.scene.overlay.bitmap
  maxes = []
  text_array.each{|t|maxes.push(t.size)}
  tw = ov.text_size(text_array[maxes.index(maxes.max)]).width
  th = De79DebugOverlay::INT_LINE_HEIGHT
 
  text_array.each{|text|
    debug_text(x,y,text,flags,color)
  }
end
 
def debug_rect(x,y,w,h,solid=true,border=1,color=nil)
  return if SceneManager.scene.overlay.nil?
  color ||= De79DebugOverlay::COLOR_DEFAULT
  ov = SceneManager.scene.overlay.bitmap
  if solid
    ov.fill_rect(x,y,w,h,color)
  else
    ov.fill_rect(x,y,w,border,color)
    ov.fill_rect(x,y,border,h,color)
    ov.fill_rect(x,y+h-border,w,border,color)
    ov.fill_rect(x+w-border,y,border,h,color)
  end
end
 
def debug_easy_rect(rect,solid=true,border=1,color=nil)
  return if SceneManager.scene.overlay.nil?
  debug_rect(
    rect.x,
    rect.y,
    rect.width,
    rect.height,
    solid,
    border,
    color
  )
end
 
class Scene_Base
  attr_accessor :overlay
 
  alias de79_debug_overlay_initialize initialize
  def initialize
    de79_debug_overlay_initialize
    @overlay = $TEST ? Sprite.new : nil
    setup_overlay
    refresh_overlay
  end  
 
  def setup_overlay
    return if @overlay.nil?
    @overlay.bitmap = Bitmap.new(Graphics.width,Graphics.height)
    @overlay.z = 12345
    @overlay.bitmap.font.name = De79DebugOverlay::FONT_DEFAULT_NAME
    @overlay.bitmap.font.size = De79DebugOverlay::FONT_DEFAULT_SIZE
  end
 
  def refresh_overlay
    return if $game_switches.nil?
    return if @overlay.nil?
    debug_clear
    De79DebugOverlay::HASH_SWITCHES.each do |switch_id, calling|
      if $game_switches[switch_id]
        unless calling[0].nil?
          if self.is_a? calling[0]
            method(calling[1]).call
          end
        end
      end
    end
  end
 
  def debug_window_rects
    windows = instance_variables.select{|v|instance_variable_get(v).is_a? Window}
    return if windows.size < 1
    windows.each do |win|
      rect = win.bitmap.rect
      rect.x, rect.y = win.x, win.y
      debug_easy_rect(rect,false)
    end
  end
 
  def debug_event_rects
    return unless self.is_a? Scene_Map
    puts "start debug events"
    $game_map.events.each_value do |event|
      rect = nil
      if (0..Graphics.width).include?(event.screen_x)
        if (0..Graphics.height).include?(event.screen_y)
          if event.character_name == ""
            if event.tile_id > 0 && De79DebugOverlay::BOOL_SHOW_TILED_EVENTS
              rect = Rect.new(event.screen_x - 16,event.screen_y - 32, 32,32)
              if De79DebugOverlay::HASH_SHOW_EVENT_ID[:for_tiled]
                debug_text(
                    event.screen_x,
                    event.screen_y,
                    event.id,
                    [:center_x,:center_y]
                  )
              end
            else
              if De79DebugOverlay::BOOL_SHOW_NOGFX_EVENTS
                rect = Rect.new(event.screen_x - 16,event.screen_y - 32, 32,32)
              end
            end
          else
            rect = Rect.new(event.screen_x - 16,event.screen_y - 32, 32,32)
          end
        end
      end
 
      debug_easy_rect(rect,false,3) unless rect.nil?
    end
  end
end
Последнее редактирование: 5 года 6 мес. назад от DeadElf79.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Демий, Paranoid
Модераторы: NeKotZima
Время создания страницы: 0.223 секунд