Вызов call из экрана screen
Перейти к навигации
Перейти к поиску
Чтобы не порушить всю адресацию и прочие неважные нам детальки, в 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()()
- Ссылка на архив с проектом: test-call.zip
- Источник: Renpy для чайников: Вызов call из экрана screen
На главную страницу | Книга рецептов Энциклопедии Ren'Py | Renpy для чайников | Вернуться к началу статьи |