Пример дождя, грома и молний

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску
Pig.jpg

init python:
    # можно и со стандартной функцией Animation,
    # но просили с этой:
    def Ani(img_name, frames, delay=.1, loop=True, reverse=True, effect=None, start=1, ext="png", **properties):
        args = []
        for i in range(start, start + frames):
            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):
                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)
    # время появления/затухания звуков
    fade_time = 1.0
    # регистрируем каналы, чтобы звуки не прерывали друг друга
    channels = ["rain", "thunder1", "thunder2", "thunder3"]
    for i in channels:
        renpy.music.register_channel(i, "sfx", True)
    # воспроизводим звуки на своих каналах
    # либо на канале sound, если нужный канал не зарегистрирован
    def splay(name, channel=None, loop=False, fadein=fade_time, fadeout=fade_time):
        if not channel in channels:
            channel = None
        if channel is None:
            if name in channels:
                channel = name
            else:
                channel = "sound"
        fn = "sounds/" + name + ".ogg"
        renpy.music.play(fn, channel=channel, loop=loop, fadeout=fadeout, fadein=fadein)
    # постепенно останавливаем звуки или один звук, если на входе не список
    def sstop(channel=channels, fadeout=fade_time):
        if isinstance(channel, list):
            for i in channel:
                renpy.music.stop(i, fadeout=fadeout)
        else:
            renpy.music.stop(channel, fadeout=fadeout)
    # новое положение молний
    xa = renpy.random.random()
    def newxa():
        global xa
        xa = renpy.random.random()
        renpy.restart_interaction()
    # функция → action
    SPlay = renpy.curry(splay)
    SStop = renpy.curry(sstop)
    NewXA = renpy.curry(newxa)
    p = Character("Свинья", color="#ffcc77", window_left_padding=200, show_side_image=Image("pig.png", align=(0.0, 1.0)))

# экран для дождя и грома
screen Rain:
    # включаем и выклюяаем дождь вместе с экраном
    on 'show' action SPlay("rain", loop=True)
    # можно остановить только дождь SStop("rain"),
    # тогда начавшийся гром догремит и стихнет сам
    on 'hide' action SStop()
    # псевдо-рандомные раскаты
    timer 4.5 repeat True action SPlay("thunder1")
    timer 6.5 repeat True action SPlay("thunder2")
    timer 15.0 repeat True action SPlay("thunder3")
    # картинка с молниями
    timer .1 repeat True action NewXA()
    add "light":
        xalign xa
    # дождь
    add "rain":
        alpha .15

init:
    # пустая картинка
    image none = Null(1, 1)
    # анимация дождя
    image rain = Ani("rain", 5, .1, reverse=False)
    # анимация молнии
    image lightning = Ani("lightning", 3, .025)
    # мерцание молнии
    image light:
        yalign 0 yanchor 0
        # пусто
        "none"
        4.5
        xzoom 1.0
        "lightning"
        .1
        "none"
        .1
        "lightning"
        .1
        "none"
        1.5
        # зеркальное отражение
        xzoom -1.0
        "lightning"
        .1
        "none"
        .05
        "lightning"
        .1
        repeat
# игра начинается здесь
label start:
    scene bg with None
    show screen Rain
    with dissolve
    p "Кажется, дождь собирается..."
    pause
    hide screen Rain
    with dissolve
    p "Кажется, кончился."
    return

На главную страницу Книга рецептов Энциклопедии Ren'Py Renpy для чайников Вернуться к началу статьи