Форум Anivisual закрыт. Вы не можете создавать новые темы или писать ответы. Форум будет работать в режиме архива.
Пользователи · Поиск по форуму · · · Регистрация

Помощь по Ren'Py (Вопрос\Ответ)

Admin

#1
Сюда пользователи сайта могут писать вопросы о тех или иных функциях движка 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:

СОНЦЕ

#587
KripWorland, Я в шоке, но в доках ни слова про 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)
VK

KripWorland

#591
Цитата СОНЦЕ ()
Я в шоке, но в доках ни слова про for непосредственно в renpy. Зато есть while
Проблема в том, что по индексу к элементу словаря не обратится, это не список и не кортеж (кстати да, проверил, список тоже не обходит циклом for, видимо renpy его не может)
Значит придется обходить костылями - сначала делать список ключей, а уже потом обходить его по while

Ikuku

#592
KripWorland,
> В блоке, иницализированным как код python, все отрабатывает, а вот если в коде renpy, то матерится при запуске.

А почему блок python: не подходит? Его же можно и внутри скрипта использовать, не только "init python:". Так-то ренпи не понимает питоновские команды (не только for, но и операцию присвоения тоже), внутри скрипта их надо как-то экранировать (либо долларами построчно, либо в блок python)

Код
"Какой-то диалог."

python:
....for <что-то>

"Еще диалог"

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

KripWorland

#593
Ikuku, благодарю, этого я не знал. Что с ренпи, что с питоном познакомился около месяца назад, еще во многое предстоит вникнуть...

Тогда вопрос: почему цикл for в экранах отрабатывает "на ура" без всяких танцев с бубнами? Не требуя экранирования как код питона, хотя присвоения идут также через $
Сообщение отредактировал KripWorland - Среда, 30/Окт/2019, 22:37

Ikuku

#594
KripWorland
Лирическое отступление: в ренпи все завязано на операторах (они же statements). Всякие label, show и прочие - это операторы. За каждым оператором стоит питон-конструкция (функция/набор функций), но не у всех питоновских конструкций есть соответствующие операторы. У питоновского while вот есть оператор, а у питоновского for - нет.

Screen statements - это не те же самые операторы, которые используются внутри скрипта (хотя и там, и там есть, скажем, свой default, который выполняет аналогичные функции). И вот в списке экранных операторов for-оператор как раз есть, поэтому и отрабатывает. Почему он есть там, но отсутствует в списке скриптовых операторов, это... ну, PyTom так решил)) Могу предположить, что он закодил for в скринах тупо потому, что for в скринах используется колоссально много где, в том же дефолтном гуи - экран сохраненок, вывод пунктов меню, и т.д. А для скриптов for - это такой оверкилл (в отличие от while), там не так много примеров его использования можно придумать.

(Если что, в коде движка можно посмотреть и на закоденный For, и на закоденный While в файлах slast.py и ast.py в папке <папка с движком>/renpy/ и /renpy/sl2/.)

СОНЦЕ

#595
KripWorland
Цитата KripWorland ()
почему цикл for в экранах отрабатывает "на ура" без всяких танцев с бубнами?

потому что там не чистый ренпи, а Среда Экранов, там и не такое может заработать. возможно не стоит этим злоупотреблять, а то потом отвалится чего и не пойми где искать...
(*ойдержите*)

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

СОНЦЕ

#598
KripWorland
так, например
Код

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

#599
KripWorland
Еще альтернатива - построить все на базе 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

#600
IkukuСОНЦЕ, огромное спасибо за подсказки. Кажется разобрался и смогу запилить то, что мне нужно
Сообщение отредактировал KripWorland - Понедельник, 04/Ноя/2019, 17:18
Поиск: