Объявление многокадровой анимации одной короткой командой

Если вам лениво прописывать каждый кадр при создании многокадровой анимации, то это можно делать с помощью одной короткой функции Ani, код которой вы найдете по ссылке ниже.
По умолчанию включено проигрывание анимации в обратную сторону. и можно задавать первую цифру. Т.е. если есть 5 кадров, начиная с img0 и заканчивая img4, то «image ani = Ani("img", 5, 1.0, start=0)» вернет зацикленную ежесекундную смену кадров 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4... и т.д. Отключается параметром reverse=False.
Кстати,  можно добавлять эффекты для смены кадров.
  Ссылка на архив с проектом


# автоматическое объявление анимации
init python:
    # эффект dissolve в полсекунды с учетом прозрачности
    diss = Dissolve(.5, alpha=True)

    """
    описание функции Ani:
    автоматическое объявление картинки с анимацией,
    например есть кадры "images/neko%s.png",
    где %s - числа от 1 до 5, тогда объявляем анимацию так:
    image neko = Ani("neko", 5, 0.5, reverse = False)
    где:
    img_name - имя файла без номера (например, "neko")
    frames - количество кадров
    delay - пауза между кадрами в секундах
    loop - зациклить анимацию (по умолчанию включено)
    reverse - нужно ли проигрывание анимации в обратную сторону
    effect - эффект для смены кадров
    start - с какой цифры начинать отсчет кадров
    ext - расширение, если оно отлично от Null, то работаем с файлами,
    а не с displayable (уже объявленными или даже измененными изображениями)
    так же можно добавлять любые стандартные для изображений параметры, типа масштабирования или прозрачности:
    image neko = Ani("neko", 5, 0.5, zoom=2.0, alpha=0.75)
    """
    def Ani(img_name, frames, delay=.1, loop=True, reverse=False, effect=diss, start=1, ext="png", **properties):
        if img_name:
            args = []
            # перебираем все кадры анимации
            for i in range(start, start + frames):
                if ext is None:
                    args.append(renpy.easy.displayable(img_name + str(i)))
                else:
                    args.append(renpy.display.im.image(img_name + str(i) + "." + ext))
                if reverse or loop or (i < start + frames - 1):
                    args.append(delay)
                    # добавляем эффект для смены кадров
                    args.append(effect)
            if reverse: # обратная анимация, если нужна
                for i in range(start + frames - 2, start, -1):
                    if ext is None:
                        args.append(renpy.easy.displayable(img_name + str(i)))
                    else:
                        args.append(renpy.display.im.image(img_name + str(i) + "." + ext))
                    if loop or (i > start + 1):
                        args.append(delay)
                        args.append(effect)
            return anim.TransitionAnimation(*args, **properties)
        return None

init:
    # 5 кадров, смена раз в полсекунды и эффектом для смены кадров
    # по умолчанию зациклена и с обратным ходом
    image neko = Ani("neko", 5, .5, True, True)

label start:
    scene expression "bg_room.jpg"
    show neko
    pause
    return

Комментарии

  1. как поставить анимацию на паузу?

    ОтветитьУдалить
    Ответы
    1. никак.
      но можно вывести вместо анимации нужный кадр, один, статичный.

      Удалить
  2. Полностью скопировал код. Не работает. Заменил только имя файла. Функция компилируется правильно, а вот при объявлении в init image neko = Ani("neko", 5, .5, effect=dd) выдаёт вот такое:
    I'm sorry, but an uncaught exception occurred.

    While running game code:
    File "game/script.rpy", line 38, in script
    image neko = Ani("male", 3, .5, effect=dd)
    File "game/script.rpy", line 38, in
    image neko = Ani("male", 3, .5, effect=dd)
    File "game/script.rpy", line 29, in Ani
    return anim.TransitionAnimation(*args, **properties)
    Exception: Not a displayable: 0.5

    -- Full Traceback ------------------------------------------------------------

    Full traceback:
    File "game/script.rpy", line 38, in script
    image neko = Ani("male", 3, .5, effect=dd)
    File "E:\Downloads\renpy-6.99.14-sdk\renpy\ast.py", line 942, in execute
    img = renpy.python.py_eval_bytecode(self.code.bytecode)
    File "E:\Downloads\renpy-6.99.14-sdk\renpy\python.py", line 1828, in py_eval_bytecode
    return eval(bytecode, globals, locals)
    File "game/script.rpy", line 38, in
    image neko = Ani("male", 3, .5, effect=dd)
    File "game/script.rpy", line 29, in Ani
    return anim.TransitionAnimation(*args, **properties)
    File "E:\Downloads\renpy-6.99.14-sdk\renpy\display\anim.py", line 424, in __init__
    images.append(renpy.easy.displayable(arg))
    File "E:\Downloads\renpy-6.99.14-sdk\renpy\easy.py", line 108, in displayable
    raise Exception("Not a displayable: %r" % (d,))
    Exception: Not a displayable: 0.5

    ОтветитьУдалить
    Ответы
    1. проблема с вашей стороны. я проверил свой код и на новом ренпае. по-прежнему всё работает.

      Удалить
  3. Не могу добавить эффект, хоть убей

    ОтветитьУдалить
  4. Отлично все работает, автору респект!

    ОтветитьУдалить

Отправить комментарий