NEW_Window_ScrollText

Автор: Lipton
Версия скрипта: 1.0
Версия мейкера: VX Ace
Тип: Измененные и расширенные возможности Window_ScrollText
Условия использования/Лицензия: Разрешаю использовать везде.

Описание:
Изменяет свойства Window_ScrollText. Позволяет на его основе сделать прокручиваемое вверх-вниз окошко.

Особенности:
Позволяет задать координату нахождения окошка, ширину, высоту, скорость прокрутки, скорость ускоренной прокрутки и прозрачность окошка (не текста!).
Так же сделан перенос слов, если предложение больше окна.

Спойлер Код:
Код:
#==============================================================================
# NEW_Window_ScrollText
# From: Lipton
# Версия 1.0
#
# ** Изменяем работу с Window_ScrollText
# редактируется полностью класс Window_ScrollText
#------------------------------------------------------------------------------
# Возможность создавать окошки текста с прокруткой и авто форматированием по 
# ширине окна.
# 
# новые доступные тэги
# \x[100] - координата "X" верхнего левого угла окна
# \y[100] - координата "Y" верхнего левого угла окна
# \w[240] - ширина окна
# \h[400] - высота окна
# \op[120] - прозрачность окна (именно окна. а не выводимого текста!)
# \spd[0.5] - скорость прокрутки (число обязательно с точкой, 
#             то есть если вы хотите поставить скорость равную единице то нужно 
#             писать \\spd[1.0]!)
# \sspd[4.0] - скорость ускоренной прокрутки (Когда зажат Enter или Shift и 
#               так же число должно быть с точкой!)
# А так же:
#
# Если в окошке Show Scrolling Text поставить галку на No Fast Forward,
# то работать это будет так.
# Вы сможете прокручивать текст вверх вниз. Конечно при условии что текст 
# больше окна по высоте.
# Прокручивать текст соответственно стрелками вверх-вниз.
# Если зажать при этом Shift то будет ускоренная прокрутка.
# Ну и выход по нажатию Enter
#
# Если включить переключатель, номер которого указан в скрипте
# WINDOWS_VARIABLE_ON = 19
# то скрипт будет брать координаты окна, ширину и высоту из переменных 
# так же указанных в скрипте.
# WINODW_X = номер переменной хранящей координату "X" окна
# WINDOW_Y = номер переменной хранящей координату "Y" окна
# WINDOW_WIDTH = номер переменной хранящей ширину окна
# WINDOW_HEIGHT = номер переменной хранящей высоту окна
# игнорируя тэги внутри текста.
# Но теги на скорость и прозрачность по-прежнему будут работать!
#
# 
# ВНИМАНИЕ! Если слово больше окна, то точно вылезет за пределы.
#
#==============================================================================
# Разрешаю использовать где угодно. =)
#
#
#==============================================================================
module NEW_Window_ScrollText
  # WINDOWS_VARIABLE_ON = номер переключателя включающего работу окон от
  # переменных
  WINDOWS_VARIABLE_ON = 19
  
  # WINODW_X = номер переменной хранящей координату "X" окна
  # WINDOW_Y = номер переменной хранящей координату "Y" окна
  # WINDOW_WIDTH = номер переменной хранящей ширину окна
  # WINDOW_HEIGHT = номер переменной хранящей высоту окна

  WINDOW_X = 11
  WINDOW_Y = 12
  WINDOW_WIDTH = 13
  WINDOW_HEIGHT = 14
  
end
class Window_ScrollText < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, Graphics.width, Graphics.height)
    self.opacity = 0 #if !$game_message.scroll_no_fast
    self.arrows_visible = true
    @text_speed=0.5
    @text_shift_speed=1.0
    hide
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    if $game_message.scroll_mode
      update_message if @text
      start_message if !@text && $game_message.has_text?
    end
  end
  #--------------------------------------------------------------------------
  # * Start Message
  #--------------------------------------------------------------------------
  def start_message
    draw_text_ex(1, 1, $game_message.texts[0])
    if $game_switches[NEW_Window_ScrollText::WINDOWS_VARIABLE_ON]
      self.x = $game_variables[NEW_Window_ScrollText::WINDOW_X]
      self.y = $game_variables[NEW_Window_ScrollText::WINDOW_Y]
      self.width = $game_variables[NEW_Window_ScrollText::WINDOW_WIDTH]
      self.height = $game_variables[NEW_Window_ScrollText::WINDOW_HEIGHT]
    end
    @text = $game_message.all_text_new(self.width)
    @max_height=(($game_message.line_number*Font.default_size)- height+(Font.default_size/2)).to_i
    self.opacity = 255 if $game_message.scroll_no_fast
    self.opacity = 0 if !$game_message.scroll_no_fast
    self.arrows_visible = true if $game_message.scroll_no_fast
    self.arrows_visible = false if !$game_message.scroll_no_fast
    refresh
    show
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    reset_font_settings
    update_all_text_height
    create_contents
    draw_text_ex(4, 0, @text)
    self.oy = @scroll_pos = -height
    self.oy = @scroll_pos = 0 if $game_message.scroll_no_fast
  end
  #--------------------------------------------------------------------------
  # * Update Height Needed to Draw All Text
  #--------------------------------------------------------------------------
  def update_all_text_height
    @all_text_height = 1
    convert_escape_characters(@text).each_line do |line|
      @all_text_height += calc_line_height(line, false)
    end
    reset_font_settings
  end
  #--------------------------------------------------------------------------
  # * Calculate Height of Window Contents
  #--------------------------------------------------------------------------
  def contents_height
    @all_text_height ? @all_text_height : super
  end
  #--------------------------------------------------------------------------
  # * Update Message
  #--------------------------------------------------------------------------
  def update_message
    if !$game_message.scroll_no_fast
      @scroll_pos += scroll_speed 
    else
      @scroll_pos += scroll_speed if Input.press?(:DOWN)
      @scroll_pos -= scroll_speed if Input.press?(:UP)
      @scroll_pos = 0 if @scroll_pos <0
      @scroll_pos = @max_height if @scroll_pos > @max_height
    end
    self.oy = @scroll_pos
    terminate_message if @scroll_pos >= contents.height
    terminate_message if $game_message.scroll_no_fast && Input.trigger?(:C) #(Input.trigger?(:A) ||
  end
  #--------------------------------------------------------------------------
  # * Get Scroll Speed
  #--------------------------------------------------------------------------
  def scroll_speed
    if !$game_message.scroll_no_fast
      $game_message.scroll_speed * (show_fast? ? @text_shift_speed : @text_speed) #1.0 0.5
    else
      $game_message.scroll_speed * (Input.press?(:SHIFT) ? @text_shift_speed : @text_speed) #if $game_message.scroll_no_fast
    end
  end
  #--------------------------------------------------------------------------
  # * Determine if Fast Forward
  #--------------------------------------------------------------------------
  def show_fast?
    !$game_message.scroll_no_fast && (Input.press?(:A) || Input.press?(:C))
  end
  #--------------------------------------------------------------------------
  # * End Message
  #--------------------------------------------------------------------------
  def terminate_message
    @text = nil
    $game_message.clear
    hide
    self.x = 0
    self.y = 0
    self.width = Graphics.width
    self.height = Graphics.height
    @text_speed=0.5
    @text_shift_speed=1.0
  end
  
  def process_escape_character(code, text, pos)
    case code.upcase
    when 'X'
      self.x=(obtain_escape_param(text))
    when 'Y'
      self.y=(obtain_escape_param(text))
    when 'W'
      self.width=(obtain_escape_param(text))
    when 'H'
      self.height=(obtain_escape_param(text))
    when 'SPD'
      @text_speed=obtain_escape_param_f(text)
    when 'SSPD'
      @text_shift_speed=obtain_escape_param_f(text)
    when 'OP'
      self.opacity = (obtain_escape_param(text))
    else
      super
    end
    if $game_switches[NEW_Window_ScrollText::WINDOWS_VARIABLE_ON]
      self.x = $game_variables[NEW_Window_ScrollText::WINDOW_X]
      self.y = $game_variables[NEW_Window_ScrollText::WINDOW_Y]
      self.width = $game_variables[NEW_Window_ScrollText::WINDOW_WIDTH]
      self.height = $game_variables[NEW_Window_ScrollText::WINDOW_HEIGHT]
    end
  end
  
  def obtain_escape_param_f(text) 
    a=text.slice!(/^\[\d+(\.\d+)\]/) [/\d+(\.\d+)/].to_f rescue 0
    a=10 if a>10
    a
  end
  
end
class Game_Message
  attr_reader   :line_number                  # кол-во линий текста
  alias clear_new_text clear
  def clear
    clear_new_text
    @line_number = 1
  end
  
  def all_text_new(new_width=Graphics.width)
    test = Bitmap.new(1,1)
    r=""
    @texts.each {|text|
      s=test.text_size(text).width
      if s>new_width-32
        string=""
        word=""
        delta=""
        text.scan(/./) {|symb|
          word +=symb
          if symb == " "
            delta = string + word
            a=test.text_size(delta).width
            delta = ""
            if a > new_width-32
              r += string + "\n"
              @line_number+=1
              string =""
            end
            string += word
            word=""
          end
        }
        delta = string + word
        a=test.text_size(delta).width
        if a > new_width-32
          string += "\n" + word
        else
          string += word
        end
        r += string + "\n"
      else
        r += text + "\n"
      end
      @line_number+=1
    }
    test.dispose
    r
  end
end


Спойлер Скриншот:




Скачать демо:

Архив ZIP (1,32 МБ)
Ядиск

Благодарности:
Всем! =)