Имитация СМС для нового GUI

Закидываем пару файлов в проект и пишем СМС-сообщения в строках типа:
"{#l=Привет!<<smile>>}Хм, снова смс с незнакомого номера..."
# забрасываем sms.rpy и 7dots.rpy в папку game вашего проекта и пишем смс-ки
# теги для смс:
# "{#l=Привет!}" - для смс от левого собеседника
# "{#r=И тебе привет!}" - для смс от правого собеседника
# "{#c=Лосяш покинул беседу.}" - для системных смс по центру
# "{#on}" или $ sms_on() - показать окно с смс
# "{#off}" или $ sms_off() - спрятать окно с смс
# "{#cls}" или $ sms_cls() - очистить окно с смс
# в одной строке может быть несколько разных тегов и обычный текст
# "<<smile>>" - вот так добавлять картинки
# историю сообщений можно просмотреть, листая экран мышкой или колесиком
# так же реализовано плавное исчезновение/появление текстбокса с учетои смс

init python:
    # звуки смс
    sms_c = "sms_c"
    sms_l = "sms_l"
    sms_r = "sms_r"

    # длительность вибрации (если устройство ее поддерживает)
    sms_vibrate = .5

    # положение окна с смс
    sms_xalign, sms_yalign = .75, .25

    # размеры окна с смс (экран сотового)
    sms_width, sms_height = 450, 600

    # размеры одного смс
    sms_w, sms_h = int(sms_width * .75), int(config.screen_height * .05)

    # размеры заголовка с именем собеседника
    sms_caption_height = 100
    sms_caption_width = sms_width

    # имя собеседника
    sms_name = _("Неизвестный")

    # отступы для пузырьков смс
    sms_xpadding = 32
    sms_ypadding = 16
    # внешние
    sms_border = 16

    # для хранения текста всех смс
    sms_all = []

    # теги для смс - в центре, слева, справа
    sms_tags = ["c", "l", "r"]

    # все тэги для смс, включая управление окном
    sms_all_tags = sms_tags + ["on", "off", "cls"]

    # получить текст и стиль смс из строки типа "r=Привет!"
    def get_sms_text_style(txt):
        smsstyle, smstext = get_key_val(txt)
        if smsstyle in sms_tags:
            return "sms_" + smsstyle, smstext
        return None, txt

    # изъять текст смс из текстбокса и закинуть в экран смс
    def sms(text):
        global sms_all, sms_last_what
        # получить теги в виде строк
        tags = get_tags_str(text)
        # перебрать строки с тегами
        for i in tags:
            # разобрать строку на части, разделенные знаком =равно=
            key, val = get_key_val(i)
            # очистка окна смс
            if key == "cls":
                sms_cls()
            # показать окно смс
            if key == "on":
                sms_on()
            # спрятать окно смс
            if key == "off":
                sms_off()
            # новое сообщение в окне смс
            if key in sms_tags:
                if val is None:
                    val = ""
                # меняем смайлы на картинки
                val = val.replace("<<", "{image=")
                val = val.replace(">>", "}")
                 # меняем ссылки
                val = val.replace("|", "{a=call:")
                val = val.replace("]]", "{/a}")
                # добавляем на экран смс
                sms_all.append(key + "=" + val)
                renpy.restart_interaction()
                # звук сообщения
                sms_sound = "sms_" + key
                if sms_sound:
                    splay(sms_sound)
                    if sms_vibrate > 0:
                        renpy.vibrate(sms_vibrate)
    # из функции в action
    SMS = renpy.curry(sms)

    # показать экран смс
    def sms_on(effect=dissolve):
        renpy.show_screen('sms_screen', _layer="master")
        renpy.transition(effect)

    # спрятать экран смс
    def sms_off(effect=dissolve):
        renpy.hide_screen('sms_screen', layer="master")
        renpy.transition(effect)

    # очистить экран смс
    def sms_cls(effect=dissolve):
        global sms_all
        sms_all = []
        sms_on(effect=effect)

    # для хранения последнего видимого в текстбоксе текста
    sms_last_what = None

    # листать вниз
    yadjValue = float("inf")
    yadj = ui.adjustment()

init:
    # прозрачность
    transform transparent(alpha=.0):
        alpha alpha

    # стиль для фрейма с смсками
    style sms_frame is frame:
        # изображение пустого экрана
        background "smsbg"
        yfill True
        xminimum sms_width xmaximum sms_width
        yminimum sms_height ymaximum sms_height
        xmargin 0 ymargin 0
        xpadding 0 ypadding 0

init python:
    # стиль системных смс по центру
    style.sms_c = Style(style.button)
    style.sms_c.background = "#0000"
    style.sms_c.xalign = .5
    style.sms_c.xmargin = sms_border
    style.sms_c.ymargin = int(sms_border / 2) 
    style.sms_c.xpadding = 0
    style.sms_c.ypadding = sms_ypadding

    # стиль смс слева
    style.sms_l = Style(style.sms_c)
    style.sms_l.xpadding = sms_xpadding
    style.sms_l.ypadding = sms_ypadding
    style.sms_l.xmaximum = sms_w
    style.sms_l.yminimum = sms_h
    style.sms_l.xalign = .0
    style.sms_l.background = Frame("smsleft", 16, 16)

    # стиль смс справа
    style.sms_r = Style(style.sms_l)
    style.sms_r.xalign = 1.0
    style.sms_r.background = Frame("smsright", 16, 16)

    # цвет системных сообщений
    style.sms_c_text.color = "#0008"
    style.sms_l_text.color = "#fff"
    style.sms_r_text.color = "#fff"

init:
    # стиль окошка с именем собеседника
    style sms_caption is button:
        background Frame("smstop", 0, 0)
        xfill True
        xminimum sms_caption_width
        yminimum sms_caption_height

    # стиль окошка с именем собеседника
    style sms_bottom is button:
        background Frame("smsbottom", 0, 0)
        xminimum sms_caption_width
        yminimum int(sms_caption_height / 2)

    # стиль текста с именем собеседника
    style sms_caption_text is button_text:
        color "#fff"
        font "fonts/robotoblack.ttf"
        align (.4, .75)

    # эффект для появления/исчезновения текстбокса
    transform inout(t=.25):
        on show:
            alpha .0
            linear t alpha 1.0
        on hide:
            alpha 1.0
            linear t alpha .0

    # проявить
    transform inin(t=.25):
        alpha .0
        linear t alpha 1.0

    # растворить
    transform outout(t=.25):
        alpha 1.0
        linear t alpha .0

# экран с смсками
screen sms_screen:
    python:
        yadj.value = yadjValue
    vbox:
        align(sms_xalign, sms_yalign)
        frame:
            style "sms_frame"
            vbox:
                # имя собеседника
                textbutton sms_name style "sms_caption" align(.5, .0)
                # контейнер для пузырьков с сообщениями
                frame:
                    xmargin 0 ymargin 0
                    xpadding 0 ypadding 0
                    background None
                    viewport:
                        id "sms_vp"
                        xinitial 1.0
                        yfill False
                        mousewheel True
                        draggable False
                        side_xfill True
                        transclude
                        yadjustment yadj
                        vbox:
                            xfill True
                            yanchor 1.0
                            yalign 1.0
                            for i in sms_all:
                                # пузырьки с сообщениями
                                $ sms_style, sms_text = get_sms_text_style(i)
                                textbutton sms_text:
                                    if sms_style:
                                        style sms_style
                                    action []
        textbutton " " style "sms_bottom" action [] yalign 1.0

# переписываем экран say
screen say(who, what):
    # обработка тегов смс
    on "show" action SMS(what)
    on "hide" action SetVariable("sms_last_what", del_tags(what))

    style_prefix "say"

    window:
        # чтобы пустое окно не маячило
        if not del_tags(what):
            # а плавно исчезало
            if sms_last_what:
                at outout()
            else:
                # на старте было вообще невидимым
                at transparent()
        else:
            if not sms_last_what:
                # плавно появлялось, если появился видимый текст
                at inin()
            else:
                # чтобы текстовое окно плавно появлялось и исчезало в остальных случаях
                at inout()

        id "window"

        if who is not None:

            window:
                id "namebox"
                style "namebox"
                text who id "who"

        text what id "what"

    ## Если есть боковое изображение ("голова"), показывает её поверх текста.
    ## По стандарту не показывается на варианте для мобильных устройств — мало
    ## места.
    if not renpy.variant("small"):
        add SideImage() xalign 0.0 yalign 1.0

Комментарии

  1. На Андроиде в общем работвет, но ни одну картинку не показывает, смена пути никак не помогает

    ОтветитьУдалить
    Ответы
    1. картинки должны быть объявлены. способ работает с displayable, а не с файлами

      Удалить
    2. а что за приложение что вы на андроиде делаете?

      Удалить
  2. Hi, I'm trying to add your messaging system in my project, is there a way to use custom screen for this system? I have a modified say screen and when I add this everything is messed up. I hope you can help me.

    ОтветитьУдалить
    Ответы
    1. я не вижу ни твоего кода, ни багрепорта. и как я должен помогать, угадывать?

      Удалить
  3. else:
    if not sms_last_what:
    # плавно появлялось, если появился видимый текст
    at inin()
    else:
    # чтобы текстовое окно плавно появлялось и исчезало в остальных случаях
    at inout()

    Эта часть кода мешала текстбоксу, он каждый раз мигал при появлении текста
    Если у кого была еще такая проблема, вот решение - просто убрать код

    ОтветитьУдалить
  4. У меня вопрос, можно ли объявить несколько имен собеседника? Я найти не могу, просто есть sms_name по дефолту и все.

    ОтветитьУдалить
  5. Привет. Огромное спасибо за смс-ки ;) Всё пашет.
    Вопрос: на андроид версии историю сообщений можно просматривать "пальцем"?

    ОтветитьУдалить
  6. помогите мне реализовать наподобие систему, только вместо смс диалоговые окошки рядом с персонажами и в зависимости от тега оно было бы либо справа либо слево

    ОтветитьУдалить
    Ответы
    1. к сожалению, именно сейчас у меня нет времени делать чужие проекты, много работы. попробуйте написать на стене группы: https://vk.com/renpy

      Удалить
  7. Отличный ресурс, все работает, но возник вопрос, как можно изменить шрифт самих сообщений (нашел только шрифт имени собеседника в заглавии). Интересует сам шрифт и его размер (хотелось сделать поменьше)

    ОтветитьУдалить
    Ответы
    1. создать стили style sms_c_text, sms_l_text, sms_r_text, добавить туда font "имя_шрифта"

      Удалить
    2. ну и кроме font еще size размер_шрифта

      Удалить
    3. Можно пример в коде. Нужно менять какие-то строки в файле sms.rpy? или дописать туда строки? Я нашел кусок кода init python:
      # стиль системных смс по центру
      style.sms_c = Style(style.button)
      style.sms_c.background = "#0000"
      style.sms_c.xalign = .5
      style.sms_c.xmargin = sms_border
      style.sms_c.ymargin = sms_border / 2
      style.sms_c.xpadding = 0
      style.sms_c.ypadding = sms_ypadding

      # стиль смс слева
      style.sms_l = Style(style.sms_c)
      style.sms_l.xpadding = sms_xpadding
      style.sms_l.ypadding = sms_ypadding
      style.sms_l.xmaximum = sms_w
      style.sms_l.yminimum = sms_h
      style.sms_l.xalign = .0
      style.sms_l.background = Frame("smsleft", 16, 16)

      # стиль смс справа
      style.sms_r = Style(style.sms_l)
      style.sms_r.xalign = 1.0
      style.sms_r.background = Frame("smsright", 16, 16)

      # цвет системных сообщений
      style.sms_c_text.color = "da0000"
      style.sms_l_text.color = "#fff"
      style.sms_r_text.color = "#fff"

      Куда вписать название шрифта и размер?

      Удалить
    4. пример:

      init:

      style sms_c_text:
      font "arial.ttf"
      size 32

      Удалить
  8. А что означает отступы для пузырьков смс?

    ОтветитьУдалить
    Ответы
    1. чтобы сообщения не прижимались к краям экрана и друг к дружке

      Удалить
  9. при объявлении спрайтов с эффектом "dissolve" текстбокс постоянно исчезает и появляется.
    как исправить?

    ОтветитьУдалить
    Ответы
    1. справки по ренпаю можно навести здесь: https://vk.com/renpy

      Удалить

Отправить комментарий