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

Помощь по Ren'Py (Вопрос\Ответ)

Admin

#1
Сюда пользователи сайта могут писать вопросы о тех или иных функциях движка Ren'Py, а мы попытаемся на них ответить:)

dmit

#631
не знаю почему не работает replace, но получить следующее утро 8:00 можно так:
Код
def next_morning(self):
        self.alter(days = 1, hours = 8 - self._dt.hour, minutes = - self._dt.minute)
Сообщение отредактировал dmit - Воскресенье, 12/Янв/2020, 16:07
планета FOREVER!!!      Unkenbro team

Mini-Me

#633
Здравствуйте.
Кто-нибудь может подсказать что нужно подправить:
сделал Android Build, при запуске на телефоне экран в котором отображаются диалоги сдвинут вверх (видимо чтобы было quick menu лучше видно), а также имя Character'а ушло немного левее и наезжает на его изображение в фоновой картинке.
Как всё это вернуть на то же место, что и в PC версии?

dmit

#634
В конце файла screehs есть секция ## Мобильные варианты. Изменяя её можно задавать параметры отличные от ПК. Смотри также variant в документации.
планета FOREVER!!!      Unkenbro team

UltraRED

#635
Цитата Alex_Apple ()
Создаешь персонажа без имени и добавляешь kind=nvl: Код
define narrator = Character(None, kind=nvl)

А дальше просто используешь этого персонажа на необходимом тексте.
Насчет всего остального.
Cделал как написано. Появилась проблема - теперь весь текст, где не указан персонаж выдаются в NVL.
Вопрос заключается в том, как сделать некоторые реплики, где указан персонаж в NVL, а другие(тоже, где не указан персонаж) в ADV?
Сообщение отредактировал UltraRED - Вторник, 14/Янв/2020, 13:56

AxelK

#637
Здравствуйте.
Однако, сразу к делу.
Испытываю острую потребность хранить данные в массивах (лист). Потенциально массивов несколько, и данные в них разного типа. Объекты такие объявить легко и просто, пользоваться ещё проще, но сохраняться силами ren'py они не хотят ни в какую.
По какой-то причине, нагуглить решение тоже не выходит. Питоном доселе не пользовался, если вопрос покажется глупым, просьба не пинать строго.

Прямо на официальной странице проекта рассказано, цитирую
Цитата
In this example:
Код
define a = 1
define o = object()

label start:
    $ b = 1     
    $ o.value = 42


only b will be saved. A will not be saved because it does not change once
the game begins. O is not saved because it does not change – the object it
refers to changes, but the variable itself does not.

Так работает и picke, и cPickle.
То есть, я могу объявить такого рода объект, прекрасно пользоваться им, но при загрузке сохраненной игры это всё будет утеряно.
В чем смысл вообще иметь данные, которые нельзя хранить?
Неужели нет изящного и давно запатентованного способа обойти такую несправедливость?
Или нужно как-то писать свой класс, который будет как-то перехватывать сохранение и сам себя сериализовывать или что-то в этом роде?

Можно, конечно хранить в глобальных переменных что-то вроде
A_1, A_15 = x, y
вместо
A[1], A[15] = x, y
да уж больно некрасиво...

Знатоки, подскажите, пожалуйста, в какую сторону копать.

СОНЦЕ

#638
AxelK
собственно, как и подметили в мануале, чтоб сохранилось, после лабела старт переменную надо пошелевлить
вот в примере как ниже...

Код


label start:
    python:
        A=[]
label main:
    python:
        A.append(renpy.random.randint(1,10))
    'your numbers can be saved. please save-load to check'
    '[A]'
    jump main
    return



...у меня все работает

AxelK

#639
СОНЦЕ,
И это всё? Объявить после метки старт?
Код
label start:
    $ A = [0xff] * 256
    jump game_start
.............

label chapter_x:
     $ A[0] = 1

Спасибо, вроде и правда работает. Двойной фэйспалм -_-
Почему же это в мануалах не вынесено жирными буквами где-нибудь в рамке?

Вопрос второй. Как создать ATL переменной длины?
Банальная задача - анимация глаз, но кадров может быть 3 или больше
Код
transform _position (x, y):
    xoffset 80+x
    yoffset 16+y

transform _eyes (w, h, t):
    crop (0, 0, w, h)
    pause t[0]
    crop (0, h, w, h)
    pause t[1]
    crop (0, h * 2, w, h)
    pause t[2]
    repeat

    _timings = [5.0, 0.1, 0.1]
    _at = [ _position (pos_x, pos_y)]
    _at.append(_eyes (frame_width, frame_height, _timings))
    renpy.show (filename, at_list=_at, layer='master', what=None, zorder=3, tag='eyes', behind=['background','character'])


Можно ли написать трансформацию для заранее неизвестного количества кадров? Или надо сделать трансформацию 1 кадра и в цикле запихивать её с нужными параметрами в _at лист?
Сообщение отредактировал AxelK - Пятница, 17/Янв/2020, 07:59

Idealist

#640
создал текстовую новеллу с одной картинкой в виде фона( делал в ренпае). Портировал на андроид. При запуске - error dlopen failed: cannot locate symbol "atof" referenced by "libpng16.so"... Походу картинка слишком большая?

СОНЦЕ

#642
AxelK
Цитата AxelK ()
Как создать ATL переменной длины?Банальная задача - анимация глаз, но кадров может быть 3 или больше
К сожалению у ATL нет (известных мне) адекватных инструментов для реализации данной задачи. Вот решение на реликте доATLовской эпохи.

Код

init python:
    def AnimVar(child,w,h,t,vertical = False):
        return Animation(*list(item for sublist in [(Crop((w*i*(not vertical),h*i*vertical,w,h),'grant2'),fx) for i,fx in enumerate(t)] for item in sublist))

image animated_image = AnimVar('animation_sheet.png',165,230,[.1,.1,.1,.1,.1,.1])
#это пример объявления анимации поставляемой горизонтальной полоской 6 кадров 165 на 230 пикселей каждый
#если полоска вертикальная выставить vertical = True

Видно что решение страшненькое, но другое вряд ли получится. Мне кажется, если моргающих героев не 50 и они не процедурно генерируемые то лучше не выпендриваться, а ручками прописать каждую ресничку отдельно

AxelK

#643
Цитата СОНЦЕ ()
К сожалению у ATL нет (известных мне) адекватных инструментов для реализации данной задачи. Вот решение на реликте доATLовской эпохи.

Спасибо за ответы. Я примерно этого и боялся.

>> Мне кажется, если моргающих героев не 50 и они не процедурно генерируемые
то лучше не выпендриваться, а ручками прописать каждую ресничку отдельно

В том и дело, что они процедурно-генерируемые. Получается, способ не подходит? Я ведь не могу создавать image на лету, правильно? Остановился на 2 ATL вариантах всё таки: один для 2-кадровой, другой для 3. Если попадется больше, придется добавлять больше :D

Итак, с массивами понятно, с анимацией понятно. Ещё вопрос, на который ответ, кажется, уже знаю.
Анимация палитры это совсем не про рэнпай, да?
Я не питаю надежд перекрашивать целиком displayable объект, но взять картинку и заменить несколько цветов, после чего подсунуть в renpy.show, конечно, было бы сказочно.

СОНЦЕ

#644
Цитата AxelK ()
Я ведь не могу создавать image на лету, правильно?

Вообще-то можешь

Код

label start:
    image black = '#000'
    scene black
    'foo'
    image white = '#aaa'
    scene white
    'bar'
    return

вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^. В общем -- главное поставить задачу, а метод внедрения какнибудь найдется

Цитата AxelK ()
Анимация палитры это совсем не про рэнпай, да?

кажется, то, что тебе нужно, называется im.MatrixColor
функция которая работает с цветовой обработкой картинок. очень мудреная, но в ней есть пресеты, вчастности можно сдвинуть цвета по hue палитре. возможно это сойдет.

AxelK

#645
Цитата СОНЦЕ ()
вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^. В общем -- главное поставить задачу, а метод внедрения какнибудь найдется
Я пробовал создавать сцены из animation() на лету. Ругалось, что надо картинки объявлять в init, а меня такое не устраивает. Попробую, конечно. еще раз.

Цитата СОНЦЕ ()
кажется, то, что тебе нужно, называется im.MatrixColor
Хм, Так а мне не ко всем цветам надо операции делать, а к строго определенным. Например, "погасить" 2-3 цвета из палитры.
Поиск: