Показано с 1 по 10 из 11

Тема: Graphic fonts

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию Graphic fonts

    Graphic fonts (VX ACE)
    Автор: caveman
    Версия: 1.01
    Тип: работа с текстом диалогов




    Описание:

    Cкрипт умеет подгружать "шрифт" из специальным образом сформированной картинки с буквами и отражать на диалоговых окнах его вместо стандартных шрифтов.

    Особенности:
    Статья сопровождается массивным описанием, читаем внимательно, по пунктам
    1. Рисуем, воруем в интернетах файл с буквами
    Спойлер шрифт:


    2. Форматируем его в графическом редакторе так, чтобы буквы шли в нужном порядке и занимали полностью
    ширину картинки (как только место кончается - переносим на другую строку). Не забываем про то, что ряды должны быть одинаковой высоты, называемой размером шрифта.
    Естественно, рисунки букв стоит делать основного размера, который будет использоваться в мейкере (в 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.

    3. Создаем файл описания шрифта, он должен иметь такое же наименование, что и рисунок, но расширение 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, если у вас только английский шрифт - то конец можно нулями не забивать.


    4. Создаем папку Fonts в папке Graphics и кидаем туда оба файла
    5. Вписываем в настройках скрипта его название. В разделе НАСТРОЙКИ @current_font = "..."
    6 ...
    7 PROFIT

    Примеры сворованного и криводорисованного шрифта:
    Спойлер пример диалога:

    Спойлер пример меню:


    Скрипт:
    Спойлер Код:

    Код:
    #===============================================================================
    =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


    Использование:
    Просто положите скрипт в Materials, сделайте шрифт, настройте согласно описанию и все.

    Дальнейшее развитие:
    1) Возможность ставить графический шрифт не по умолчанию, а вызывать его через \f[название_шрифта] на один диалог бокс
    2) Возможность ставить расцветку (то бишь тег \c[])
    3) Возможность включать графические шрифты для командных окон (типа меню) и, может быть для интерфейсных окон

    Демо:
    http://yadi.sk/d/0vE3nIkN6n1n6
    Последний раз редактировалось caveman; 17.07.2013 в 17:17. Причина: 1.02
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Graphic fonts