Вызов call из экрана screen

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

Чтобы не порушить всю адресацию и прочие неважные нам детальки, в Renpy нельзя из экрана делать call (переход на метку с последующим возвратом). Можно перейти на метку в новом контексте, но тогда Renpy спрячет все экраны screen. Это пример того, как можно организовать call по кнопке и отобразить спрятанные экраны, словно их и не прятали. Но кнопку, по которой мы прыгнули на метку, лучше спрятать. Или заменить кнопкой возвращения назад.

# чтобы вызвать локацию кнопкой на экране screen, нужно вызывать в ее в новом контексте.
# то есть открывается как бы другая игра. и прячутся все прежние экраны.
init python:
    # стартовое количество денег для тестирования
    i = 10
    # переменные для хранения состояния экранов до вызова call
    screens = []
    # флаг вызова локации в новом контексте
    is_call = False
    # из экрана нельзя выполнить обычный call label
    # создадим его аналог
    class MyCall(Action):
        def __init__(self, label, *args, **kwargs):
            self.label = label
            self.args = args
            self.kwargs = kwargs
        def __call__(self):
            global screens, is_call
            # запоминаем экраны
            screens = renpy.current_screen().screen_name
            # включаем флаг вызова нового контекста (чтобы спрятать кнопку)
            is_call = True
            # вызываем локацию в новом контексте
            renpy.call_in_new_context(self.label, *self.args, **self.kwargs)
    # функция для восстановления экранов в новом контексте
    def show_screens():
        for i in screens:
            renpy.show_screen(i)
    # функция для возвращениея из локации в новом контексте
    def myreturn():
        global screens, is_call
        # снять флаг новой локации, чтобы кнопка ее вызова снова появилась
        is_call = False
        # спрятать экраны
        for i in screens:
            renpy.hide_screen(i)
        Return()
    # чтобы можно было привязать к копке, например
    MyReturn = renpy.curry(myreturn)

# экран из которого можно выполнить call
screen test:
    text _(str(i) + " денег") align(.05, .05)
    # кнопку показываем лишь, если не выполнен call по ее нажатию
    if not is_call:
        # кнопка, которая выполняет аналог call label
        textbutton _("Чит") align(.95, .05) action MyCall("menu1")

label start:
    show expression "images/bg.jpg"
    show screen test
    "Вы создали новую игру Ren'Py."
    "Добавьте сюжет, изображения и музыку и отправьте её в мир!"
    return

# другая локация, из которой можно вернуться в то же место игры
# при желании можно передавать параметры при вызове
# тогда, вызывать например так можно: ... action MyCall("menu1", plus=100)
label menu1(plus=10):
    # отобразить все экраны, спрятанные при вызове локации в новом контексте
    $ show_screens()

    # собственно какие-то действия
    $ loop1 = True
    # зацикливаем до нажатия 3-й кнопки
    while loop1:
        menu:
            "+[plus]":
                $ i += plus
            "-[plus]":
                $ i -= plus
            "Вернуться":
                $ loop1 = False

    # возвращаемся туда, откуда пришли, восстанавливая прежнее положение дел
    # вместо return
    $ MyReturn()()

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