-
DeadElf79
-
-
Вне сайта
-
Звездный Страж
-
- Сообщений: 3147
- Спасибо получено: 2650
-
-
|
Отладочный оверлей
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
|