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

  • Страница 1 из 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Форум о визуальных новеллах » Записи участника » Ikuku [84]
Результаты поиска

Ikuku

#1 | Тема: Blade Quest [18+]


Blade Quest


Жанры: приключения, фэнтези, хентай
Авторы: ТГ "Красавица Икуку"

Описание:



Скриншоты:


Ссылки:
Игра в каталоге: http://anivisual.net/stuff/5-1-0-1133
Яндекс-диск: https://yadi.sk/d/kkj2Zt8e3H6qZf
Альтернативная ссылка на дропбокс: https://www.dropbox.com/s/fkyixndotoby7ub/BQR-all.zip?dl=0
Андроид-версия: https://vk.com/visual_android?w=wall-69564393_13130

* * *

Две недели прошло после официального релиза. И пока текстовик брошен в жерло нового проекта, мы тут подумали и решили, что вместе веселее. Поэтому только сегодня, только для вас- В общем, если кому-то захочется увидеть свое имя в титрах БК, то все, что для этого нужно - нарисовать и прислать нам арт, которого, на ваш взгляд, игре сильно не хватает (это может быть бэк, спрайт персонажа или целая иллюстрация к любой сюжетной сцене). Или здесь запостить, тоже можно. Наш строгий художник выберет понравившиеся ему арты, а кодер внедрит их в игру, увековечив вас в... хентайной визновелле. Ну, тоже неплохо!

Что от вас:
- арт (для бэков и сцен формат - 1920х1200 или больше, с сохранением пропорций);
- смирение перед неизбежностью: художник команды может захотеть внести незначительные правки (стилизовать, подкорректировать гамму/анатомию);
- поскольку БК распространяется бесплатно, вы соглашаетесь сделать картинку достоянием общественности на правах подарка вселенной и вклада в дело визуальных новелл.

Что от нас:
- восторг и благодарность;
- ваше имя в титрах (если только вы не попросите об анонимности) + ссылка на вашу группу/страничку на девиантарте/по желанию;
- ваш арт в финальной сборке игры и в галерее бонусов.

Ограничений по времени нет :)
Сообщение отредактировал Ikuku - Четверг, 04/Май/2017, 20:58

Ikuku

#2 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Если коротко, то да: любое отдельное изображение можно перекрасить с помощью im.MatrixColor (но только целиком).

Работает он примерно следующим образом: берет каждый пиксель изображения, и вместо текущего цвета/прозрачности ставит новый, в соответствии со вторым полученным параметром (matrix). Второй параметр может быть либо матрицей/кортежем (это для тех, кому не хватает дефолтных возможностей и кто хочет сделать все руками), либо объектом типа im.matrix (собственно, набор готовых "матриц", каждая из которых заранее сконструирована, чтобы десатурировать, менять цвет, и т.д.)

Если у нас второй параметр - матрица (физически записанная, как список из 20-25 чисел), то измененные цвета каждого пикселя считаются по формуле из документации (переменные от a до t берутся из списка, R, G, B и A - из параметров пикселей оригинальной картинки). Если второй параметр - один из готовых матричных объектов, то о формулах волноваться не надо.

Матричные объекты можно перемножать. Пример из документации: im.matrix.desaturate() * im.matrix.tint(0.9, 0.9, 1.0) читается как "сначала обесцветь, потом покрась (синим, т.к. в tint передан кортеж, обозначающий оттенок синего)"

Список встроенных матричных объектов (МО) (вкратце, из документации):

im.matrix.brightness(b) - МО для изменения яркости. Параметр b принимает значения от -1 до 1, чем меньше, тем темнее.

im.matrix.colorize(black_color, white_color) - МО для покраски "темных" и "светлых" пикселей. "Темные" красятся цветом black_color, светлые, соответственно, white_color. NB: не чисто черные и белые, а именно темные и светлые.

im.matrix.contrast© - МО для изменения контраста. Параметр c должен быть больше нуля, от 0 до 1.0 - понижение контраста картинки, больше 1.0 - увеличение.

im.matrix.desaturate() - МО для обесцвечивания. Краткая запись для im.matrix.saturation(0).

im.matrix.hue(h) - МО для изменения цветности. H - градус смещения цвета по цветовому кругу (круг). Т.е. если изначально цвет пикселя был желтый, и h = 45, то новый цвет станет темно-оранжевым.

im.matrix.identity() - МО для того, чтобы ничего с картинкой не делать. ¯\_(ツ)_/¯

im.matrix.invert() - МО для инвертирования цветовых каналов. "Негатив".

im.matrix.opacity(o) - МО для изменения альфа-канала (прозрачности). Параметр o принимает значения от 0 до 1.0, чем меньше, тем картинка прозрачнее.

im.matrix.saturation(level, desat = (0.2126, 0.7152, 0.0722)) - МО для изменения насыщенности. Параметр level (от 0 (черно-белый) до 1.0 (без изменений)) отвечает за цветность, параметр desat (в скобках приведены дефолтные значения) дополнительно корректирует RGB-уровни картинки для обесцвеченного изображения.

im.matrix.tint(r, g, b) - МО для изменения значений цветовых каналов. Параметры принимают значения от 0 до 1.0, измененный цвет считается в виде доли от оригинала. Т.е., скажем, если значение красного было 70 (из 255 возможных), а в r мы передали .1, новый красный будет равен 7.

Пара примеров того, как это использовать - ниже. Для наглядности создайте новый проект, киньте туда любую картинку и посмотрите, как это все выглядит.

Код
image bg test = "image.jpg"
image bg test0 = im.MatrixColor("image.jpg", [.5, .5, .5, .5, 0, .2, .2, .2, .2, 0, .3, .3, .3, .3, 0, .1, .1, .1, .1, 0])
image bg test1 = im.MatrixColor("image.jpg", im.matrix.colorize((255, 0, 0), "#00f"))
image bg test2 = im.MatrixColor("image.jpg", im.matrix.hue(45))
image bg test31 = im.MatrixColor("image.jpg", im.matrix.saturation(.5))
image bg test32 = im.MatrixColor("image.jpg", im.matrix.saturation(.5, desat=(0.1, 0.1, 0.722)))
image bg test4 = im.MatrixColor("image.jpg", im.matrix.tint(0.4, 0.4, 1.0))
    
label start:
    show bg test
    "Оригинальное изображение."
    
    show bg test0
    "Случайное изменение цветов с помощью матрицы в параметрах. \n\n \[.5, .5, .5, .5, 0,\n.2, .2, .2, .2, 0,\n.3, .3, .3, .3, 0,\n.1, .1, .1, .1, 0\]"
    
    show bg test1
    "Светлые цвета будут синими, темные - красными. Синий передан строкой (hex-код цвета), красный - кортежем. \n\n im.matrix.colorize((255,0,0), \"#00f\")"
    
    show bg test2
    "Цветность. Поворот цветового круга - 45 градусов. \n\n im.matrix.hue(45)"
    
    show bg test31
    "Обесцвечивание, desat задан по умолчанию. \n\n im.matrix.saturation(.5)"
        
    show bg test32
    "Обесцвечивание, desat задан вручную, со смещением в синюю сторону. \n\n im.matrix.saturation(.5, desat=(0.1, 0.1, 0.7))"
    
    show bg test4
    "Изменение оттенка: красный и зеленый каналы - в .4 от оригинального, синий - без изменений. \n\n im.matrix.tint(0.4, 0.4, 1.0)"


Плюс, изображение, которое возвращает im.MatrixColor(...), можно использовать как любую другую displayable, например, в операторе add в кастомном экране: add im.MatrixColor("image.jpg", im.matrix.hue(45))

P.S. с частично прозрачными png тоже работает.

Ikuku

#3 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
mrWebster, для того, чтобы выводить дисплэйаблы без объявления, есть хитрое ключевое слово expression. Вроде такого:
Код
show expression im.MatrixColor("lorraine.jpg", im.matrix.hue(45))

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

И спасибо, взаимно :)

Ikuku

#4 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
По поводу карты: если нужно настраивать внешний вид, то удобнее всего это сделать через screen language, т.е. как в примере выше - создать экран, накидать на него кнопки для перехода. Но тут есть одна хитрость: чтобы экран "карты" выводился не фоном, параллельно с диалогами, а обязательно требовал реакции пользователя, надо ему в свойствах прописать параметр modal True. Вот так:
Код
screen my_map:
    modal True

    frame:
  # кнопки
  textbutton "Школа" action [ Jump("school_label"), Hide("my_map") ]

label start:
    # диалоги до вывода карты

    show screen my_map

    # что-то еще

Т.е. когда нужный диалог заканчивается, и пришло время перемещаться по локациям, выводим модальный экран-карту, которая будет блокировать любые действия вне себя (в том числе и перемотку диалогов), пока не будет скрыта с экрана. А скрывать ее можно по нажатию кнопок-переходов в локацию (см. пример, в экшене два действия: переход на метку school_label и скрытие экрана).

Если кастомный вид карты не нужен, переход можно организовать с помощью стандартного меню выбора:
Код
label start:
    # диалоги до вывода карты

    menu:
  "Перейти в школу":
   jump school_label
  "Перейти на рынок":
   jump market_label

По второму вопросу... Тут есть несколько путей решения, зависит от того, зачем вообще делать паузу. Если пауза между репликами нужна только в нескольких местах, можно вбить их прямо в диалог:
Код
label start:
    window show # это нужно, чтобы во время пауз окно диалога не исчезало
    "Добро пожаловать в общество задумчивых героев!"
    pause 2.0
    "Мы задумываемся на две секунды перед тем, как ответить."
    pause 2.0
    "Если во время этой паузы юзер кликнет еще раз, то пауза закончится, и начнется следующая строка диалога."

Если пауза нужна везде, вообще везде, перед каждой репликой, можно переопределить оператор say. (Можно было бы попытаться добавить callback-функцию для каждого героя, но я не вижу обходного пути добавления туда команды паузы, чтобы не вылетало с ошибкой interaction inside an interaction.)

Кратко, код для переопределения оператора say:

Это кладете в файл 00saycds.rpy (например, имя не особо важно, важно, чтобы он был в списке выше, чем файлы с диалогами):
Код
python early:
    def parse_pausedsay(lex):
        who = lex.simple_expression()
        what = lex.rest()
        what = what[1:-1]
        return (who, what)

    def execute_pausedsay(o):
        who, what = o
        renpy.pause(2.0)
        renpy.say(eval(who), what)

    def lint_pausedsay(o):
        who, what = o
        try:
            eval(who)
        except:
            renpy.error("Character not defined: %s" % who)

        tte = renpy.check_text_tags(what)
        if tte:
            renpy.error(tte)

    renpy.register_statement("", parse=parse_pausedsay, execute=execute_pausedsay, lint=lint_pausedsay)

Использовать как обычно:
Код
label start:
    window show # это нужно, чтобы во время пауз окно диалога не исчезало
    char "Добро пожаловать в общество задумчивых героев!"
    char "Мы задумываемся на две секунды перед тем, как ответить."
    char "Если во время этой паузы юзер кликнет еще раз, то пауза закончится, и начнется следующая строка диалога."

Ikuku

#5 | Тема: Подскажите как в renpy сделать коректирующий слой -Sepia.
Не знаю, как там в БЛ, упоминания фильтров во вскрытых исходниках не вижу. Могу посоветовать полистать исходники той сборки, в которой эти фильтры вы точно видите, и по ключевым словам поиском пройтись, поискать, как они это реализовали.

В кач-ве альтернативы могу предложить следующий вариант (слегка топорный с точки зрения кода, правда, но по большей части автоматизированный):
Код
init -2 python:
    def filter_img(url):
        # завели матричный объект; пока что, если его применить к картинке, он только создаст идентичный дисплейабл
        im_custom = im.matrix.identity()
                
        # если параметр ч/б фильтра включен, доливаем к трансформациям уход в ч/б путем перемножения матричных объектов (того, что было и того, что обращает в ч/б)
        if is_blacknwhite:
            im_custom *= im.matrix.saturation(0)
            
        # если параметр фильтра "сепия" включен, аналогично:
        # (функция im.Sepia раскладывается на im.tint и im.saturation (с desat) с соответствующими ниже значениями, поскольку у нас все идет через im.MatrixColor, я беру как раз "разложенную" версию, а не сокращенную)
        if is_sepia:
            im_custom *= im.matrix.saturation(.5, desat=(0.2126, 0.7152, 0.0722)) * im.matrix.tint(1.0, .94, .76)

        # ну и еще уклон в голубой оттенок для примера
        if is_blue:
            im_custom *= im.matrix.tint(.8, .8, 1)
        
        # превратили урл картинки в дисплейабл с помощью получившегося в результате всех трансформаций матричного объекта, вернули его
        return im.MatrixColor(url, im_custom)

label start:
    $ is_blacknwhite = False
    $ is_sepia = False
    $ is_blue = False
    
    show expression filter_img("lorraine.jpg")
    "Картинка без изменений. Установим ч/б фильтр..."
    
    $ is_blacknwhite = True
    show expression filter_img("lorraine.jpg")
    "Черно-белое изображение. Уберем ч/б и поставим сепию..."
    
    $ is_blacknwhite = False
    $ is_sepia = True
    show expression filter_img("lorraine.jpg")
    "Сепия. поставим сепию и оттенок голубого одновременно..."
    
    $ is_blue = True
    show expression filter_img("lorraine.jpg")
    "А теперь отключим сепию..."
    
    $ is_sepia = False
    show expression filter_img("lorraine.jpg")
    "Примерно так оно и выглядит."

Суть в том, чтобы не писать для каждой картинки сто тысяч if-ов на каждый вывод, а при выводе картинки пропускать ее сквозь функцию-фильтр. Если переменные чекнуты, картинка (переданная параметром) трансформируется и возвращается в вывод уже по итогу всех трансформаций.
Вполне возможно, можно обойтись и без show expression, просто show, но навскидку я не могу назвать способ это сделать.

Вариант с единым корректирующим слоем не пойдет, к сожалению. Кроме этого, если элементы должны быть отдельны/подвижны, то каждому нужен свой корректирующий слой.

Ikuku

#6 | Тема: Подскажите как в renpy сделать коректирующий слой -Sepia.
Интересный вопрос, применение трансформации к слоям прошло мимо меня как-то, спасибо за наводку.
Но все равно не сработало.

Факты:
1. К слоям можно применять трансформации (at something): https://www.renpy.org/doc/html/displaying_images.html#show-statement
2. Внутри трансформации можно использовать те самые заветные манипуляторы: https://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=40667 (тут у юзера, кстати, сходная с вашей задача)

В теории из этого следует, что можно создать трансформацию с манипуляторами (im.Sepia), которую мы применим к слою, и все будет зашибись. Однако код:
Код
image img = "test.jpg"
image img2 = "test.jpg"

transform sepia(child):
    contains:
        im.MatrixColor(child, im.matrix.saturation(.5, desat=(0.2126, 0.7152, 0.0722)) * im.matrix.tint(1.0, .94, .76))
        
transform pos(xa):
    xalign xa
    
label start:
    show img at pos(.3)
    show img2 at pos(.6)
    show layer master at sepia
    
    "test"
    pause

роняет эксепшен "Expected an image, but got a general displayable." На одиночных картинках все работает, проверено (show img at sepia, я имею в виду). Дело как раз в том, что мы изначально пытались обойти - манипулятор принимает в качестве параметра только объект типа image (или image manipulator), а с другими типами дисплейаблов не работает. Т.е. применить манипулятор к объекту типа layer, который. в свою очередь, является набором дисплейаблов (даже если все дисплейаблы на нем будут только Image), не выходит. Как-то так, могу ошибаться, может, есть еще интересные способы автоматизировать процесс.

Ikuku

#7 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
stop_control, вы усложняете себе задачу.

> Упрощенно нужен пример скрипта выводящий в реальном координаты, например мыши или изображения.
Получение координат мыши и получение координат изображения - разные вещи. Если считаете, что именно это вам надо - копайте в сторону методов get_image_bounds и get_placement (https://www.renpy.org/doc/html/displaying_images.html#renpy.get_image_bounds) для изображений, и в сторону get_mouse_pos() для курсора (уже не актуально, ок)

Но если задача только в том, чтобы сделать неразрывное кольцо-фон, можно сделать проще.

Кольцевая панорама делится пополам, получаются два фрагмента фона, А и Б, которые должны следовать друг за другом. Заканчивается А, начинается Б, заканчивается Б, начинается А. Допустим, размер каждого фрагмента - 1000 пикселей в ширину, время прокрутки - 10 секунд.

Создаем ATL. На старте картинка А устанавливается в x = 0, картинка Б - в x = 1000 (там, где заканчивается А). Они синхроннно едут справа налево в течение десяти секунд. В конце десяти секунд картинка А перемещается на х = -1000, картинка Б приезжает в х = 0. Волевым решением ставим А в х = 1000, повторяем цикл. Волевым решением ставим Б в х = 1000, повторяем цикл. И так далее.
Код
transform move_bg_a:
    xalign 0 xpos 0
    
    linear 10 xpos -1000
    xpos 1000
    linear 10 xpos 0
    repeat
    
transform move_bg_b:
    xalign 0 xpos 1000
    
    linear 10 xpos 0
    linear 10 xpos -1000
    xpos 1000
    
    repeat

label start:
    show expression ("bg-a.jpg") at move_bg_a
    show expression ("bg-b.jpg") at move_bg_b
    pause

В теории, наверное, можно попробовать эти два трансформа объединить в один, запараметризовав его, но уверенности у меня в этом нет, структурно блоки все-таки разные, а с условными операторами внутри ATL мало было практики (напрямую их использовать нельзя, к сожалению)

Ikuku

#8 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
stop_control, не нужно принимать защитную стойку, я не ставлю себе целью вас отругать. Люди часто усложняют задачи, я, к сожалению, не исключение. И важная проблема кодеров (а раз уж вы взялись писать код, то вы кодер) как раз в том, что если "видишь конкретно", то ищешь не подход к решению задачи, а реализацию подхода внутри конкретного функционала, тогда как многое упрощается именно на этапе поиска подхода.

По поводу поворота кнопки: это тоже делается с помощью ATL, чистыми стилями это сделать нельзя. Можете повернуть кнопку целиком, можете повернуть только текст внутри кнопки, во втором случае текстовый объект "раздвинет" квадратную кнопку под свои новые границы.
Код
transform rotated:
    rotate -30

screen test_screen:
    frame:
        vbox:
            button:
                text "BUTTON!" at rotated
                
            textbutton "BUTTON!" at rotated

Ikuku

#9 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
stop_control, я скорее читер, чем гений, увы)) Мне во многом помогает багаж профильного образования)

Насчет документации - абсолютная правда. Больше всего пользы у меня получилось извлечь из официального форума (https://lemmasoft.renai.us) - там практически каждый вопрос, который я себе задаю, когда-то был задан в той или иной форме, а в процессе поисков ответа можно нацеплять уйму полезных бонусов. Там есть несколько очень добрых, подкованных в теме юзеров, которые разжевывают вопросы от и до. Но на английском, да, увы, не всем удобно.

Насчет экранов - я щас дописываю гайд по screen language, в ближайшее время постараюсь выложить. А пока пара нюансов: кусок кода с transform и screen - собственно, объявление экрана и ATLки, надо вынести изнутри метки, после чего вызвать этот экран уже внутри нее с помощью оператора show с ключевым словом screen. Тут как с переменными - вы где-то там этот экран объявили, а потом используете его там, где нужно.
Код
transform rotated:
    # text text

screen test_screen:
    # text text

label start:
    show screen test_screen
    # text text

Картинки можно создавать с помощью ATLок, и (если я не ошибаюсь) вызывать прямо внутри лэйблов, со скринами такой фокус не прокатит.

Ikuku

#10 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
stop_control, каждый дурацкий вопрос экономит время потомкам! Обсуждать вещи вслух более полезно, чем кажется на первый взгляд, тем более, тема для этого и существует)
В любом случае, лично меня в сетях нет, а аккаунт творческой группы контролирую не я, так что лучше в личку сюда, быстрее отвечу.

Ikuku

#11 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
> screen в свою очередь идут на Layer master если не указано иное.
Не совсем, все экраны по умолчанию выводятся на слое screens, а вот на master, верно, идут те дисплейабл-объекты, которые мы побросали голыми командами show. Т.е. show - master, show screen - screens.

Статичные картинки - это частный случай дисплейабл-объектов. Дисплейаблы бывают разные - конечные объекты, типа картинок и текста, контейнеры, типа frame, window, grid, динамические, на лету склеиваемые из других дисплейаблов. В общем случае на графику (в контексте размещения в окне) распространяются те же правила, что и на прочие дисплейаблы. Их можно:

- выводить в голом виде через оператор show (show expression как вариант) - тогда они падают просто на слой
- класть на экран и выводить вместе с экраном (оператор add)
- запихивать в другой дисплейабл-объект и выводить этот дисплейабл-объект, скажем, внутри экрана

Частные случаи: еще графику можно устанавливать фоном для других дисплейаблов. И еще да, в виде ATL (https://www.renpy.org/doc/html/atl.html#image-statement-with-atl-block), но технически это тот же самый голый image на слое.

Ikuku

#12 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Все верно, zorder - это глубина внутри слоя. Сами слои (master, screens...) не перемешиваются, они (и все, что внутри них) всегда лежат в том порядке, в котором их определили в конфиге. А вот уже порядок содержимого - что на чем лежит - определяется zorder'ом каждого элемента. Либо, если он не указан явно (т.е. по умолчанию = 0), "выше" будет тот элемент, который положили последним (с помощью show/call).

Причем тут еще интересная деталь: картинка, однажды вызванная через show, "запоминает", где лежит, и пока ее не спрячут hide'ом, все последующие show не изменят ее положения. к примеру (псевдокодом буду, уж извиняюсь):

- показать картинку А (А будет сверху)
- показать картинку Б (Б перекроет А, т.к. было вызвано после А)
- показать картинку А в другом "режиме" (как eileen happy из примера) (А останется под Б)
- скрыть А (А пропадет)
- показать А (А появится уже над Б)

Ну, и чем больше zorder, тем выше объект, да.

Ikuku

#13 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
stop_control, во-первых, небольшая поправка: то, что с renpy.что-то() - это питоновская эквивалентная запись, а то, что без - оператор renpy.

В чем разница? В синтаксисе записи. Плюс, питоновский код можно экранировать и вставить в label, а в обратную сторону это не работает. Больше, собственно, ни в чем, кроме внешнего вида.

Зачем нужны оба варианта? Ну, сначала были только renpy.show(), и выбора просто не было (на самом деле нет, основная часть операторов существовала сразу, но достаточно долгое время у некоторых функций аналогов просто не было (в истории скроллбаров много такого), и приходилось пользоваться питоновским кодом). Следующая причина - см. выше, оператор renpy не запихнешь внутрь питоновского кода. Как только станет необходимо выйти за пределы существующего функционала для своей игры, сразу влипаешь в питоновский код: написание небольших функций, user-defined displayables (да, можно создавать свои типы дисплейаблов), кастомные операторы… т.е само по себе существование двух вариантов записи не только оправдано, но и необходимо в условиях движка.

Почему люди смешивают в кучу то и другое? Это почти вечный вопрос создания хорошего кода в программировании. Кому-то проще, кому-то лень, кому-то не мешает. Какие-то вещи невозможно сделать операторами renpy, а питоновскими вставками делается в одну строку, и писать кастомный эквивалент не имеет большого смысла.

В БК, например, у нас были вот такие фрагменты:
Код
    show expression "images/bg-prologue-b1.jpg"
    $ renpy.transition(dissolve, layer = "master")

Для того, чтобы переход dissolve применялся только к одному слою - на котором лежит графика - и не затрагивал окно диалога. Вообще-то у renpy.transition есть оператор, выполняющий на первый взгляд нужное действие - with (чистый питон-аналог - это with_statement), но with не умеет работать с отдельными фрагментами экрана, он просто будет диссолвить изображение под диалоговой коробкой, а коробка будет исчезать, пока не завершилась анимация. А если сделать window show, чтобы коробка не исчезала, то будет исчезать реплика героя, при оставшейся на экране коробке. В общем, иногда приходится использовать смесь стилей.

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

Список операторов на русском… нет, вряд ли. Во-первых, они в любом случае будут разбиты по главам-темам. Небольшой нюанс: в ренпи почти все - операторы. Т.е. вот вы видите show, hide, jump - это оператор. А потом создаете свой экран, и screen - это тоже оператор. И frame: - оператор, и потом еще есть операторы for и if… в общем, очень разные по функциям и поведению операторы бывают, поэтому если составлять список, он будет а) гигантский, б) несистематизированный. А официальная документация дает список операторов, нужный для конкретной главы, в этой самой главе, и часть доков была когда-то переведена, емнип. Но в офдоках периодически плохо с примерами.

Ikuku

#14 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
GCStudio, вы уже на 99.13, или еще на двенадцатке? Попробуйте проверить, не мешает ли say-скрину что-то еще в настройках вашего проекта. Мной только что был взят свежесозданный, с нулевыми настройками, на 99.12 и 99.13 версиях, с ним произведены следующие действия:

1. По вашему методу quick_menu всунут в say с использованием use (при этом закомментирована строчка config.overlay_screens.append("quick_menu"))
2. В options.rpy строка define config.window = "auto" поменяна на define config.window = "hide" (для проверки функционирования связи say-quick_menu на pause)
3. В стартовый лейбл вписано следующее:
Код
label start:
    "Hello, I am screen."
    pause
    "Lalala."

    e "i am totally hiding something... "
    extend "like this text, for instance!"

    centered "And I am a centered text."

    "End test."

    return

В результате теста происходит следующее: во всех стандартных диалоговых строчках say и quick_menu дружат как положено. На pause экран say исчезает вместе с меню (об этом позаботился конфиг). На extend - say и меню стоят на месте, не дергаясь. На centered - экран say остается на экране, как и положено (и меню тоже), но вот window (и подложка вместе с ним!) исчезает, потому что так работает функционал centered (см. доки, "shown outside any window").
Т.е. технически, связка say и меню через use будет рабочим аналогом старого гуи, то, что вам нужно.

Из чего я могу предположить, что либо вы стали обладателем редкого бага (для 99.13), либо в коде что-то еще провоцирует мерцание (на каждой user interaction, скорее всего). Попробуйте запустить чистый проект, и проверить на нем.

Ikuku

#15 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
GCStudio, а, против этого попробуйте вместо with dissolve вот такую конструкцию: $ renpy.transition(dissolve, layer = "master")
Это, конечно, костыльное решение, но помогает - собсно, диссолвит только слой с картинками, а остальные не трогает.
Форум о визуальных новеллах » Записи участника » Ikuku [84]
  • Страница 1 из 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Поиск: