-
KageDesu
-
-
Вне сайта
-
Мастер
-
- Сообщений: 101
- Спасибо получено: 346
-
-
|
Toast Message
Информация:
Автор: Pheonix KageDesu
Версия скрипта: 1.0
Версия мейкера: VX ACE (RGGS 3)
Тип: Компонент, дополняющий систему
Условия использования/Лицензия: Данный скрипт можно использовать в любых проектах (в том числе и коммерческих), если указано моё авторство (Pheonix KageDesu) на данный скрипт.
Описание:
Всплывающие сообщения, поддерживают форматированный текст, не зависят от сцены. При вызове многократно, сообщения будут выстраиваться в очередь, при этом предыдущие пропадут не сразу, а через более короткое время. В самом коде есть комментарии и подробный пример использования скрипта.
Особенности:
Отображение всплывающего сообщения в одной из 7 заданных позициях или в произвольной ХY координате
Многострочность, цвет, вывод имени персонажа, иконки
Не зависит от сцены. Если сообщение появилось пока вы бродите по карте, то оно никуда не денется даже если вы начнёте битву или откроете меню, будьте внимательны. Сообщение уходит только по истечению его времени (можно указывать)
Код:
#==============================================================================
# Toast Message v1.0 (7/1/15)
# by Pheonix KageDesu
#------------------------------------------------------------------------------
# Описание: Всплывающие сообщения, поддерживают форматированный текст,
# не зависят от сцены. При вызове многократно, сообщения будут выстраиваться
# в очередь, при этом их время на экране сократится.
#
# Пример вызова:
# Toast.show(Toast::POS_1,'Сообщение',Toast::SHORT) - однострочное
# Toast.show(Toast::POS_1,['Сообщение','Вторая строка'],Toast::SHORT) - многострочное
# Toast.show(Toast::POS_1,
# ['\c[16] Новый уровень:\c[0]',
# 'Посетите мастера для изучения новых способностей'],
# Toast::LONG)
# Метод Toast.show_xy(x,y,text,duration) - отображает сообщение в любых X и Y
# Toast.show_xy(120,58,'Сообщение в точке 120, 58',Toast::SHORT)
#Продолжительность
#SHORT - стандартная
#LONG - дольше
#Позиции
#POS_0
#POS_1
#POS_2
#POS_3
#POS_4
#POS_5
#POS_6
#Соответствие цифры позиции, положению на экране
##############################
# 3 1 4
#
#
# 0
#
#
# 5 2 6
##############################
#==============================================================================
# Данный скрипт можно использовать в любых проектах (в том числе и коммерческих),
# если указано моё авторство (Pheonix KageDesu) на данный скрипт.
#==============================================================================
#В этом модуле можно менять все значения на свои
module PKD_USER_SETTINGS
#Продолжительность показа сообщения
SHORT = 70
LONG = 150
#Цвета градиента окна сообщения
BACK_COLOR_1 = Color.new(0, 0, 0, 160); #Верхний цвет
BACK_COLOR_2 = Color.new(0, 0, 0, 160); #Нижний цвет
WAIT_SPEED_UP = 1 #Шаг, на сколько быстрее будет уходить с экрана сообщение,
#если за ним в очереди есть другое. Чем больше цифра, тем быстрее.
end
class PKD_Window_Toast < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(x,y,text,duration = nil)
super(x,y,10,10)
self.opacity = 0
@w = 0
text.each do |string|
temp_string = string.gsub(/\\[^inpvg]\[\d{0,3}\]/) { "" }
temp_string.gsub!(/\\i\[\d{0,3}\]/) { " " }
temp_string.gsub!(/\\n\[(\d{0,3})\]/) { actor_name($1.to_i) }
temp_string.gsub!(/\\p\[(\d{0,3})\]/) { party_member_name($1.to_i) }
temp_string.gsub!(/\\v\[(\d+)\]/) { $game_variables[$1.to_i] }
temp_string.gsub!(/\eG/i) { Vocab::currency_unit }
@w =[text_size(temp_string).width+standard_padding*2+12,@w].max
end
@w += standard_padding
@h = text.size * line_height + line_height
self.width = @w
self.height = @h
@text = text
@timer = duration
@step = 1 #Шаг таймера (чем больше, тем быстрее исчезнет с экрана) default = 1
create_contents
refresh
self.openness = 0
open unless @timer
end
def refresh
self.contents.clear
draw_main
yy = 0
@text.each do |string|
draw_text_ex(standard_padding,yy,string)
yy += line_height
end
end
#Ускорить таймер
def speedUp
@step += PKD_USER_SETTINGS::WAIT_SPEED_UP
end
#Показать сразу (без анимации)
def show
self.openness = 255
refresh
end
#==========================================================================
#SERVICE
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_timer if @timer
end
#==========================================================================
#PRIVATE
private
#Рисует прозрачный фон
def draw_main
rect1 = Rect.new(0, 0, contents_width, standard_padding)
rect2 = Rect.new(0, standard_padding, contents_width, contents_height)
rect3 = Rect.new(0, contents_height, contents_width, standard_padding)
contents.gradient_fill_rect(rect1, back_color2, back_color1, true)
contents.fill_rect(rect2, back_color1)
contents.gradient_fill_rect(rect3, back_color1, back_color2, true)
end
#Цвет градиента 1
def back_color1
PKD_USER_SETTINGS::BACK_COLOR_1
end
#Цвет градиента 2
def back_color2
PKD_USER_SETTINGS::BACK_COLOR_2
end
def update_timer
@timer -= @step if @timer > 0
if @timer <= 0
if open?
@timer = 10
close
else
dispose
end
end
end
end
module Toast
#Продолжительность
SHORT = PKD_USER_SETTINGS::SHORT
LONG = PKD_USER_SETTINGS::LONG
#Позиции
POS_0 = 0
POS_1 = 1
POS_2 = 2
POS_3 = 3
POS_4 = 4
POS_5 = 5
POS_6 = 6
#Соответствие цифры позиции, положению на экране
##############################
# 3 1 4
#
#
# 0
#
#
# 5 2 6
##############################
def self.init
@pool = []
end
#Показать сообщение
def self.show(position, text, duration)
@w = Graphics.width
@h = Graphics.height
w = init_toast(0,0,text,duration)
@x = 0
@y = 0
case position
when 0 ; @x = @w/2 - w.width/2; @y = @h/2 - w.height/2;
when 1 ; @x = @w/2 - w.width/2; @y = 0;
when 2 ; @x = @w/2 - w.width/2; @y = @h - w.height;
when 3 ; @x = 0 ; @y = 0;
when 4 ; @x = @w - w.width ; @y = 0;
when 5 ; @x = 0 ; @y = @h - w.height;
when 6 ; @x = @w - w.width ; @y = @h - w.height;
end
w.x = @x
w.y = @y
show_toast(w)
end
#Показать сообщение в пользовательских Х и Y координатах
def self.show_xy(x,y,text,duration)
show_toast(init_toast(x,y,text,duration))
end
#==========================================================================
#PRIVATE
private
def self.init_toast(x,y,text,duration)
w = PKD_Window_Toast.new(x,y,(text.is_a? Array) ? text : [text], duration)
@pool << w
return w
end
def self.show_toast(window)
t = Thread.new(window) { |w|
i = @pool.index(w)
if i != 0
@pool[i-1].speedUp if @pool[i-1]
loop do
i = @pool.index(w)
break if i == 0
sleep 0.05
end
end
w.show
w.update
loop do
if w.disposed?
break
end
w.update
sleep 0.01
end
@pool.shift
}.run
end
end
Toast.init
Скачать:
Демо (.rar архив, 1,4 Мб)
DropBox
Яндекс.Диск
|