Визуальные новеллы своими руками.
#961
Отправлено 30 Январь 2015 - 20:32
(также удаляйте ее если вдруг при работе с imagemap'ами будут возникать всякие глюки и кракозябры)
#962
Отправлено 01 Февраль 2015 - 15:01
как-то блокировать присутствующие на экране imagebutton-ы? Т.е. если начинается
диалог, чтобы нельзя было ничего из активных объектов нажать в это время.
У меня пока только какие-то довольно-таки дикие решения крутятся в голове —
типа подвесить какую-то переменную, которая при on "show" диалогового окна будет
False, а при on "hide" — True. Ну и везде в кнопках в action прописать через If(), что
код выполняется только если переменная True. Но это же извращение то еще.
Может (да и наверняка) что-то более очевидное есть?
#963
Отправлено 01 Февраль 2015 - 21:39
самого диалогового окна... Но что-то это тоже, мягко говоря, не слишком изящное решение.
#964
Отправлено 02 Февраль 2015 - 01:40
screen testbutton: textbutton "Test" action If(renpy.get_screen("say"), None, Hide("testbutton")) align (0.5, 0.05) # The game starts here. label start: show screen testbutton "Line 1" "Line 2" $ renpy.pause() "???" "Line 3"http://www.renpy.org...enpy.get_screen
#965
Отправлено 02 Февраль 2015 - 10:25
Интересно, а можно как-то на action (через Function() или еще как-то) подвесить действие аналогичное клику во время диалогового окна?
Т.е. чтобы клик по некой imagebutton (которая будет прозрачной и растянутой на весь экран) обрабатывался как стандартный клик во
время присутствия скрина say?
#966
Отправлено 02 Февраль 2015 - 11:06
#967
Отправлено 02 Февраль 2015 - 12:06
ADD: Если добавить
key "K_SPACE" action renpy.curry(renpy.restart_interaction),то все работает как надо.
Сообщение отредактировал Vielstern: 02 Февраль 2015 - 12:14
#968
Отправлено 02 Февраль 2015 - 23:21
action renpy.curry(renpy.restart_interaction)попробовать
action Return("smth")http://www.renpy.org...control-actions
#969
Отправлено 03 Февраль 2015 - 14:13
#970
Отправлено 06 Март 2015 - 02:19
#971
Отправлено 06 Март 2015 - 06:38
если kinetic novel без ветвлений -- согласен, легко можно сделать как презентацию (только придумать, как запоминать "где остановился").
а если что-то посложнее, то не выйдет.
#972
Отправлено 04 Апрель 2015 - 12:09
Смастерил вот такое окошко загрузки-сохранения. Но так и не нашел, как можно указать сохранению свое имя, допустим, номер или название текущей главы.
Единственный способ, который пришел в голову, это массив с количеством элементов, равным числу сохранений, и хранить названия в этом массиве, согласно номеру сохранения, и брать значение из него.
И еще вопрос. Почему-то при попытке закрыть игру (крестиком) в главном меню на экранах загрузки или настроек, происходит вот такое:
http://www.fabervisu...15/01/Выход.jpg
Нормально работает только экран титров, но он у меня вызывается через Show и прячется через Hide, соответственно в игре такой трюк не прокатит и для других окон метод вызова не годится, они вызываются именно как меню-окна.
#973
Отправлено 04 Апрель 2015 - 17:38
Свое имя для файла сохранения.
В RenPy для этого есть зарезервированная переменная save_name = "", значение которой записывается в файл сохранения и возвращается функцией:
FileSaveName(i)
просто меняем ее у себя в коде по мере надобности, например вот так:
$ place = p3 # указываем в переменной place текущее место
$ save_name = "Глава " + str(int(stage)) +". " + place # в stage хранится номер главы
пример того, что можно получить:
#974
Отправлено 14 Апрель 2015 - 14:03
Как я понимаю, для создания игры большинство используют стандартные текстовые редакторы, которые идут в комплекте с СДК. Но некоторых эти инструменты не устраивают, и они пытаются приспособить что-то другое. Вот и я решил внести свои пять копеек. Может быть кому и пригодится.
За основу взят текстовый редактор RJ TextEd. Почему именно он? Он умеет все то же, что и другие редакторы для программистов (напр., та же Editra) + немного больше. Некоторые его особенности:
- изначально приличное количество опций для работы с текстом (напр., удаление/дублирование строки, на которой находится курсор, или удаление/добавление отступа у всех выделенных строк, обрамление выделенного фрагмента разного вида кавычками и т.п.);
- удобный инструмент для ввода кода цвета (ставите курсор в нужное место, открываете инструмент, выбираете цвет и по закрытию окна код вставляется в нужное место);
- благодаря использованию FastScript есть возможность написания собственных скриптов на 4 языках программирования;
- если со скриптами разобраться сложно, то можно использовать макросы;
- весьма обширные возможности по настройке интерфейса программы (можно скрывать/отображать почти все панели, кнопки, а с помощью сриптов добавлять свои собственные кнопки, панели, меню, менять шрифт как программы, так и открываемых документов).
- проверка орфографии для английского и русского языков.
Теперь особенности сборки:
- полностью реализована подсветка языка RenPy (несколько десятков ключевых слов и около двух сотен различных Properties). Все они разбиты на 4 группы:
1 группа (Keywords) - наиболее часто встречающиеся ключевые слова (напр., label, scene, init, jump и т.п.);
2 группа (Effects) - отдельно выделил различные эффеты (fade, dissolve и т.п.)
3 группа (Properteis) - различные свойства (Properties)
4 группа (Operators) - различные служебные слова и операторы (with, continue, for и т.п.)
Для каждой группы в настройках можно назначить свой цвет, гарнитуру шрифта. - по CTRL-SPACE доступен список автодополнения (несколько десятков наиболее часто встречающихся названий меток, функций). В списке действует инкрементный фильтр.
- автозавершение классов. Попробуйте набрать "renpy." или "ui." и подождать полсекунды или набрать CTRL-SPACE. Появится весь доступный на данный момент (начало апреля 2015) список свойств и функций. В списке действует инкрементный фильтр.
- при вводе аргументов функции (когда вы ставите курсор между скобок) появляется всплывающая подсказка. Если она пропала, то вызвать её можно по CTRL+SHIFT+H.
- кроме этого, добавил автозавершение после "at/with+пробел";
- реализовал сворачивание кода по label, а также теперь можно отслеживать и быстро перемещаться по всем лейблам на вкладке "проводник кода".
- добавил несколько кнопок для удобной вставки тэгов (напр., курсив, жирный и т.п.). Просто выделите текст и нажмите на кнопку. Тэги автоматически вставятся.
- Удалил все лишние языки подсветки. Если они вам нужны, то скачайте с оф. сайта портативную версию и скопируйте из папки Syntax нужные файлы.
- Версия не требует установки.
- Оставлена только версия для Windows x32.
Пожелания, комментарии приветствуются. Если нужны какие-то скрипты, а самим лениво возиться, то можете обращаться. Попробую реализовать.
Ссылка на скачивание
#975
Отправлено 12 Май 2015 - 20:07
Недавно рассказывал одногруппнику в универе про визуальные новеллы и даже показывал кое-что на ноутбуке. Затронул тему Ren'Py, а он мне как и сказанёт: "А зачем париться с движками, если её точно так же можно сделать в Power Point?". И чем больше я об этом думаю, тем меньше мне эта мысль дает покоя.
Вообще, можно.
Единственное значимое ограничение, на мой взгляд, требование установки офиса на комп игрока.
+ придется озаботиться о совместимости, аудио/видео кодеках и т.п. Ну т.е. если создавать чисто для себя, то без проблем. Даже, хочу заметить, эта мысль весьма любопытная. Но вот при желании своим творением поделиться проблемы, конечно, неизбежно возникнут.
Ренп, в этом отношении, автономнее.
#976
Отправлено 26 Май 2015 - 15:56
Возможно ли сделать что-то вроде анкет действующих персонажей, но чтобы некоторые строчки, допустим, возраст, помечался знаком вопроса до тех пор, пока в самой игре не проскочит момент с подобным вопросом ("Сколько тебе лет?") и не будет дан ответ на него? Ну, или хотя бы какая-то альтернатива этой системе)
#977
Отправлено 06 Август 2015 - 11:24
#978
Отправлено 09 Август 2015 - 21:26
#979
Отправлено 17 Август 2015 - 00:00
Сообщение отредактировал Алекс__: 17 Август 2015 - 00:00
#980
Отправлено 29 Август 2015 - 03:43
У меня возник вопрос по классам в ренпае, основную суть проблемы я написал в комментариях, надеюсь я правильно смог изложить суть проблемы.
################################################################################################################## ## define events = EventHandler() ## Инициализация до метки старта ## ## $ events.create_event('introduction', dict(cond1 = False), 10) ## создание события ## ## $ events.activate_event('introduction', 'cond1') ## Устанавливает True ## ## $ events.deactivate_event('introduction', 'cond1') ## Устанавливает False ## ## $ events.set_event('introduction', 'cond1', (day)) ## Активирует, устанавливает, и прыгает если все True ## ## $ events.block_event('introduction') ## Блокирует событие от дальнейшего выполнения ## ## $ events.raise_events() ## Выводит в журнал информацию о событиях ## ## $ events.raise_event('introduction') ## Выводит информацию о заданном событии ## ################################################################################################################## ## ## Прыжок осуществляется мгновенно, без проверки переменной (day) ## скорей всего я ошибся в какой либо из функций, но сам понять не могу ## т.к. RenPy отличается синтаксисом от Python и функции пишутся по разному ## ## $ events.create_event('introduction', dict(cond1 = False), 10) == из этого события следует, что оно должно ## произойти по истечению десяти дней и переместить игрока к метке introduction. ## ## $ events.set_event('introduction', 'cond1', (day)) == это событие должно запустить предыдущее, но этого не ## происходит, а просто совершается прыжок, без учета значения переменой (day) ## ## Надеюсь я смог понятно изложить проблему... ## ################################################################################################################## init -10 python: Error = Exception ## Вызов журнала трассировки для просмотра информации о событии # Инициализация системы событий class Event(object): def __init__(self, name, conditions, day, label = None): ### day - сам добавил self.name = name self.conditions = conditions self.day = day ### Добавил по правилам, но почему-то не работает self.blocked = False if label == None: self.label = name else: self.label = label # Инициализация событий class EventHandler(object): global day ### Думал поможет для вызова переменной из скрипта, но нет def __init__(self): self.events = dict() # Создает событие def create_event(self, name, conditions, day, label = None): ### day - сам добавил if name in self.events.keys(): return self.events['%s'%name] = Event(name, conditions, day, label) # Устанавливает события True, а так же проверяет события # и повторяет попытку перехода к метке, если все условия True. def set_event(self, name, condition, day): ### day - сам добавил if name not in self.events.keys(): raise Error, "Событие %s не существует!"%name if condition not in self.events[name].conditions.keys(): raise Error, "Условие %s для события %s не существует!"%(condition, name) if self.events[name].blocked == True: return self.events[name].conditions[condition] = True # Если все условия установлены как True, то совершить прыжок. if all(v == True for v in self.events[name].conditions.itervalues()): if renpy.has_label(self.events[name].label): if (day) == day: ### Вот и проблема, неправильное чтение из скрипта(???но почему???) renpy.jump(self.events[name].label) else: raise Error, "Метка %s не существует! "%self.events[name].label # Устанавливает значение true, без использования прыжка. def activate_event(self, name, condition, day): if name not in self.events.keys(): raise Error, "Событие %s не существует!"%name if condition not in self.events[name].conditions.keys(): raise Error, "Условие %s для события %s не существует!"%(condition, name) self.events[name].conditions[condition] = True # Устанавливает значение False для данного события. def deactivate_event(self, name, condition, day): if name not in self.events.keys(): raise Error, "Событие %s не существует!"%name if condition not in self.events[name].conditions.keys(): raise Error, "Условие %s для события %s не существует!"%(condition, name) self.events[name].conditions[condition] = False # Блокирует событие, применяется вместо удаления # (событие никогда не будет делать прыжок). def block_event(self, name): if name not in self.events.keys(): raise Error, "Событие %s не существует!"%name self.events[name].blocked = True
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных