Пользователи · Поиск по форуму · · Вход в аккаунт · Регистрация |
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Ren'Py (Вопрос\Ответ) |
Помощь по Ren'Py (Вопрос\Ответ) |
AxelK#646СОНЦЕ,
И это всё? Объявить после метки старт? Код 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
|
СОНЦЕ#649AxelK,
Как создать ATL переменной длины?Банальная задача - анимация глаз, но кадров может быть 3 или больше Код 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#650К сожалению у ATL нет (известных мне) адекватных инструментов для реализации данной задачи. Вот решение на реликте доATLовской эпохи. Спасибо за ответы. Я примерно этого и боялся. >> Мне кажется, если моргающих героев не 50 и они не процедурно генерируемые то лучше не выпендриваться, а ручками прописать каждую ресничку отдельно В том и дело, что они процедурно-генерируемые. Получается, способ не подходит? Я ведь не могу создавать image на лету, правильно? Остановился на 2 ATL вариантах всё таки: один для 2-кадровой, другой для 3. Если попадется больше, придется добавлять больше :D Итак, с массивами понятно, с анимацией понятно. Ещё вопрос, на который ответ, кажется, уже знаю. Анимация палитры это совсем не про рэнпай, да? Я не питаю надежд перекрашивать целиком displayable объект, но взять картинку и заменить несколько цветов, после чего подсунуть в renpy.show, конечно, было бы сказочно. |
СОНЦЕ#651Вообще-то можешь Код label start: image black = '#000' scene black 'foo' image white = '#aaa' scene white 'bar' return вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^. В общем -- главное поставить задачу, а метод внедрения какнибудь найдется кажется, то, что тебе нужно, называется im.MatrixColor функция которая работает с цветовой обработкой картинок. очень мудреная, но в ней есть пресеты, вчастности можно сдвинуть цвета по hue палитре. возможно это сойдет. |
AxelK#652вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^. В общем -- главное поставить задачу, а метод внедрения какнибудь найдется Хм, Так а мне не ко всем цветам надо операции делать, а к строго определенным. Например, "погасить" 2-3 цвета из палитры. |
СОНЦЕ#653палитра и состоит из 3х цветов - красный зеленый и синий. каждый из этих цветов можно "погасить" например если гасить синий, то синий стает черным, а фиолетовый - темно-красным. таким образом получается "органичное" выцветание. Если же нужно "гасить" определенную область рисунка, возможно стоит рисовать ее отдельным слоем, и проводить манипуляции отдельно |
AxelK#654палитра и состоит из 3х цветов - красный зеленый и синий. каждый из этих цветов можно "погасить" например если гасить синий, то синий стает черным, а фиолетовый - темно-красным. таким образом получается "органичное" выцветание.Если же нужно "гасить" определенную область рисунка, возможно стоит рисовать ее отдельным слоем, и проводить манипуляции отдельно И вот над ней операции и надо провести. Старая добрая палитровая анимация Понятно, что не напрямую, но если я знаю, что надо погасить строго цвет #112233 а остальные оставить как есть, то без подготовки предварительно альфа-маски для этого цвета задача довольно любопытная. |
AxelK#655вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^ Мне бы хотелось создать прокручивающийся текст, но если объявить его в начале, то он не подставляется в другой локализации. пытаюсь создать текст на лету через image (чтобы анимировать его перелет снизу-вверх) Код def my_text_scroll (time, font): renpy.image ('credits', Text('[__credits!t]', font=font) renpy.show('credits', at_list=[__scroll(time)]) Естественно ругается на объявление image вне блока init. Разве это можно обойти? |
СОНЦЕ#656AxelK,
Код transform __scroll(time): subpixel True xanchor 0.0 xpos 1.0 linear time xanchor 1.0 xpos 0.0 label main_menu: return label start: $__creditslt = 'Билл Гейтс, Тим Кук, Илон Муск' $time = 10 scene expression '#777' show expression Text(__creditslt) at __scroll(time) 'foo' 'bar' return Ну и да. Ничего про индексированные цвета в доках не припоминаю, потому таки да, это не про ренпай и вероятно там все крутится через ргб |
AxelK#657Ничего про индексированные цвета в доках не припоминаю, потому таки да, это не про ренпай и вероятно там все крутится через ргб > show expression Text Это действительно работает. Чтобы программно сделать то же прямо из моей готовой функции пришлось догадаться до renpy.show ('blah', ... , what = Text() ) А строку текста запихнул прямо сюда же в функцию. Спасибо :) |
AxelK#658Просто чтобы добить вопрос об операциях над палитрой.
Если цветов действительно мало (как в моём случае), то, заранее позаботившись об их полной уникальности, можно воспользоваться функцией im.Map(). (то есть если было два цвета #123, лучше сделать, например, #102132 и #112233) Чтоб не быть голословным, тестовый код, кому интересно Код python: renpy.scene() amap=im.ramp(0, 255) # default ramp for alpha channel __r, __g, __b = [0]*256, [0]*256, [0]*256 # all other channels are set to 0 # test palette with a single image PAL = { '____test': [(0,0,0),(137,103,69),(186,152,103),(239,220,152),(254,254,254)] } img_name = '____test' file_name = img_name + '.png' # setting up the initial palette __pal = PAL[img_name] for pixel in __pal: r, g, b = pixel __r[r],__g[g],__b [b]= r, g, b __img = im.Map(file_name, rmap=''.join(map(chr, __r)), gmap=''.join(map(chr, __g)), bmap=''.join(map(chr, __b)), amap=amap, force_alpha=False) renpy.show('_', at_list=[], layer='master', what=__img, zorder=1, tag='bg1', behind=[]) renpy.with_statement(None) # now fading to blue channel all colors except black and white (night simulation) r, g, b = __pal[1] __r,__g[g],__b = 1, 1, b r, g, b = __pal[2] __r,__g[g],__b = 2, 2, b r, g, b = __pal[3] __r,__g[g],__b = 3, 3, b __img = im.Map(file_name, rmap=''.join(map(chr, __r)), gmap=''.join(map(chr, __g)), bmap=''.join(map(chr, __b)), amap=amap, force_alpha=False) renpy.show('_', at_list=[], layer='master', what=__img, zorder=2, tag='bg2', behind=[]) renpy.with_statement(Dissolve(1.0))[/b][/r] Естественно, тут надо всё причёсывать, но меня интересовала сама возможность подобной операции. Впрочем, не уверен, что такую штуку можно таскать по всей игре. Обдумать надо. Прикрепления:
4856996.png
(1.8 Kb)
|
dmit#660Устаревшая функция, не рекомендуется для новых проектов. https://www.renpy.org/wiki....imation
планета FOREVER!!! Unkenbro team
|
| |||