Пример дождя, грома и молний
Перейти к навигации
Перейти к поиску
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
- Ссылка на архив с проектом: test-lightning.zip
- Источник: Renpy для чайников: Пример дождя, грома и молний
На главную страницу | Книга рецептов Энциклопедии Ren'Py | Renpy для чайников | Вернуться к началу статьи |