Как во время игры поменять меню?
|
|
#1
Сейчас расскажу в чём идея: включаете игру там меню, интерфейс и всё такое... Играете в новеллу ничего не подозреваете. А потом делайте выбор и этот выбор меняет меню и интерфейс навсегда (не поможет перезагрузка (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/Июл/2021, 15:52
|
#2
NRFX, простые переменные не постоянные, поэтому "навсегда" у тебя не получится. Как вариант, можно попробовать работу с файлами, но я не знаю умеет ли то, что тебе нужно renpy.
Сообщение отредактировал Aleks-sempai - Пятница, 30/Июл/2021, 22:36
|
#3
Ну под словом "навсегда" можно понять такую логику: когда срабатывает скрипт "перехода" screens.rpy на screens2.rpy... --- К этим вопросам добавляется ещё один: Я знаю что можно файлы сценария (script.rpy) разделять как вздумается - программа воспринимает как один файл. И это распространяется и на технические файлы (gui.rpy, options.rpy, screens.rpy)? --- ...при повторном запуске игры пользователем, теперь игра должна обращается не к screens.rpy, а screens2.rpy. Я опять же не знаю как это реализовать?
|
#4
Да, все правильно.
Вводишь перманентную переменную.
init python: def persistent.zamena_menu = 0
Обрати внимание, что прописывать постоянную переменную надо в блоке ПИТОН, потому что она будет запускаться до блока INIT
И меню пишешь:
if zamena_menu == 3: твое меню elif zamena_menu == 2: твое меню elif zamena_menu == 1: твое меню else: твое начальное меню
Здесь соотвественно ты расставляешь меню задом наперед, от последнего к начальному.
|
#5
Цитата 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) хватит ли постого: чтобы игрок при нажатии продолжить игру (допустим, поиграв уже в сценарий, написаный в файле 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: твое начальное меню Хорошо. Напишу всё в одном файле - тоже можно.
|
#6
1. init pyton прописывается ДО init. Прописывается один раз. Дублирование создаст баги.
2. файлов rpy может быть сколько угодно, с любыми названиями (не только script). Программа будет их все читать одновременно. Поэтому перемещение jump "название твоего label" происхдит имеено по названию label:, а не по названию файла скрипта. Неважно, в каком файле находится нужный label игра его сама найдет.
|
|
#8
NRFX, во первых вроде как правильно python, а не pyton во вторых persistent объявляют так:Код define persistent.zamena = 0
то есть без инита
|
#9
Цитата FreQl (  ) во первых вроде как правильно python, а не pyton Ой, лоханулся. Спасибо.
Цитата FreQl (  ) во вторых persistent объявляют так:Код define persistent.zamena = 0 Игра включилась без ошибок, спасибо. Но... --- Итак... Я сделал всё как нужно (надеюсь), но не получилось. Вот как делал: В файле сценария:
 Я добавил перманентную переменную "define persistent.zamena = 0" т.к даже если правильно написать python при любом раскладе будет ошибка. И добавил "$ persistent.zamena = 1". Кстати всё ровно как написать: Код $ persistent.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" во все файлы, ничего не изменилось. Даже ошибок нет.
|
|
#11
Цитата 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()"?
|
#12
NRFX, как вариант, можно ведь поставить переменную, которая проверяется при отображении меню? А если не хочешь переустанавливать игру, то можно задействовать скрипт, работающий до появления главного меню и менять, что захочешь (хоть каждый раз случайное меню делать).
Не прошел все новеллы с Anivisual Jam #1. Будет отписывать комментарии к оставшимся (возможно никогда). Проснулся.
|
#13
Код
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
|
#14
Цитата СОНЦЕ (  ) Кодinit: default persistent.zamena = 1
screen main_menu_1(): tag menu style_prefix "main_menu" add gui.main_menu_background frame: pass... Уау... Заработало!!! Спасибо большое!!!
|