-
caveman
-
-
Вне сайта
-
Архитектор Миров
-
- Сообщений: 1274
- Спасибо получено: 1307
-
-
|
Захотелось сделать для мейкера поддержку шрифтов из сторонних картинок, и начал с vxace. Существующих решений с ходу не
нашел, да и Эльф подтвердил, что нету.
Статья сопровождается массивным описанием, читаем внимательно.
1.Что это такое и как это применять?
В мейкере для окон диалогов мы можем применять стандартные или не очень шрифты, специально составленные и установленные куда-то в недра винды (не факт, правда, что у ваших игроков они будут установлены, так что дописывайте инструкции к играм, пользующим что-то нестандартное). Но что делать, если вы - художник или у вас есть художник, который может нарисовать вам красивые атмосферные буквы, типа этих :
Не заставлять же его формировать ttf файл, верно?
Вот поэтому я и написал небольшой скриптик, который будет еще улучшаться разными опциями и фичами, но уже с готовым ядром.
Итак, действия:
- Рисуем, воруем в интернетах файл с буквами
- Форматируем его в графическом редакторе так, чтобы буквы шли в нужном порядке и занимали полностью
ширину картинки (как только место кончается - переносим на другую строку). Не забываем про то, что ряды должны быть одинаковой высоты, называемой размером шрифта. Естественно, рисунки букв стоит делать основного размера, который будет использоваться в мейкере (в vx, обычно, это 24 пикселя).
Набор и порядок букв, задается скриптом, вот тут:
@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','!','?','.',',','(',')',\
'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р',\
'С','Т','У','Ф','Х','Ц','Ч','Щ','Ш','Ь','Ы','Ъ','Э','Ю','Я',\
'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р',\
'с','т','у','ф','х','ц','ч','щ','ш','ь','ы','ъ','э','ю','я']
Это не значит, что у вас должны быть картинки всех букв (в примере я обошелся только английскими буквами, цифрами и спецсимволами), но есть момент, который я опишу в следующем пункте. Сохраняем рисунок в PNG.
- Создаем файл описания шрифта, он должен иметь такое же наименование, что и рисунок, но расширение TXT.
Описание выглядит примерно так:size:24
indent:2
space:10
letters:12,13,13,13,13,13,11,12,5,15,12,12,14,13,11,14,11,14,12,13,12,10,14,11,12,13,10,9,10,11,10,10,16,11,6,10,12,8,12,10,10,9,12,10,9,11,10,9,12,9,11,14,9,10,10,11,11,10,12,9,11,11,6,9,5,6,7,7 где size - высота шрифта
indent - расстояние между картинками букв (если надо дополнительное)
space - размер пробела
letters - ширины всех букв в пикселях (придется нудно мерять вашу картинку), описанных в @letters_eng в одну строку без переноса. Если буквы нет, пишите 0, если у вас только английский шрифт - то конец можно нулями не забивать.
- Создаем папку Fonts в папке Graphics и кидаем туда оба файла
- Вписываем в настройках скрипта его название. В раздел НАСТРОЙКИ @current_font = "..."
- ...
- PROFIT
Пример использования графического шрифта в игре
2. Скрипт
#===============================================================================
=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
3. Демо
yadi.sk/d/0vE3nIkN6n1n6
|