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

Больше
11 года 4 мес. назад #77064 от KageDesu
Toast Message

Информация:

Автор: Pheonix KageDesu

Версия скрипта: 1.0

Версия мейкера: VX ACE (RGGS 3)

Тип: Компонент, дополняющий систему

Условия использования/Лицензия: Данный скрипт можно использовать в любых проектах (в том числе и коммерческих), если указано моё авторство (Pheonix KageDesu) на данный скрипт.

Описание:

Всплывающие сообщения, поддерживают форматированный текст, не зависят от сцены. При вызове многократно, сообщения будут выстраиваться в очередь, при этом предыдущие пропадут не сразу, а через более короткое время. В самом коде есть комментарии и подробный пример использования скрипта.



Особенности:

  • Отображение всплывающего сообщения в одной из 7 заданных позициях или в произвольной ХY координате

  • Многострочность, цвет, вывод имени персонажа, иконки

  • Не зависит от сцены. Если сообщение появилось пока вы бродите по карте, то оно никуда не денется даже если вы начнёте битву или откроете меню, будьте внимательны. Сообщение уходит только по истечению его времени (можно указывать)

    Код:
    Code:
    #============================================================================== # 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 человек сказали спасибо.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
    Больше
    11 года 2 мес. назад - 11 года 2 мес. назад #78772 от strelokhalfer
    А вот ещё одна бага форума, форум её не считает.

    "Стрелок, что-то ты неочень похож на свой аватар..."(с)
    Последнее редактирование: 11 года 2 мес. назад пользователем strelokhalfer.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

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

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
    Больше
    11 года 2 мес. назад #78778 от strelokhalfer
    Может, своего рода, табуляция?

    "Стрелок, что-то ты неочень похож на свой аватар..."(с)

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
    Больше
    11 года 2 мес. назад #78779 от DeadElf79
    Стрелок, присмотрись к коду и увидишь пример использования:

    Текст,\i[300]больше текста

    И итогом этого будет:

    Текст, больше текста


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

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
    Больше
    11 года 2 мес. назад - 11 года 2 мес. назад #78780 от strelokhalfer

    Последний вход
    2 мес. назад

    Надейся) А в демо примера нет?

    "Стрелок, что-то ты неочень похож на свой аватар..."(с)
    Последнее редактирование: 11 года 2 мес. назад пользователем strelokhalfer.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
    Больше
    11 года 2 мес. назад #78781 от DeadElf79
    Я не смотрю демки, я читаю пост и код. И вот нигде припоминания двух пробелов нет. Ладно, все равно под себя меняю, так что уберу строку.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Больше
    11 года 1 мес. назад #78999 от KageDesu

    strelokhalfer пишет:

    Последний вход
    2 мес. назад

    Надейся) А в демо примера нет?

    Надежда умирает последней... :)

    Надеюсь, автор будет не против, если я перенесу скрипт на XP для своих целей?

    Не против.

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

    i - это для отображения иконки в тексте. В примере посмотрите.
    Сейчас не скажу в чём там именно суть, уже забыл.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
    Больше
    11 года 1 мес. назад #79000 от strelokhalfer
    Но на данный момент, команда заменяет на два пробела

    "Стрелок, что-то ты неочень похож на свой аватар..."(с)

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Проект месяца 3 место Проект месяца 1 место Ветеран Проект месяца 2 место Проект года 3 место Разработчик
    Больше
    5 года 10 мес. назад #117519 от Phileas
    Привет автору. Надеюсь, ты ещё читаешь форум.
    Пытаюсь использовать скрипт в своём некоммерческом проекте. Странный баг: на некоторых компьютерах тост отображается столько кадров, сколько задано (там же в кадрах время указывается, так?), на некоторых сообщение не исчезает очень долго. Не могу понять, с чем это связано.
    Буду благодарен за любую подсказку по решению этой проблемы.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Время создания страницы: 0.137 секунд
    Работает на Kunena форум