Спрайты (Sprites)

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

Чтобы поддерживать отображение большого количества изображений одновременно, Ren'Py поддерживает систему спрайтов. Эта система позволяет создавать спрайты, где каждый спрайт содержит отображаемый объект. Затем спрайты могут изменить своё местоположение на экране и изменить вертикальный порядок следования объектов друг за другом.

Если игнорировать производительность, система спрайтов концептуально похожа на Fixed() класса-оболочки Transform(). Спрайты намного быстрее преобразований, но менее гибкие. Большим улучшением производительности спрайтов является то, что каждый объект Displayable отображается в кадре только один раз, даже если этот Displayable используется многими спрайтами. Ограничение заключается в том, что спрайты позволяют только изменять свои xoffset и yoffset, а не многие свойства, которые есть у класса Transform.

Чтобы использовать систему спрайтов, создайте объект SpriteManager, а затем вызовите метод create для создания новых частиц. При необходимости обновите поля xoffset, yoffset и zorder каждого спрайта, чтобы перемещать его по экрану. За счет постановки аргументов update и event объекта SpriteManager, вы можете изменять спрайты с течением времени и реагировать на вводимые пользователем данные.

Классы Sprite (Sprite Classes)[править | править код]

class Sprite
Представляет собой спрайт, управляемый SpriteManager. Он содержит поля, которые управляют размещением спрайта на экране. Спрайты не должны создаваться напрямую. Вместо этого они должны быть созданы путём вызова SpriteManager.create().
Поля объекта Sprite:
x, y
Координаты x и у верхнего левого угла спрайта относительно SpriteManager.
zorder
Целое число, используемое для управления порядком отображения этого спрайта относительно других спрайтов в SpriteManager. Чем больше число, тем ближе к зрителю спрайт.
events
Если принимает значение True, то события передаются дочернему элементу. Если принимает значение False, то по умолчанию дочерние элементы игнорируют события (и, следовательно, не тратят время на их обработку).
Методы объекта Sprite:
destroy(self)
Уничтожает этот спрайт, предотвращая его отображение и удаляя его из SpriteManager.
set_child(d)
Изменяет отображаемый объект, связанный с этим спрайтом, на d.


classSpriteManager(update=None, event=None, predict=None, ignore_time=False, **properties)
Этот отображаемый элемент управляет коллекцией спрайтов и отображает их с максимально возможной скоростью.
update
Если принимает значение не None, то является функцией, которая вызывается каждый раз при отображении спрайта этим диспетчером спрайтов. Вызывается с одним аргументом, а именно временем в секундах с момента первого отображения этого диспетчера спрайтов. Ожидается, что он будет возвращать количество секунд, пока функция не будет вызвана снова и SpriteManager вновь отображён.
event
Если принимает значение не None, то является функцией, которая вызывается при возникновении события. В качестве аргументов принимает:
  • Объект события pygame.
  • X-координата события.
  • Y-координата события.
  • Время, прошедшее с момента появления диспетчера спрайтов.
Если функция возвращает значение, не являющееся None, взаимодействие завершается и это значение возвращается.
predict
Если принимает значение не None, то является функцией, которая возвращает список отображаемых объектов. Эти отображаемые объекты прогнозируются, когда используется диспетчер спрайтов.
ignore_time
Если принимает значение True, то при отображении отображаемых объектов время игнорируется. Это следует использовать, когда диспетчер спрайтов используется с относительно небольшим пулом изображений и эти изображения не изменяются со временем. Это следует использовать только с небольшим количеством отображаемых объектов, поскольку в нём будут сохранены все отображаемые объекты, используемые в памяти в течение всего срока действия SpriteManager.
После однократной отрисовки (до вызова функции update), SpriteManager имеет следующие поля:
  • width – ширина в пикселях.
  • height – высота в пикселях.
SpriteManager имеет следующие методы:
create(d)
Создаёт новый Sprite для отображаемого d и добавляет его в этот SpriteManager.
redraw(delay=0)
Приводит этот SpriteManager к перерисовке (позволяет избежать мерцания изображения) в секундах, установленных в delay.


SnowBlossom(d, count=10, border=50, xspeed=(20, 50), yspeed=(100, 200), start=0, fast=False, horizontal=False)
Эффект SnowBlossom перемещает несколько экземпляров спрайта вверх, вниз, влево или вправо на экране. Когда спрайт покидает экран, он возвращается в начало.
d
Отображаемый объект, используемый для спрайтов.
border
Размер границы экрана. Спрайт отображается на экране, пока он не пересечёт границу, гарантируя, что спрайты внезапно не исчезнут.
xspeed, yspeed
Скорость перемещения спрайтов в горизонтальном и вертикальном направлениях, соответственно. Это может быть одно число или кортеж из двух чисел. Во втором случае каждой частице присваивается случайная скорость между двумя числами. Скорость может быть положительной или отрицательной, если второе число в кортеже больше первого.
start
Задержка в секундах перед добавлением каждой частицы. Это может привести к тому, что частицы появляются в верхней части экрана, хотя и не будут выглядеть как эффект «волны».
fast
Если принимает значение True, частицы появляются в центре экрана, а не только по краям.
horizontal
Если принимает значение True, частицы появятся с левой или правой стороны экрана, а не сверху или снизу.

Примеры использования классов Sprite на практике (Sprite Examples)[править | править код]

Класс SnowBlossom – простой способ размещения падающих объектов на экране.

image snow = SnowBlossom("snow.png", count=100)


И еще небольшой пример использования эффекта SnowBlossom от переводчиков:

# Объявление изображения c эффектом SnowBlossom с помощью оператор image.
image snowblossom = SnowBlossom("snow.png", count=10, border=200, xspeed=(20, 50), yspeed=(100, 200), start=0, fast=False, horizontal=False)

# Объявление изображения c эффектом SnowBlossom+анимация с помощью оператор image.
image snow = SnowBlossom(Animation("snow2.png", 0.15, "snow.png", 0.15))

# Игра начинается здесь.
label start:
    show snowblossom # Падающие частицы с эффектом SnowBlossom
    e "Вы создали новую игру Ren'Py."

    show snow # Анимированные частицы
    e "Добавьте сюжет, изображения и музыку и отправьте её в мир!"


В этом примере показано, как можно использовать SpriteManager для создания сложных форм поведения. В этом случае, он отображает 400 частиц заставляет их избегать курсора мыши.

init python:
    import math

    def repulsor_update(st):

        # Если мы не знаем, где находится курсор мыши, отступим.
        if repulsor_pos is None:
            return .01

        px, py = repulsor_pos

        # Для каждого спрайта...
        for i in repulsor_sprites:

            # ...Вычислить вектор между ним и курсором мыши.
            vx = i.x - px
            vy = i.y - py

            # ...Получить длину вектора, нормализовать вектор.
            vl = math.hypot(vx, vy)
            if vl >= 150:
                continue

            # ...Вычислить расстояние для перемещения.
            distance = 3.0 * (150 - vl) / 150

            # ...Переместить
            i.x += distance * vx / vl
            i.y += distance * vy / vl

            # ...Убедиться, что мы остаемся на экране.
            if i.x < 2:
                i.x = 2

            if i.x > repulsor.width - 2:
                i.x = repulsor.width - 2

            if i.y < 2:
                i.y = 2

            if i.y > repulsor.height - 2:
                i.y = repulsor.height - 2

        return .01

    # В event записать положение мыши.
    def repulsor_event(ev, x, y, st):
        store.repulsor_pos = (x, y)


label start:

    python:
        # Создать SpriteManager.
        repulsor = SpriteManager(update=repulsor_update, event=repulsor_event)
        repulsor_sprites = [ ]
        repulsor_pos = None

        # Убедиться, что у нас есть только изображение smile, которое можно отобразить.
        smile = Image("smile.png")

        # Добавить 400 спрайтов.
        for i in range(400):
            repulsor_sprites.append(repulsor.create(smile))

        # Расположить 400 спрайтов.
        for i in repulsor_sprites:
            i.x = renpy.random.randint(2, 798)
            i.y = renpy.random.randint(2, 598)

        del smile
        del i

    # Добавить repulsor на экран.
    show expression repulsor as repulsor

    "..."

    hide repulsor

    # Очистить.
    python:
        del repulsor
        del repulsor_sprites
        del repulsor_pos

Источник[править | править код]

Статья "Sprites" на английском языке.


На главную страницу Официальная документация движка Вернуться к началу статьи