Код:
#===============================================================================
=begin
Graphics Font
Скрипт позволяет использовать в диалогах "шрифт" из картинки.
Автор: caveman
История версий:
1.01 - Ядро, поддержка англ/рус диалогов и окон выбора,
только режим "один шрифт"
настройки: indent, size, space
спецсимволы строки, кроме цвета.
1.02 - Отдельная поддержка всех окон меню
=end
#===============================================================================
class GraphicsFont
attr_reader :current_font
attr_reader :use_alldialog
attr_reader :use_allmenu
attr_reader :indent
attr_reader :space
attr_reader :size
attr_accessor :curr_size
attr_accessor :color
def initialize
# ==================== НАСТРОЙКИ ===========================
# включенный флажок означает, что игра печатает только
# шрифтом @current_font из картинки
@use_alldialog = true
# включенный флажок означает, что игра печатает шрифтом @current_font
# из картинки и в окнах меню
@use_allmenu = true
# текущий шрифт из картинки
@current_font = "f_1"
# == ДЕФОЛТНЫЕ НАСТРОЙКИ ШРИФТА, МОГУТ ЗАМЕНИТЬСЯ ИЗ ФАЙЛА ==
# расстояние между буквами
@indent = 2
# пробел
@space = 10
# высота (размер)
@size = 24
@curr_size = size
# дефолтный цвет
@color = Color.new(0,0,0,0)
@letters_eng =
['A','B','C','D','E','F','G','H','I','J','K','L','M','N', \
'O','P','Q','R','S','T','U','V','W','X','Y','Z',\
'a','b','c','d','e','f','g','h','i','j','k','l','m','n',\
'o','p','q','r','s','t','u','v','w','x','y','z',\
'1','2','3','4','5','6','7','8','9','0','!','?','.',',','(',')',\
'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р',\
'С','Т','У','Ф','Х','Ц','Ч','Щ','Ш','Ь','Ы','Ъ','Э','Ю','Я',\
'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р',\
'с','т','у','ф','х','ц','ч','щ','ш','ь','ы','ъ','э','ю','я']
load_current_font
end
def load_current_font
@bitmaps = []
@font_bmp = nil
if @current_font == nil || @current_font == ""
return
end
if !FileTest.exist?("Graphics/Fonts/#{@current_font}.png")
p 'не найдена картинка шрифта'
return
end
if !FileTest.exist?("Graphics/Fonts/#{@current_font}.txt")
p 'не найдены настройки шрифта'
return
end
font_bmp = Cache.load_bitmap("Graphics/Fonts/", "#{@current_font}.png", 0)
@file=File.open("Graphics/Fonts/#{@current_font}.txt","r")
@lines = @file.readlines
@lines[0].gsub(/\A(.+?)\:(.+?)\Z/) do
@size = $2.to_s.to_i # размер (высота) шрифта
end
@lines[1].gsub(/\A(.+?)\:(.+?)\Z/) do
@indent = $2.to_s.to_i # расстояние между буквами
end
@lines[2].gsub(/\A(.+?)\:(.+?)\Z/) do
@space = $2.to_s.to_i # размер пробела
end
@lines[3].gsub(/\A(.+?)\:(.+?)\Z/) do
@str = $2.to_s # список ширин
end
x = 0
y = 0
width = 0
for i in 0..@letters_eng.size-1
@str.gsub(/\A(.+?)\,(.+?)\Z/) do
width = $1.to_s.to_i
@str = $2.to_s # список ширин
end
if width > 0
bmp = Bitmap.new(width,@size)
if x + width > font_bmp.width
x = 0
y += @size
end
bmp.blt(0, 0, font_bmp, Rect.new(x,y,width,@size))
x += width
@bitmaps.push(bmp.clone)
elsif
@bitmaps.push(nil)
end
end
end
def get_bitmap(char)
for i in 0..@letters_eng.size-1
if char == @letters_eng[i]
return @bitmaps[i]
end
end
return nil
end
end
class Window_Base
def draw_text(*args)
flag = false
if self.instance_of?(Window_Message) || self.instance_of?(Window_ChoiceList)
flag = $font.use_alldialog
elsif
flag = $font.use_allmenu
end
if flag
if args[0].instance_of?(Rect)
x = args[0].x
y = args[0].y
text = args[1].clone
elsif
x = args[0]
y = args[1]
text = args[4].to_s
end
for i in 0..text.length-1
bmp = $font.get_bitmap(text[i])
if bmp != nil
size_mul = $font.curr_size.to_f / $font.size.to_f
src_rect = Rect.new(0, 0, bmp.width, bmp.height)
dest_rect = Rect.new(x, y, (bmp.width*size_mul).to_i,(bmp.height*size_mul.to_i))
contents.stretch_blt(dest_rect, bmp, src_rect)
x += dest_rect.width + $font.indent
elsif text[i] == ' '
x += $font.space
end
end
elsif
contents.draw_text(*args)
end
end
def process_new_line(text, pos)
pos[:x] = pos[:new_x]
pos[:y] += $font.curr_size
pos[:height] = $font.curr_size
end
def text_size(str)
size = 0
size_mul = $font.curr_size.to_f / $font.size.to_f
for i in 0..str.length-1
c = str[i]
bmp = $font.get_bitmap(c)
if bmp != nil
size += (bmp.width * size_mul).to_i + $font.indent
elsif c == ' '
size += ($font.space * size_mul).to_i
end
end
return Rect.new(0,0,size,$font.curr_size)
end
def change_color(color, enabled = true)
contents.font.color.set(color)
contents.font.color.alpha = translucent_alpha unless enabled
$font.color = color
end
def make_font_bigger
contents.font.size += 8 if contents.font.size <= 64
$font.curr_size += 8 if $font.curr_size <= 64
end
def make_font_smaller
contents.font.size -= 8 if contents.font.size >= 16
$font.curr_size -= 8 if $font.curr_size >= 16
end
end
class Scene_Title < Scene_Base
def start
super
$font = GraphicsFont.new
SceneManager.clear
Graphics.freeze
create_background
create_foreground
create_command_window
play_title_music
end
end
Социальные закладки