| 
		
			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
 Яндекс.Диск
 
			 |