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

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

Admin

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

TestGameHentai

#1231
Доброго времени суток! У меня тут возникла проблема. Некорректно работает кнопка "Подтвердить" в окне ввода имени персонажа при пустом поле. По сути просто напросто не видит переменную.

Цитата
I'm sorry, but an uncaught exception occurred.
While running game code:
  File "game/script.rpy", line 13, in script
    if cpl == "":
  File "game/script.rpy", line 13, in <module>
    if cpl == "":
NameError: name 'cpl' is not defined

-- Full Traceback ------------------------------------------------------------

Full traceback:
  File "game/script.rpy", line 13, in script
    if cpl == "":
  File "renpy/ast.py", line 1852, in execute
    if renpy.python.py_eval(condition):
  File "renpy/python.py", line 2249, in py_eval
    return py_eval_bytecode(code, globals, locals)
  File "renpy/python.py", line 2242, in py_eval_bytecode
    return eval(bytecode, globals, locals)
  File "game/script.rpy", line 13, in <module>
    if cpl == "":
NameError: name 'cpl' is not defined

Windows-7-6.1.7601-SP1
Ren'Py 7.4.5.1648
Memories 1.0
Fri Aug  6 22:44:25 2021

Если следовать далее через ENTER, всё спокойно читает, корректно работает. И с пустым полем, и с набранным. Если после прохода через ENTER всплывает вновь окно ввода имени персонажа, то кнопка "Подтвердить" после ввода имени будет выдавать не ошибку, а перейдёт вновь обратно на окно ввода.

Собственно, сам код:

Переменная в файле characters:
Код
define player = Character("[cpl]", color="#ffffff")

Запрос имени в файле script:
Код
label namepl:        "Как же меня зовут?"
        $ cpl = renpy.input("Назовите себя:", screen="charname", length=24, exclude="'\{\}\[\]@.,<>\"\|/№#$;%^:&?*()_=+1234567890`~").strip()
   Пробовал размещать дефайн персонажа и запрос имени в один файл - безрезультатно.

Окно:
Код
screen charname(prompt):    modal True
    frame:
        background Frame("#000000")
        align (0.5,0.5)
        xsize 600 ysize 350
        vbox:
            xfill True
            yfill True
            text prompt xalign 0.5
            input id "input" xalign 0.5
            hbox:
                xalign 0.5
                textbutton("Подтвердить"):
                    action Jump ("test")

Система "Анти-дебил", не позволяющая игроку пройти с пустым полем:
Код
label test:        "..."
        if cpl == "":
            "\[Требуется ввести имя\]"
            jump namepl
        else:
            "Точно."
            jump next

Продолжение игры при наличии имени:
   
Код
label next:        player "Меня зовут [cpl]."

P.s. У меня нет желания устанавливать "имя по умолчанию", дабы не конкретизировать персонажа.

lf2mr

#1232
Есть функция меняющая какие-то параметры, например:

Код
def myfunc():
    globals()['x'] = "Значение"
    return
Куда я могу вставить эту функцию, чтобы  она срабатывала например только при заходе на страницу настроек? Если вставляю это в screens.rpy, в блок screen preferences(), или ещё куда там, то срабатывает она постоянно и везде, а не только при переходе на этот screen.

СОНЦЕ

#1233
TestGameHentai

не удалось воспроизвести ошибку, но из кусочков предоставленнного кода кажется получилось сделать чтоб работало. проверь

Код
default cpl = ''
define player = Character("[cpl]", color="#ffffff")

init python:
    input_name = VariableInputValue('cpl',returnable = True)

screen charname(prompt):
    modal True
    frame:
        background Frame("#000000")
        align (0.5,0.5)
        xsize 600 ysize 350
        vbox:
            xfill True
            yfill True
            text prompt xalign 0.5
            input id "input" value input_name xalign 0.5
            hbox:
                xalign 0.5
                textbutton("Подтвердить"):
                    action Return(cpl)

label start:

label namepl:    
    "Как же меня зовут?"
    $ cpl = renpy.input("Назовите себя:", screen="charname", length=24, exclude="'\{\}\[\]@.,<>\"\|/№#$;%^:&?*()_=+1234567890`~").strip()
    #$ cpl = _return
    jump test
    return

label test:
    "..."
    if cpl == "":
        "\[Требуется ввести имя\]"
        jump namepl
    else:
        "Точно."
        jump next
        
label next:   
    player "Меня зовут [cpl]."
    return



lf2mr

тут я честно говоря плаваю, и вероятно есть более правильное решение, например через команду on
но там в интерфейсе по умолчанию все сложно, потому я обычно костылирую через timer

Код

screen myscreen:
    timer .01 action Function(myfunc)


Но возможно следует вообще пересмотреть логику функции и сделать ее более благоприятной для движка, тоесть чтобы оно не делало что-то гловально вне языка скринов
цитирую:
Цитата

Screens must not cause side effects that are visible from outside the screen. Ren'Py will run a screen multiple times, as it deems necessary. It runs a screen as part of the image prediction process, before the screen is first shown. As a result, if running a screen has side effects, those side effects may occur at unpredictable times.

Using Python generators in screens may cause unpredictable results. This traces back to an issue with the way the Python interpreter compiles Python source code that will be used in a screen context. Generators can be used in Python functions called from a screen, but not in the screen itself.

pirsus

#1234
Ребята, подскажите.

Надо вывести на экран текст одновременно в нескольких местах.


Код
show text "{size=50}[money]":
        xpos 1340
        ypos 175

Одиночная команда работает.

Но если я пытаюсь разместить несколько команд, то уже нет


Код
show text "{size=50}[money]":
        xpos 1340
        ypos 175
show text "{size=50}[gold]":
        xpos 1340
        ypos 225
Тут выводиться только первая часть.

Код

  show text "{size=50}[money]":
        xpos 1340
        ypos 175
pause 0.1
show text "{size=50}[gold]":
        xpos 1340
        ypos 225
А здесь только вторая.

А как прописать, чтобы отображались оба числа одновременно?

СОНЦЕ

#1235
pirsus,

Код

  show expression Text("{size=50}[money]"):
        xpos 1340
        ypos 175
    show expression Text("{size=50}[gold]"):
        xpos 1340
        ypos 225
Сообщение отредактировал СОНЦЕ - Вторник, 10/Авг/2021, 12:01

FreQl

#1236
Хочу подправить косячки мелкие в новелле, в которой есть 2 языка (английский и русский), но когда исправляю косяк в основном скрипте (который на русском), то когда перехожу на английский перевод, то там уже та исправленная строка на русском. Пытался в файле с англ переводом, в строке old изменить, но тоже безрезультатно...
Есть ли способ подправить косяк в обеих переводах, но при этом не ломать ничего?)

dmit

#1237
FreQl, если снова нажать "создать перевод", то изменённые строки просто допишутся в конец файла. Старые не удаляются, их можно удалить в ручную самостоятельно (или заменить на новые для эстетического удовольствия).
планета FOREVER!!!      Unkenbro team

pirsus

#1239
Цитата СОНЦЕ ()
Код  show expression Text("{size=50}[money]"):
        xpos 1340
        ypos 175
    show expression Text("{size=50}[gold]"):
        xpos 1340
        ypos 225
Всё работает!
Спасибо!

lf2mr

#1240
Всем привет.
Вот есть такая строка в renpy:
Код
text "%s" % outputDay xalign 0.02 yalign 0.97
Можно ли как-то в одной строке как в питоне поставить тут условие, что-то вроде
Код
text "%s" % outputDay if a == 1 xalign 0.02  yalign 0.97 else xalign 0.02  yalign 0.97
Или в renpy такие конструкции не приемлимы  вообще, и нужно сооружать конструкции из нескольких строк?
Само собой представленный код для примера не работает, но может его как-то по-другому надо писать.
Заранее спасибо всем откликнувшимся и нет.
Сообщение отредактировал lf2mr - Среда, 18/Авг/2021, 19:56

dmit

#1241
lf2mr, если это в экране, то можно:
Код
text "%s" % outputDay align If(a==1, (0.0, 1.0), (1.0, 0.0))
Сообщение отредактировал dmit - Среда, 18/Авг/2021, 21:20
планета FOREVER!!!      Unkenbro team

lf2mr

#1242
dmit, если про экран имеется в виду screens.rpy, то да, находится там, а в других местах бы не сработало?
Но что-то не выходит, выдаёт ошибку:
'if' is not a keyword argument or valid child for the text statement.

dmit

#1243
lf2mr, питон и соответственно ренпи - регистрозависимый язык, if не равно If.
экран это когда в нём
Код
screen xxx():
    text.....

а в каком он файле ренпи побоку.
планета FOREVER!!!      Unkenbro team

GrafOff

#1244
У меня проблема с imagemap
Вроде прописываю код правильно и в первый раз все срабатывает: нужно выбрать персонажа, после чего открывается экран с описанием этого персонажа, а вот дальше косяк. На новом экране, тоже imagemap есть две точки: назад, которая должна весте к предыдущему экрану и запуск, которая начинает новеллу за этого перса, но вместо того, чтобы реагировать на эти команды ренпи тупо запускает все следующие лейблы с остальными персонажами и только пролистав их все начинает новеллу, по факту ни за кого. То есть как я понимаю проблема в том, что прога почему-то выбирает все скрипты по очереди, а не реагирует на команды.
Прикрепления: 5526215.png (146.4 Kb)

lf2mr

#1245
dmit, огромное спасибо.
Только странно что перебрав столько всяких инструкций  и курсов из поисковиков в инете по тем же условиям в питоне нигде не встретил If с большой буквой, поэтому и здесь сразу не придал этому значения.
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Ren'Py (Вопрос\Ответ)
Поиск: