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

Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Ren'Py (Вопрос\Ответ)
Помощь по Ren'Py (Вопрос\Ответ)

Admin

#1
Сюда пользователи сайта могут писать вопросы о тех или иных функциях движка 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

Idealist

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

СОНЦЕ

#649
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

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

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

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

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

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

СОНЦЕ

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

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

Код

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

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

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

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

AxelK

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

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

СОНЦЕ

#653
Цитата AxelK ()
. Например, "погасить" 2-3 цвета из палитры.

палитра и состоит из 3х цветов - красный зеленый и синий. каждый из этих цветов можно "погасить" например если гасить синий, то синий стает черным, а фиолетовый - темно-красным. таким образом получается "органичное" выцветание.
Если же нужно "гасить" определенную область рисунка, возможно стоит рисовать ее отдельным слоем, и проводить манипуляции отдельно

AxelK

#654
Цитата СОНЦЕ ()
палитра и состоит из 3х цветов - красный зеленый и синий. каждый из этих цветов можно "погасить" например если гасить синий, то синий стает черным, а фиолетовый - темно-красным. таким образом получается "органичное" выцветание.Если же нужно "гасить" определенную область рисунка, возможно стоит рисовать ее отдельным слоем, и проводить манипуляции отдельно
Нет-нет, я не имею в виду тру колор. Есть, например, фон с индексированными цветами 4bpp и к нему, само собой палитра.
И вот над ней операции и надо провести. Старая добрая палитровая анимация
Понятно, что не напрямую, но если я знаю, что надо погасить строго цвет #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. Разве это можно обойти?

СОНЦЕ

#656
AxelK

Код

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 ()
например, фон с индексированными цветами 4bpp и к нему, само собой палитра.

Ничего про индексированные цвета в доках не припоминаю, потому таки да, это не про ренпай и вероятно там все крутится через ргб

AxelK

#657
Цитата СОНЦЕ ()
Ничего про индексированные цвета в доках не припоминаю, потому таки да, это не про ренпай и вероятно там все крутится через ргб
Так я и не прошу индексированные цвета. Просто заменить один конкретный rgba цвет на другой не менее конкретный

> 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)

Uxal

#659
Есть какая-нибудь документация на чудесную функцию  
Код
anim.TransitionAnimation()

? Весь интернет обшарил. Кое-где вижу примеры использования, но это не добавляет понимания.
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Ren'Py (Вопрос\Ответ)
Поиск: