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

Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Ren'Py (Вопрос\Ответ)
Помощь по Ren'Py (Вопрос\Ответ)

Admin

#1
Сюда пользователи сайта могут писать вопросы о тех или иных функциях движка Ren'Py, а мы попытаемся на них ответить:)

Ikuku

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

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

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

СОНЦЕ

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

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

KripWorland

#604
Доброго времени суток. Подскажите, есть ли возможность программного создания меню выбора?
Т.е. код должен отрабатывать аналогично коду ренпи:

Код
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

СОНЦЕ

#605
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

#606
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

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

lf2mr

#608
Как получить в файл .py переменную из renpy?
есть игра на renpy, к ней прилагается папка с скриптами phyton, которые помогают игре и без них она не будет работать. требуется в одном из этих питон скриптов получить переменную из renpy, а точнее нужно узнать какой язык локализации в данный момент использует renpy. В обычных .rpy файлах язык легко определяется "renpy.game.preference.language" или короче "preference.language", но если я указываю это в .py файлах, то появляется ошибка что это переменная не определена и не является глобальной при обращении к ней. как-то считать из renpy эту переменную или ещё как???

Добавлено. Возможно без примера не понятно, тогда вот ниже начало кода питон файла, откуда мне следует вызвать переменную из renpy.


Код
from renpy import store
rp = store.renpy
ui = store.ui

# Allows to set RenPy variables from Python code
def set_var(name, value):
    setattr(store, name, value)

def say_with_narrator(text, color=None, **kwargs):
    if kwargs:
        # If we have extra arguments use them to format text
        text = text.format(**kwargs)
    if color:
        text = add_color_to_text(text, color)
    rp.say(None, text)

def jump(label):
    rp.jump(label)

# We want to access those variable from RenPy code so we have to use RenPy's "store" to hold them

store.current_stat_person = None
store.current_stat_attribute = None

def show_stat_change_bar(person, attribute_name):
    store.current_stat_person = person
    store.current_stat_attribute = attribute_name
Тут в коде автор даже анотацию приложил, что в секции ниже берёт переменные из renpy, которые потом ниже используются. Но так как я плохо знаком с программированием и питоном в частности, то задача для меня оказалась непростой.
Сообщение отредактировал lf2mr - Четверг, 14/Ноя/2019, 12:10

nek0mata

#609
Доброго времени суток.
Интересует такая тема: можно ли сделать скриншоты сохранений кастомной формы?

вот тута:
add FileScreenshot(number)

Использую imagemap, и хочется все таки закругленный прямоугольник для слота. А стандартный скриншот выглядит на таком фоне кривовато.

dmit

#610
nek0mata, можно вырезать из скриншота любую кастомную форму (см. AlphaMask)
в простейшем случае:
add AlphaMask (FileScreenshot(slot), "maska.png")
Сообщение отредактировал dmit - Суббота, 16/Ноя/2019, 16:07
планета FOREVER!!!      Unkenbro team

KripWorland

#612
Такая проблема: 
в моей игре меню выбора всегда сопровождается фразой-вопросом. Так вот, если сделать сохранение вперед тем, как выбрать какой-либо вариант, то после загрузки эта фраза-вопрос исчезает...
Но при этом исчезает не на всех развилках. Где-то пропадает, где-то нет... Систему уловить не получается...
Может кто-нибудь может подсказать, как сделать так, чтобы фраза-вопрос не пропадала?

kkongbbaesong

#613
Здравствуйте, может глупый вопрос задам, но как убрать из меню настроек кнопки основного меню?

То есть, открылась игра, там меню по стандартному списку: начать, загрузить и т.д.
Нажимаю настройки, а кнопки эти не пропадают (предварительно после screen navigation(): прописал tag menu, но не помогло).

Можете подсказать? Желательно с объяснением, т.к. хочу разобраться

KripWorland

#614
kkongbbaesong, экран navigation и содержит кнопки для всех меню. В экране настроек (screen preferences)  есть строка:
use game_menu(_("Настройки"), scroll="viewport"), т.е. использовать экран основного меню, который в свою очередь использует экран навигации.
Если нужно создать экран настроек без стандартных кнопок основного меню, нужно просто убрать эту строку.
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Ren'Py (Вопрос\Ответ)
Поиск: