Перейти к содержимому

Фотография

Визуальные новеллы своими руками.


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 1019

#961 Алекс__

Алекс__
  • Активные участники
  • PipPip
  • Интересующийся

  • Cообщений: 186
21
Хороший

Отправлено 30 Январь 2015 - 20:32

Файлы в этой папке создаются автоматически, перед созданием дистрибутива папку удаляйте.
(также удаляйте ее если вдруг при работе с imagemap'ами будут возникать всякие глюки и кракозябры)
  • 0

#962 Vielstern

Vielstern
  • Участники
  • Pip
  • Новичок

  • Cообщений: 20
0
Обычный

Отправлено 01 Февраль 2015 - 15:01

Привет. Такой вопрос — можно ли во время вызова диалогов (скрина say)
как-то блокировать присутствующие на экране imagebutton-ы? Т.е. если начинается
диалог, чтобы нельзя было ничего из активных объектов нажать в это время.

У меня пока только какие-то довольно-таки дикие решения крутятся в голове —
типа подвесить какую-то переменную, которая при on "show" диалогового окна будет
False, а при on "hide" — True. Ну и везде в кнопках в action прописать через If(), что
код выполняется только если переменная True. Но это же извращение то еще.
Может (да и наверняка) что-то более очевидное есть?
  • 0

#963 Vielstern

Vielstern
  • Участники
  • Pip
  • Новичок

  • Cообщений: 20
0
Обычный

Отправлено 01 Февраль 2015 - 21:39

Придумался еще вариант — засунуть практически прозрачный imagebutton c NullAction() в скрин Say размером до
самого диалогового окна... Но что-то это тоже, мягко говоря, не слишком изящное решение.
  • 0

#964 Алекс__

Алекс__
  • Активные участники
  • PipPip
  • Интересующийся

  • Cообщений: 186
21
Хороший

Отправлено 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
  • 0

#965 Vielstern

Vielstern
  • Участники
  • Pip
  • Новичок

  • Cообщений: 20
0
Обычный

Отправлено 02 Февраль 2015 - 10:25

Спасибо. Полезная функция. Хотя по сути, та же схема с If на каждом imagebutton, хоть и без лишних переменных...
Интересно, а можно как-то на action (через Function() или еще как-то) подвесить действие аналогичное клику во время диалогового окна?
Т.е. чтобы клик по некой imagebutton (которая будет прозрачной и растянутой на весь экран) обрабатывался как стандартный клик во
время присутствия скрина say?
  • 0

#966 Vielstern

Vielstern
  • Участники
  • Pip
  • Новичок

  • Cообщений: 20
0
Обычный

Отправлено 02 Февраль 2015 - 11:06

Ага, нашел на lemmasoft решение. Делаем скрин say modal True. И потом в нем же вешаем на весь экран прозрачную imagebutton с action такого вида: renpy.curry(renpy.restart_interaction). Тогда клик будет обрабатываться как надо, при этом все что под say нельзя будет нажать. Остался только один вопрос — как заставить space и ctrl работать с таким say как полагается?
  • 0

#967 Vielstern

Vielstern
  • Участники
  • Pip
  • Новичок

  • Cообщений: 20
0
Обычный

Отправлено 02 Февраль 2015 - 12:06

Так, если убрать modal True, то ctrl работает нормально (и say все перекрывает как надо). Осталось только space оживить. :)
ADD: Если добавить
key "K_SPACE" action renpy.curry(renpy.restart_interaction)
,то все работает как надо.

Сообщение отредактировал Vielstern: 02 Февраль 2015 - 12:14

  • 0

#968 Алекс__

Алекс__
  • Активные участники
  • PipPip
  • Интересующийся

  • Cообщений: 186
21
Хороший

Отправлено 02 Февраль 2015 - 23:21

Можете еще вместо
action renpy.curry(renpy.restart_interaction)
попробовать
action Return("smth")
http://www.renpy.org...control-actions
  • 0

#969 Vielstern

Vielstern
  • Участники
  • Pip
  • Новичок

  • Cообщений: 20
0
Обычный

Отправлено 03 Февраль 2015 - 14:13

Ага, спасибо. Так даже лучше (очевиднее, во всяком случае) :)
  • 0

#970 Weeaboo

Weeaboo
  • Активные участники
  • PipPip
  • Интересующийся

  • Cообщений: 142
21
Хороший

Отправлено 06 Март 2015 - 02:19

Недавно рассказывал одногруппнику в универе про визуальные новеллы и даже показывал кое-что на ноутбуке. Затронул тему Ren'Py, а он мне как и сказанёт: "А зачем париться с движками, если её точно так же можно сделать в Power Point?". И чем больше я об этом думаю, тем меньше мне эта мысль дает покоя.
  • 0

#971 Jabberwocker

Jabberwocker
  • Старожилы
  • PipPipPipPipPipPip
  • Джентльмен удачи

  • Cообщений: 2 792
215
Маленький пони

Отправлено 06 Март 2015 - 06:38

проблемы с последствиями принятых ранее решений.
если kinetic novel без ветвлений -- согласен, легко можно сделать как презентацию (только придумать, как запоминать "где остановился").
а если что-то посложнее, то не выйдет.
  • 0

#972 FearTheory

FearTheory
  • Участники
  • Pip
  • Новичок

  • Cообщений: 3
0
Обычный

Отправлено 04 Апрель 2015 - 12:09

Вопрос уважаемым новелло-делам.

Изображение
Смастерил вот такое окошко загрузки-сохранения. Но так и не нашел, как можно указать сохранению свое имя, допустим, номер или название текущей главы.
Единственный способ, который пришел в голову, это массив с количеством элементов, равным числу сохранений, и хранить названия в этом массиве, согласно номеру сохранения, и брать значение из него.

И еще вопрос. Почему-то при попытке закрыть игру (крестиком) в главном меню на экранах загрузки или настроек, происходит вот такое:
http://www.fabervisu...15/01/Выход.jpg

Нормально работает только экран титров, но он у меня вызывается через Show и прячется через Hide, соответственно в игре такой трюк не прокатит и для других окон метод вызова не годится, они вызываются именно как меню-окна.
  • 0

#973 FearTheory

FearTheory
  • Участники
  • Pip
  • Новичок

  • Cообщений: 3
0
Обычный

Отправлено 04 Апрель 2015 - 17:38

По вопросу с именами файлов сохранения разобрался, вот, может кому пригодится:

Свое имя для файла сохранения.

В RenPy для этого есть зарезервированная переменная save_name = "", значение которой записывается в файл сохранения и возвращается функцией:
FileSaveName(i)
просто меняем ее у себя в коде по мере надобности, например вот так:
$ place = p3 # указываем в переменной place текущее место
$ save_name = "Глава " + str(int(stage)) +". " + place # в stage хранится номер главы

пример того, что можно получить:

Изображение
  • 0

#974 Aleks842

Aleks842
  • Участники
  • Pip
  • Новичок

  • Cообщений: 1
0
Обычный

Отправлено 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.

Пожелания, комментарии приветствуются. Если нужны какие-то скрипты, а самим лениво возиться, то можете обращаться. Попробую реализовать.
Ссылка на скачивание
  • 0

#975 Khamelot

Khamelot
  • Участники
  • Pip
  • Новичок

  • Cообщений: 11
0
Обычный

Отправлено 12 Май 2015 - 20:07

Недавно рассказывал одногруппнику в универе про визуальные новеллы и даже показывал кое-что на ноутбуке. Затронул тему Ren'Py, а он мне как и сказанёт: "А зачем париться с движками, если её точно так же можно сделать в Power Point?". И чем больше я об этом думаю, тем меньше мне эта мысль дает покоя.


Вообще, можно.
Единственное значимое ограничение, на мой взгляд, требование установки офиса на комп игрока.
+ придется озаботиться о совместимости, аудио/видео кодеках и т.п. Ну т.е. если создавать чисто для себя, то без проблем. Даже, хочу заметить, эта мысль весьма любопытная. Но вот при желании своим творением поделиться проблемы, конечно, неизбежно возникнут.

Ренп, в этом отношении, автономнее.
  • 0

#976 Finsi35

Finsi35
  • Участники
  • Pip
  • Новичок

  • Cообщений: 1
0
Обычный

Отправлено 26 Май 2015 - 15:56

Привет всем! Возник такой вопрос:
Возможно ли сделать что-то вроде анкет действующих персонажей, но чтобы некоторые строчки, допустим, возраст, помечался знаком вопроса до тех пор, пока в самой игре не проскочит момент с подобным вопросом ("Сколько тебе лет?") и не будет дан ответ на него? Ну, или хотя бы какая-то альтернатива этой системе)
  • 0

#977 бестрыгун

бестрыгун
  • Участники
  • Pip
  • Новичок

  • Cообщений: 1
0
Обычный

Отправлено 06 Август 2015 - 11:24

помогите как мне написать код для того чтобы сценв по таймауту например 30 сек
  • 0

#978 Almasy

Almasy
  • Участники
  • Pip
  • Новичок

  • Cообщений: 1
0
Обычный

Отправлено 09 Август 2015 - 21:26

Люди, подскажите по поводу фонов: какого размера их делать, чтобы комфортно было играть на разных мониторах?
  • 0

#979 Алекс__

Алекс__
  • Активные участники
  • PipPip
  • Интересующийся

  • Cообщений: 186
21
Хороший

Отправлено 17 Август 2015 - 00:00

Фоны можете сделать любого размера (в файле options.rpy установите соответствующие значения config.window_width и config.window_height) - на любом мониторе в полноэкранном режиме Рен'Пи корректно нарисует ваш фон с сохранением пропорций.

Сообщение отредактировал Алекс__: 17 Август 2015 - 00:00

  • 0

#980 NikStory

NikStory
  • Участники
  • Pip
  • Новичок

  • Cообщений: 14
0
Обычный

Отправлено 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 гостей, 0 анонимных