Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Toast Message. (Всплывающие сообщения)

Toast Message. (Всплывающие сообщения) 2 года 10 мес. назад #77064

  • KageDesu
  • KageDesu аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 56
  • Спасибо получено: 129
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
    Яндекс.Диск
  • Администратор запретил публиковать записи гостям.
    За этот пост поблагодарили: JackCL, Lekste, DeadElf79, Ren310, strelokhalfer, Демий, RastaManGames, Yros, MaltonTheWarrior, Dethrone и еще 4 пользователей

    Toast Message. (Всплывающие сообщения) 2 года 8 мес. назад #78772

    • strelokhalfer
    • strelokhalfer аватар
    • Вне сайта
    • Архитектор Миров
    • Знатный грамотей
    • Сообщений: 1632
    • Спасибо получено: 1058
    • Даритель Стимкея2 место Сбитая кодировкаОрганизатор конкурсов2 место ПрограммистПереводчик
    А вот ещё одна бага форума, форум её не считает.
    "Стрелок, что-то ты неочень похож на свой аватар..."(с)
    Последнее редактирование: 2 года 8 мес. назад от strelokhalfer.
    Администратор запретил публиковать записи гостям.

    Toast Message. (Всплывающие сообщения) 2 года 8 мес. назад #78777

    • DeadElf79
    • DeadElf79 аватар
    • Вне сайта
    • Заблокирован
    • Сообщений: 3142
    • Спасибо получено: 2598
    • Программист1 место в ГотвУчительПисатель 3 местоПроект месяца 1 место3 местоОрганизатор конкурсов
    Надеюсь, автор будет не против, если я перенесу скрипт на XP для своих целей?
    Кстати, этот код меня несколько настораживает. То есть это специальный тег для вставки... двух пробелов? О.о
    # Ищи в окрестноснях строки 80
    temp_string.gsub!(/\\i\[\d{0,3}\]/) { "  " }
    123
    Последнее редактирование: 2 года 8 мес. назад от DeadElf79.
    Администратор запретил публиковать записи гостям.
    За этот пост поблагодарили: strelokhalfer

    Toast Message. (Всплывающие сообщения) 2 года 8 мес. назад #78778

    • strelokhalfer
    • strelokhalfer аватар
    • Вне сайта
    • Архитектор Миров
    • Знатный грамотей
    • Сообщений: 1632
    • Спасибо получено: 1058
    • Даритель Стимкея2 место Сбитая кодировкаОрганизатор конкурсов2 место ПрограммистПереводчик
    Может, своего рода, табуляция?
    "Стрелок, что-то ты неочень похож на свой аватар..."(с)
    Администратор запретил публиковать записи гостям.

    Toast Message. (Всплывающие сообщения) 2 года 8 мес. назад #78779

    • DeadElf79
    • DeadElf79 аватар
    • Вне сайта
    • Заблокирован
    • Сообщений: 3142
    • Спасибо получено: 2598
    • Программист1 место в ГотвУчительПисатель 3 местоПроект месяца 1 место3 местоОрганизатор конкурсов
    Стрелок, присмотрись к коду и увидишь пример использования:
    Текст,\i[300]больше текста
    И итогом этого будет:
    Текст, больше текста

    Надеюсь, автор всё же появится и расскажет, что он такое хотел этим нам сказать.
    123
    Администратор запретил публиковать записи гостям.

    Toast Message. (Всплывающие сообщения) 2 года 8 мес. назад #78780

    • strelokhalfer
    • strelokhalfer аватар
    • Вне сайта
    • Архитектор Миров
    • Знатный грамотей
    • Сообщений: 1632
    • Спасибо получено: 1058
    • Даритель Стимкея2 место Сбитая кодировкаОрганизатор конкурсов2 место ПрограммистПереводчик
    Последний вход
    2 мес. назад
    Надейся) А в демо примера нет?
    "Стрелок, что-то ты неочень похож на свой аватар..."(с)
    Последнее редактирование: 2 года 8 мес. назад от strelokhalfer.
    Администратор запретил публиковать записи гостям.

    Toast Message. (Всплывающие сообщения) 2 года 8 мес. назад #78781

    • DeadElf79
    • DeadElf79 аватар
    • Вне сайта
    • Заблокирован
    • Сообщений: 3142
    • Спасибо получено: 2598
    • Программист1 место в ГотвУчительПисатель 3 местоПроект месяца 1 место3 местоОрганизатор конкурсов
    Я не смотрю демки, я читаю пост и код. И вот нигде припоминания двух пробелов нет. Ладно, все равно под себя меняю, так что уберу строку.
    123
    Администратор запретил публиковать записи гостям.

    Toast Message. (Всплывающие сообщения) 2 года 8 мес. назад #78999

    • KageDesu
    • KageDesu аватар
    • Вне сайта
    • Бывалый
    • Сообщений: 56
    • Спасибо получено: 129
    strelokhalfer пишет:
    Последний вход
    2 мес. назад
    Надейся) А в демо примера нет?
    Надежда умирает последней... :)
    Надеюсь, автор будет не против, если я перенесу скрипт на XP для своих целей?
    Не против.
    Надеюсь, автор всё же появится и расскажет, что он такое хотел этим нам сказать.
    i - это для отображения иконки в тексте. В примере посмотрите.
    Сейчас не скажу в чём там именно суть, уже забыл.
    Администратор запретил публиковать записи гостям.

    Toast Message. (Всплывающие сообщения) 2 года 8 мес. назад #79000

    • strelokhalfer
    • strelokhalfer аватар
    • Вне сайта
    • Архитектор Миров
    • Знатный грамотей
    • Сообщений: 1632
    • Спасибо получено: 1058
    • Даритель Стимкея2 место Сбитая кодировкаОрганизатор конкурсов2 место ПрограммистПереводчик
    Но на данный момент, команда заменяет на два пробела
    "Стрелок, что-то ты неочень похож на свой аватар..."(с)
    Администратор запретил публиковать записи гостям.
    Время создания страницы: 0.293 секунд