Пользователи · Поиск по форуму · · Вход в аккаунт · Регистрация |
Форум о визуальных новеллах Для разработчиков Ren'Py Помощь по Ren'Py (Вопрос\Ответ) |
Помощь по Ren'Py (Вопрос\Ответ) |
KripWorland#586Доброго времени суток.
Застрял на обходе словаря циклом for. В блоке, иницализированным как код python, все отрабатывает, а вот если в коде renpy, то матерится при запуске. Через консоль тот же самый код отрабатывает. Подскажите куда копать? Вот мой код Код for key in AvailableActions: ....AvailableActions[key].active = False File "game/core/core.rpy", line 79: expected statement. for key in AvailableActions: |
СОНЦЕ#587KripWorland, Я в шоке, но в доках ни слова про for непосредственно в renpy. Зато есть while
Код $i=0 while i<len(AvailableActions): $AvailableActions[i].active = False $i+=1 Если что-то получится с for напиши плз, а то неужели мне никогда не доводилось его пользовать ![]() Сообщение отредактировал СОНЦЕ - Вторник, 29/Окт/2019, 23:06
|
KuroiZ64#588Доброго времени суток.
Вопрос по ATL. Хотел сделать отдаление с поворотом. Всё работает, но в начале и конце анимации изображение начинает дрожать. Это можно как-то исправить или я что-то не правильно делаю? Код image cg_die: anchor(0.5, 0.5) zoom 2 rotate 50 #alpha 0 xalign 0.55 yalign 0.55 "images/cg/cg10_die.png" with Dissolve(2.0) #linear 4.0 alpha 1 #Spause 5.0 parallel: ease_cubic 20.0 zoom 1.000 parallel: ease_cubic 20.0 rotate 0.000 parallel: ease_cubic 20.0 xalign 0.500 parallel: ease_cubic 20.0 yalign 0.500 parallel: pause 10 "images/cg/cg10_die2.png" with Dissolve(5.0) |
KripWorland#591Проблема в том, что по индексу к элементу словаря не обратится, это не список и не кортеж (кстати да, проверил, список тоже не обходит циклом for, видимо renpy его не может)
Значит придется обходить костылями - сначала делать список ключей, а уже потом обходить его по while |
Ikuku#592KripWorland,
> В блоке, иницализированным как код python, все отрабатывает, а вот если в коде renpy, то матерится при запуске. А почему блок python: не подходит? Его же можно и внутри скрипта использовать, не только "init python:". Так-то ренпи не понимает питоновские команды (не только for, но и операцию присвоения тоже), внутри скрипта их надо как-то экранировать (либо долларами построчно, либо в блок python) Код "Какой-то диалог." python: ....for <что-то> "Еще диалог" init и python - это два разных указателя на дочерний блок, init говорит "выполни этот кусок при запуске программы", а python - "ниже идет блок питоновского кода". Если их собрать вместе, то получится "выполни этот питоновский код при инициализации", но никто не мешает использовать по отдельности. |
KripWorland#593Ikuku, благодарю, этого я не знал. Что с ренпи, что с питоном познакомился около месяца назад, еще во многое предстоит вникнуть...
Тогда вопрос: почему цикл for в экранах отрабатывает "на ура" без всяких танцев с бубнами? Не требуя экранирования как код питона, хотя присвоения идут также через $ Сообщение отредактировал KripWorland - Среда, 30/Окт/2019, 22:37
|
Ikuku#594KripWorland
Лирическое отступление: в ренпи все завязано на операторах (они же statements). Всякие label, show и прочие - это операторы. За каждым оператором стоит питон-конструкция (функция/набор функций), но не у всех питоновских конструкций есть соответствующие операторы. У питоновского while вот есть оператор, а у питоновского for - нет. Screen statements - это не те же самые операторы, которые используются внутри скрипта (хотя и там, и там есть, скажем, свой default, который выполняет аналогичные функции). И вот в списке экранных операторов for-оператор как раз есть, поэтому и отрабатывает. Почему он есть там, но отсутствует в списке скриптовых операторов, это... ну, PyTom так решил)) Могу предположить, что он закодил for в скринах тупо потому, что for в скринах используется колоссально много где, в том же дефолтном гуи - экран сохраненок, вывод пунктов меню, и т.д. А для скриптов for - это такой оверкилл (в отличие от while), там не так много примеров его использования можно придумать. (Если что, в коде движка можно посмотреть и на закоденный For, и на закоденный While в файлах slast.py и ast.py в папке <папка с движком>/renpy/ и /renpy/sl2/.) |
KripWorland#597Доброго времени суток. Подскажите, есть ли возможность программного создания меню выбора?
Т.е. код должен отрабатывать аналогично коду ренпи: Код menu: Who "what" var_1 if conditions_1: jump varian_1 var_2 if conditions_2: jump varian_2 ... var_n if conditions_n: jump variant_n Сообщение отредактировал KripWorland - Понедельник, 04/Ноя/2019, 10:25
|
СОНЦЕ#598KripWorland,
так, например Код init python: class MenuItem(): caption = '' action = NullAction() menu_list = [] label main_menu: return label start: 'hello' python: menu_list = [] item = MenuItem() item.caption = 'jump foo' item.action = Jump('foo') menu_list.append(item) item = MenuItem() item.caption = 'jump start' item.action = Jump('start') menu_list.append(item) item = MenuItem() item.caption = 'quit' item.action = Quit() menu_list.append(item) call screen choice(menu_list) 'bar' label foo: 'foo' return Подробнее в официальной документации |
Ikuku#599KripWorland,
Еще альтернатива - построить все на базе renpy.display_menu. Смысл в чем: эта питоновская функция поможет вывести меню, сгенерированное из кортежей, в стиле стандартного экрана меню выбора. Кортежи должны быть вида (<что выводить на кнопке>, <какое значение вернуть>). После того, как юзер клацнет на определенном пункте меню, ренпай вернет соответствующее значение, и ничего больше делать не будет, поэтому после меню в скрипте надо прописать код, который будет ловить это значение и что-то с ним делать (прыгать на метку, исполнять какие-то команды, etc.) Конкретно код надо писать уже в зависимости от того, как выглядит словарь, но для примера возьмем что-то простое, вида { метка1: заголовок_меню1, метка2: заголовок_меню2, ... } Код label start: scene black "Какой-то диалог." $ menuitems = { "east": "Пойти на восток", "west": "Пойти на запад" } # собираем список кортежей, не забывая в итоговом списке поменять местами ключ словаря и его значение, чтобы можно было использовать в display_menu $ menu_tuples = [ (value, key) for key, value in menuitems.items() ] # "слова рассказчика" в сэй-боксе в меню $ narrator("Куда пойдем?", interact = False) # в переменную menu_result ловим результат нажатия на кнопку меню $ menu_result = renpy.display_menu(menu_tuples) # прыгаем на метку, имя которой поймали в menu_result # поскольку menu_result - строка, оператор jump ее не поймет, поэтому надо скормить эту строку сквозь "воронку" expression jump expression menu_result "Еще диалог" label west: "Пришли на запад." label east: "Пришли на восток." (Хотя для сложных систем вариант перегнать словарь в класс будет, наверное, чище... разве что свой обходчик для поиска написать придется. Тут уже в зависимости от задачи смотреть надо.) |
KripWorland#600Ikuku, СОНЦЕ, огромное спасибо за подсказки. Кажется разобрался и смогу запилить то, что мне нужно
Сообщение отредактировал KripWorland - Понедельник, 04/Ноя/2019, 17:18
|
| |||