Эффект встряски (Shake Effect)
Перейти к навигации
Перейти к поиску
Вы уже используете vpunch по умолчанию и переходы hpunch, чтобы встряхнуть экран. Но как насчет трясти, которая происходит случайном порядке во всех направлениях, стиля Phoenix Wright?
init:
python:
import math
class Shaker(object):
anchors = {
'top' : 0.0,
'center' : 0.5,
'bottom' : 1.0,
'left' : 0.0,
'right' : 1.0,
}
def __init__(self, start, child, dist):
if start is None:
start = child.get_placement()
#
self.start = [ self.anchors.get(i, i) for i in start ] # центральная позиция
self.dist = dist # максимальное расстояние, в пикселях, от начальной точки
self.child = child
def __call__(self, t, sizes):
# Число с плавающей точкой в целое число... превращает числа с плавающей точкой
# в целые.
def fti(x, r):
if x is None:
x = 0
if isinstance(x, float):
return int(x * r)
else:
return x
xpos, ypos, xanchor, yanchor = [ fti(a, b) for a, b in zip(self.start, sizes) ]
xpos = xpos - xanchor
ypos = ypos - yanchor
nx = xpos + (1.0-t) * self.dist * (renpy.random.random()*2-1)
ny = ypos + (1.0-t) * self.dist * (renpy.random.random()*2-1)
return (int(nx), int(ny), 0, 0)
def _Shake(start, time, child=None, dist=100.0, **properties):
move = Shaker(start, child, dist=dist)
return renpy.display.layout.Motion(move,
time,
child,
add_sizes=True,
**properties)
Shake = renpy.curry(_Shake)
#
#
Теперь вы можете использовать встроенный код или создать несколько переходов:
init:
$ sshake = Shake((0, 0, 0, 0), 1.0, dist=15)
Синтаксис: Shake(положение, продолжительность, максимальное расстояние) с position, которое является кортежем с 4-мя значениями: x-position, y-position, xanchor, yanchor.
Примеры (Examples)[править | править код]
show phoenix think with dissolve
ph "Я думаю этой игре недостает немного... Точно! Какой-то..."
ph "Возражаю!" with sshake # трясется весь экран с заранее определенным 'sshake'
ph "Хех... А? Что это?! Это эхо!"
show phoenix at Shake((0.5, 1.0, 0.5, 1.0), 1.0, dist=5)
with None
# сотрясает спрайт, разместив его его по центру (где он уже был)
ph "Нг!..."
show phoenix at center, Shake(None, 1.0, dist=5)
with None
# абсолютно тоже самое, но показывает, как вы можете сперва задать определенное положение и
# указать значение None, как положение для Shake, позволяя ему взять 'center' в качестве положения тряски.
ph "Аргх! Хватит уже!"
ph "...... Все закончилось?"
with Shake((0, 0, 0, 0), 3.0, dist=30)
# серьезная тряска экрана в течение 3 секунд
# старайтесь не злоупотреблять высокими значениями 'dist', так как это может плохо сказаться на зрении.
Источник[править | править код]
Статья "Shake Effect" на английском языке
На главную страницу | Книга рецептов Энциклопедии Ren'Py | Книга рецептов Ren'Py | Вернуться к началу статьи |