• Страница 1 из 1
  • 1
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Как во время игры поменять меню? (... и остальной интерфейс)
Как во время игры поменять меню?

NRFX
Дата: Пятница, 30.07.2021, 16:47 | Сообщение # 1
Проверенный
Сообщений: 22
Награды: 0
Сейчас расскажу в чём идея:
включаете игру там меню, интерфейс и всё такое... Играете в новеллу ничего не подозреваете.
А потом делайте выбор и этот выбор меняет меню и интерфейс навсегда (не поможет перезагрузка (persistent)). И таких поворотов несколько.

Я хочу релизовать это с помощью 1 числовой переменной, который описан в файле script.rpy и который должен влиять на файл screens.rpy.
Переменная в файле script.rpy:

Код
define zamena_menu = 0
1) Как заставить файл screens "следить" за переменной, которая находится не в нём?
после возникнет следующий вопрос.
---
2) Такой код правелен? В файле screens.rpy:
Код
if zamena_menu = 0:

    [Стандартный код файла]

if zamena_menu = 1:

    jump screens2.rpy
(в screens2.rpy будет другой интерфейс и меню) Как правильнее?


Сообщение отредактировал NRFX - Пятница, 30.07.2021, 16:52


Aleks-sempai
Дата: Пятница, 30.07.2021, 23:28 | Сообщение # 2
Проверенный
Сообщений: 263
Награды: 3
NRFX, простые переменные не постоянные, поэтому "навсегда" у тебя не получится.
Как вариант, можно попробовать работу с файлами, но я не знаю умеет ли то, что тебе нужно renpy.


Сообщение отредактировал Aleks-sempai - Пятница, 30.07.2021, 23:36

NRFX
Дата: Суббота, 31.07.2021, 16:19 | Сообщение # 3
Проверенный
Сообщений: 22
Награды: 0
Ну под словом "навсегда" можно понять такую логику:
когда срабатывает скрипт "перехода" screens.rpy на screens2.rpy...
---
К этим вопросам добавляется ещё один: Я знаю что можно файлы сценария (script.rpy) разделять как вздумается - программа воспринимает как один файл. И это распространяется и на технические файлы (gui.rpy, options.rpy, screens.rpy)?
---
...при повторном запуске игры пользователем, теперь игра должна обращается не к screens.rpy, а screens2.rpy. Я опять же не знаю как это реализовать?

pirsus
Дата: Суббота, 31.07.2021, 17:19 | Сообщение # 4
Пользователь
Сообщений: 37
Награды: 0
Да, все правильно.

Вводишь перманентную переменную.

init python:
    def persistent.zamena_menu = 0

Обрати внимание, что прописывать постоянную переменную надо в блоке ПИТОН, потому что она будет запускаться до блока INIT

И меню пишешь:

if zamena_menu == 3:
    твое меню
elif zamena_menu == 2:
    твое меню
elif zamena_menu == 1:
    твое меню
else:
    твое начальное меню

Здесь соотвественно ты расставляешь меню задом наперед, от последнего к начальному.

NRFX
Дата: Суббота, 31.07.2021, 19:03 | Сообщение # 5
Проверенный
Сообщений: 22
Награды: 0
Цитата pirsus ()
Вводишь перманентную переменную.init python:
def persistent.zamena_menu = 0

Обрати внимание, что прописывать постоянную переменную надо в блоке ПИТОН, потому что она будет запускаться до блока INIT
1) Вводить init python в файл сценария (script.rpy) до обычного init (если он есть)?
2) А в файл screens.rpy вводить/"обозначить о существовании" не надо т.к. за такой переменной файлы будут следить автамотически? Если нет, то первый вопрос (в теме) остаётся в силе.
3)Если я решу сделать несколько файлов сценария (script.rpy, script_2game.rpy, и т.д) (будет удобно разделить сценарий на "разные игры") то:
3.1) хватит ли постого:

Код
jump script_2game.rpy
чтобы игрок при нажатии продолжить игру (допустим, поиграв уже в сценарий, написаный в файле script_2game, игрок не сохранился) начинал игру не в начале script.rpy, а в начале script_2game.rpy?
3.2) также в script_2game.rpy не надо заново прописывать (только с изменённым значением) переменную т.к. он будет также следить за ней автоматически? Если нет, то в script_2game надо написать:

Код
init python:    
def persistent.zamena_menu = 1
Или нет?
Цитата pirsus ()
И меню пишешь:if zamena_menu == 3:
твое меню
elif zamena_menu == 2:
твое меню
elif zamena_menu == 1:
твое меню
else:
твое начальное меню
Хорошо. Напишу всё в одном файле - тоже можно.

pirsus
Дата: Воскресенье, 01.08.2021, 09:29 | Сообщение # 6
Пользователь
Сообщений: 37
Награды: 0
1.  init pyton прописывается ДО init. Прописывается один раз. Дублирование создаст баги.

2. файлов rpy может быть сколько угодно, с любыми названиями (не только script). Программа будет их все читать одновременно.
Поэтому перемещение jump "название твоего  label" происхдит имеено по названию label:, а не по названию файла скрипта. Неважно, в каком файле находится нужный label игра его сама найдет.

NRFX
Дата: Воскресенье, 01.08.2021, 12:35 | Сообщение # 7
Проверенный
Сообщений: 22
Награды: 0
Цитата pirsus ()
init python:
    def persistent.zamena_menu = 0

Неожиданно, но RenPy не понимает:

Код
init pyton:

Понимает:

Код
$ init pyton:
И дальше, следственно идут такие ошибки:

нужно удалить пробелы.

вот тут хз.
Я в растерянности. Почему он не понимает?
Если что, то "init pyton" до "init" прописан
Прикрепления: 8551602.png(6.6 Kb) · 6773294.png(11.1 Kb) · 0151260.png(7.8 Kb) · 4293477.png(21.1 Kb)

FreQl
Дата: Воскресенье, 01.08.2021, 13:22 | Сообщение # 8
Друг сайта
Сообщений: 116
Награды: 11
NRFX, во первых вроде как правильно python, а не pyton
во вторых persistent объявляют так:
Код
define persistent.zamena = 0
то есть без инита

NRFX
Дата: Воскресенье, 01.08.2021, 20:53 | Сообщение # 9
Проверенный
Сообщений: 22
Награды: 0
Цитата FreQl ()
во первых вроде как правильно python, а не pyton
Ой, лоханулся. Спасибо.
Цитата FreQl ()
во вторых persistent объявляют так:Код
define persistent.zamena = 0
Игра включилась без ошибок, спасибо. Но...
---
Итак... Я сделал всё как нужно (надеюсь), но не получилось. Вот как делал:
В файле сценария:

Я добавил перманентную переменную "define persistent.zamena = 0" т.к даже если правильно написать python при любом раскладе будет ошибка. И добавил "$ persistent.zamena = 1".
Кстати всё ровно как написать:

Код
$ persistent.zamena = 1
или

Код
$ zamena = 1
Конкретно в моём примере это не влияет на неудавшийся результат.
По логике в этом примере должно произойти вот что:
Игрок нажимает нажимает на "начать игру" (и вот здесь у меня зародилось предположение, но я его скажу в "Итоге").
Игра говорит: Вы создали новую игру Ren'Py.
Перманентная переменная увеличивается на 1.
Игра выходит на уже заменённое меню.
Если всё правильно переходим к тому что измениться.
---
В этом примере должно измениться название игры и кнопки меню.
Цитата pirsus ()
if zamena_menu == 3: твое меню
elif zamena_menu == 2:
твое меню
elif zamena_menu == 1:
твое меню
else:
твое начальное меню

Здесь соотвественно ты расставляешь меню задом наперед, от последнего к начальному.

В файле options.rpy можно поменять название игры. Нахожу раздел "основное" и пишу так как в цитате:

Конкретно в моём примере всё ровно "elif" или "else" - это не влияет на неудавшийся результат.
То есть по логике:
когда игра выйдет в глав. меню, название игры в меню с "Название 1" поменяется на "Название 2".
Перейдём в файл screens.rpy.
Нахожу раздел "экран навигации" и меняю также (1):

Кстати я пробовал по другому (2):

Но тогда будут ошибки, подтверждающее моё предположение:

Так, вернёмся к (1).
В "else" находятся кнопки меню без изменений:

А в "if zamena == 1" находятся изменённые. В примере кнопки "сохранить", "загрузить", "Настройки", "об игре" и "помощь" должны исчезнуть:

То есть по логике (задумке):
когда игра выйдет в глав. меню, кнопки "сохранить", "загрузить", "Настройки", "об игре" и "помощь" должны исчезнуть.
---
Итак смотрим результат:...
---
Кстати когда я только начал писать это сообщение было всё нормально, но как только поменял в "экране навигации" С (1) на (2) (и также наоборот) выдаёт исключение в файле 00keymap.rpy:

нажимаешь "игнорировать" и выключаешь при повторном запуске вижу такой такой результат:

Если что я не менял последовательность: все кнопки внизу, а сокрощённое кол-во - вверху (и до этого отображалось правильно, а сейчас...) и откуда "помощь" взялась? её нет в верху.

Какой то бред...
Всё ровно такой же результат.
---
Новый результат:

нажимаем начать. Название игры "Название 1"

Дальше игра выбрасывает в главное меню и... Всё остаётся таким же...
Итог: Надеюсь я всё понятно разъяснил. Моё предположение:
перманентная переменная должна запускаться одновременно с меню, а не с игрой. Когда игра выходит в меню переменная выключается, хоть и навсегда сохраняет информацию. Поэтому, думаю, всё таки её надо прописывать не в сценарии а в файле с окнами. Хотя может и не так.
Что делать теперь?

Добавлено (04.08.2021, 15:16)
---------------------------------------------
Я продублировал "define persistent.zamena = 0" во все файлы, ничего не изменилось. Даже ошибок нет.

Прикрепления: 6597921.png(51.9 Kb) · 7963011.png(40.4 Kb) · 9342865.png(46.9 Kb) · 2283320.png(44.8 Kb) · 7961331.png(78.0 Kb) · 0619060.png(74.6 Kb) · 0780501.png(58.2 Kb) · 8045103.png(49.8 Kb) · 8521753.png(11.5 Kb) · 4569343.png(30.1 Kb)

FreQl
Дата: Среда, 04.08.2021, 15:38 | Сообщение # 10
Друг сайта
Сообщений: 116
Награды: 11
NRFX, в общем, думаю что менять переменные не получится...
Но вот инфа, которая может помочь
http://ru.renpypedia.shoutwiki.com/wiki....Styles)
https://lemmasoft.renai.us/forums/viewtopic.php?t=47012
Скорее всего это меняется через стили, но не уверен...


Сообщение отредактировал FreQl - Среда, 04.08.2021, 15:41

NRFX
Дата: Пятница, 06.08.2021, 13:12 | Сообщение # 11
Проверенный
Сообщений: 22
Награды: 0
Цитата FreQl ()
Скорее всего это меняется через стили, но не уверен...
Хм... Вполне.
-----
Я свой пример приблизил к реальным условиям, тем самым  упростил (Надеюсь не усугубил) задачу.
И так в файле сценария я сделал выбор:

Цитата
renpy.set_style_preference(preference, alternative)Устанавливает выбранную альтернативу для настройки стиля.
То есть у меня стиль "menu1" замениться на стиль "menu2". И...

Цитата
Предупреждение! Названные стили не сохраняются как часть игровых данных. Это означает, что
изменения в них не будут сохранены в течение цикла сохранения и
загрузки.
..."Навсегда". Грубо говоря до переустановки игры. (А если надо чтобы игрок захотел пройти заново, то в кнопке "начать" нужно вписать "$ renpy.set_style_preference(menu2, menu1)" чтобы игра реально началась заново?)

А в файле screens.rpy я меню сделал с помощью "imagemap" (у меня будут именно так сделанные меню):

Вот так выглядят меню в примере:


Надеюсь не зависеть  от "screen navigation" это упрощение, а не усугубление.
---
Теперь вопросы:
1) как "imagemap" запихнуть в стили (название "menu1" и "menu2")?
2) а потом эти стили запихнуть в renpy.register_style_preference? Точнее как будут выглядеть значения style, property, value?
Я вот читаю свои вопросы и понимаю, что стили и preference с alternative - это разные вещи.
Короче как правильно: 1)как "imagemap" запихнуть в настройки стиля?
2) для какого стиля будут эти настройки или как запихнуть в renpy.register_style_preference?
3) как эту бурду запихнуть в "screen main_menu()"?
Прикрепления: 9924022.png(31.7 Kb) · 7016001.png(68.0 Kb) · 6223121.png(13.9 Kb) · 8241991.png(32.2 Kb)

RobotZero
Дата: Пятница, 06.08.2021, 14:55 | Сообщение # 12
Друг сайта
Сообщений: 239
Награды: 12
NRFX, как вариант, можно ведь поставить переменную, которая проверяется при отображении меню? А если не хочешь переустанавливать игру, то можно задействовать скрипт, работающий до появления главного меню и менять, что захочешь (хоть каждый раз случайное меню делать).


Не прошел все новеллы с Anivisual Jam #1.
Будет отписывать комментарии к оставшимся (возможно никогда).
Проснулся.

СОНЦЕ
Дата: Пятница, 06.08.2021, 15:38 | Сообщение # 13
Разработчик
Сообщений: 312
Награды: 38
Код


init:
    default persistent.zamena = 1

screen main_menu_1():
    tag menu
    style_prefix "main_menu"
    add gui.main_menu_background
    frame:
        pass
    use navigation                
    text 'ОРИГИНАЛЬНОЕ МЕНЮ' align (.5,.5) size 40
    
screen main_menu_2():
    tag menu
    style_prefix "main_menu"
    add gui.main_menu_background
    frame:
        pass
    use navigation                
    text 'ЗАМЕНЕННОЕ МЕНЮ' align (.5,.5) size 40

screen main_menu_3():
    tag menu
    style_prefix "main_menu"
    add gui.main_menu_background
    frame:
        pass
    use navigation                
    text 'СОВСЕМ ЗАМЕНЕННОЕ МЕНЮ' align (.5,.5) size 40
  

screen main_menu:
    if persistent.zamena == 3:
        use main_menu_3
    elif persistent.zamena == 2:
        use main_menu_2
    else:
        use main_menu_1

init python:
    def zamena_switch(x):
        x+=1
        if x>3: x = 1
        return x

label start:
    'Превед'
    'Я злая игра'
    menu:
        'поменять интерфейс':
            $persistent.zamena = zamena_switch(persistent.zamena)
            'интерфейс изменен'
        'ниче не делать':
            pass
            
    'Ну и ладно'
    return
    


@son_tse, @lena_borodach, @lena_chunks

NRFX
Дата: Пятница, 06.08.2021, 18:51 | Сообщение # 14
Проверенный
Сообщений: 22
Награды: 0
Цитата СОНЦЕ ()
Кодinit:
default persistent.zamena = 1

screen main_menu_1():
tag menu
style_prefix "main_menu"
add gui.main_menu_background
frame:
pass...
Уау... Заработало!!! Спасибо большое!!!
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Как во время игры поменять меню? (... и остальной интерфейс)
  • Страница 1 из 1
  • 1
Поиск: