Сообщения в игре (In-game Messages)

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

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

Для использования системы, скопируйте и вставьте нижеприведённый код в файл new.rpy в папку с вашей игрой:

init python:

    # Стили сообщения
    style.messageWindow = Style(style.window)
    style.messageColumns = Style(style.hbox)
    style.messageListBox = Style(style.vbox)
    style.messageListViewport = Style(style.viewport)
    style.messageButton = Style(style.button)
    style.messageButtonText = Style(style.button_text)
    style.messageScrollBar = Style(style.vscrollbar)
    style.messageBodyScrollBar = Style(style.vscrollbar)
    style.messageBodyBox = Style(style.vbox)
    style.messageBodyViewport = Style(style.viewport)
    style.messageText = Style(style.say_dialogue)
    style.messageControls = Style(style.hbox)

    # Значения стиля по умолчанию...
    style.messageWindow.ymaximum = 600

    style.messageColumns.spacing = 10

    style.messageListViewport.xminimum = 280
    style.messageListViewport.xmaximum = 280

    style.messageListBox.yalign = 0.0

    style.messageButton["Message"].xfill = True
    style.messageButton["CurrentMessage"].xfill = True

    style.messageButtonText["Message"].color="#99A"
    style.messageButtonText["CurrentMessage"].color="#FFF"
    
    style.messageBodyViewport.xminimum = 460
    style.messageBodyViewport.xmaximum = 460
    style.messageBodyViewport.ymaximum = 550

    style.messageBodyScrollBar.ymaximum=550

    style.messageControls.spacing = 10

    def init_messages():
        if hasattr(store, "messages") == False:
            store.messages = []
        
    def add_message(subject, sender, message, condition=None):
        init_messages()
        store.messages.append( (subject, sender, message, condition) )

    def show_messages():
        message = None

        while message != -1:
            message = show_message_ui(message)

    def show_message_ui(currentMessage):
        
        init_messages()

        messageCount = count_messages()

        ui.window(style=style.messageWindow)
        ui.hbox(style=style.messageColumns) # настройки для трёх столбцов элемента управления

        vp = ui.viewport(style=style.messageListViewport)

        ui.window(style=style.messageListBox)
        ui.vbox() # настройки для получения списка рассылки

        index = 0
        for message in store.messages:
            if (message[3] == None or eval(message[3]) == True):
                    styleIndex = "Message"
                    if (index == currentMessage):
                        styleIndex = "CurrentMessage"
                    ui.button(clicked=ui.returns(index),
                        style=style.messageButton[styleIndex])
                    ui.text(message[0] + " - " + message[1], style=style.messageButtonText[styleIndex])
            index = index + 1

        ui.close() # список рассылки в vbox

        ui.bar(adjustment=vp.yadjustment, style=style.messageScrollBar)

        ui.window(style=style.messageBodyBox)
        ui.vbox() # настройки для содержимого, находящегося справка; сообщения и кнопки

        ui.hbox()
        vp2 = ui.viewport(style=style.messageBodyViewport)

        if (currentMessage >= 0) and (currentMessage < messageCount):
            hasMessage = True
            ui.text(store.messages[currentMessage][2], style=style.messageText)
        else:
            hasMessage = False
            ui.null()
        ui.bar(adjustment=vp2.yadjustment, style=style.messageBodyScrollBar)

        ui.close()

        ui.hbox(style=style.messageControls) # настройки для кнопок

        ui.button(clicked=ui.returns(-1),
            style=style.messageButton["Закрыть сообщения"])
        ui.text("Закрыть сообщения", style = style.messageButtonText["Закрыть сообщения"])
        if hasMessage:
            ui.button(clicked=ui.returns(-2),
                style=style.messageButton["Удалить сообщения"])
            t = ui.text("Удалить сообщения", style = style.messageButtonText["Удалить сообщения"])

        ui.close() # кнопки в hbox


        ui.close() # столбец, находящийся справа в vbox
        ui.close() # столбцы в hbox

        result = ui.interact()

        if result == -2: #(удалить текущее сообщение)
            del store.messages[currentMessage]
            return None
        else:
            return result
            
    def count_messages():
        init_messages()
        return len(store.messages)

    def count_visible_messages():
        init_messages()
        
        count = 0
        
        for message in store.messages:
            if (message[3] == None or eval(message[3]) == True):
                count = count + 1
        return count

Пример использования (Example Usage)[править | править код]

init:
    $ e = Character('Эйлин', color="#c8ffc8")

# Игра начинается здесь.
label start:

    e "Добро пожаловать в систему обмена сообщениями! Прямо сейчас у вас нет ни одного сообщения."

    $ show_messages()

    e "Видите?"

    $ add_message("Добро пожаловать в систему обмена сообщениями", "Система сообщений",
        "Сейчас вам пришло первое сообщение!")

    e "Итак, мы добавили сообщение для вас."

    $ show_messages()
    
    e "Далее, мы добавим пару сообщений..."

    $ add_message("Мои фотографии из отпуска", "Боб", "Drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone " +
        "drone drone drone drone drone drone drone drone drone drone drone drone drone drone...")
    $ add_message("Где ты?", "Саймон", "Тебя уже давно не было на FaceSpace! То есть,"
        " {i}десять минут{/i}, чувак! Где ты?!")
    $ add_message("Купить вещи", "Миссисипи", "Знаете ли вы, что мужчина, купивший книги ранее,"+
        " продолжает их покупать? Как насчет того, чтобы купить несколько книг?\n"+
        "Вот несколько книг, которые могут вам понравиться:\n- {i}Убить простака{/i}\n"+
        "- {i}Девушка с пиратской татуировкой{/i}\n- {i}Кошка с девятью хвостами{/i}")
    $ add_message("Вторник", "Мама", "Ты не забыл, что обещал прийти во вторник?" +
        " Надеюсь, что не забыл.")
    $ add_message("Re: Вторник", "Мама", "Ты не позвонил. Ты все ещё собираешься прийти?"+
        " Я делаю пирог.")
    $ add_message("Re: Re: Вторник", "Мама", "Почему тебе не сказать, приедешь ты или нет?" +
        " Ты проверил свою почту? Ты в порядке? Надеюсь, ты не попал в автокатастрофу или" +
        " что-то подобное. Их всё время показывают в новостях. С тобой действительно все в порядке?" +
        " Пожалуйста, сообщи мне!")

    $ show_messages()
    
    e "Теперь мы добавим немного спама..."
    
    python:
        
        spam_filter = False
        
        #spam...
        for x in range(20):
            add_message("Миллиард долларов!", "Принц Терренс из Нигерии", "Я являюсь" +
                " управляющим нигерийского Центрального Банка и мне нужен иностранный счет," +
                " чтобы разместить миллиард долларов на два (2) месяца без всякой видимой" +
                " причины. Вы можете заработать миллионы в своих интересах, просто сообщите мне номер вашей кредитной карты" +
                " и ПИН-код сегодня!",
                condition="spam_filter == False")

    $ show_messages()
    
    e "Йеп! Хорошо, давайте включим спам-фильтр..."
    
    $ spam_filter = True
    $ show_messages()

    $ message_count = count_messages()
    $ visible_count = count_visible_messages()
    e "И после всего этого, теперь у вас %(message_count)s сообщения,
        из которых вы можете прочитать %(visible_count)s."

Источник[править | править код]

Статья "In-game Messages" на английском языке


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