Имитация СМС

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску
Sms.jpg

Закидываем пару файлов в проект и пишем СМС-сообщения в строках типа:

"{#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(">>", "}")
                # добавляем на экран смс
                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

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

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

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

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

    # стиль окошка с именем собеседника
    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 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 True
                        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

На главную страницу Книга рецептов Энциклопедии Ren'Py Renpy для чайников Вернуться к началу статьи