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 МБ)
Ядиск
Благодарности:
Всем! =)