Войти на сайт

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • Phileas
    • Phileas аватар
    • Вне сайта
    • Мастер
    • Сообщений: 188
    • Спасибо получено: 277
    • ВетеранПроект месяца 3 местоПроект месяца 1 местоПроект месяца 2 место
    Привет автору. Надеюсь, ты ещё читаешь форум.
    Пытаюсь использовать скрипт в своём некоммерческом проекте. Странный баг: на некоторых компьютерах тост отображается столько кадров, сколько задано (там же в кадрах время указывается, так?), на некоторых сообщение не исчезает очень долго. Не могу понять, с чем это связано.
    Буду благодарен за любую подсказку по решению этой проблемы.
    Администратор запретил публиковать записи гостям.
    Модераторы: NeKotZima
    Время создания страницы: 0.251 секунд