Эффект встряски (Shake Effect)

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

Вы уже используете 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 Вернуться к началу статьи