Sprite link

一度に大量の画像の表示をサポートするために Ren'Py は sprite システムをサポートしています。このシステムは sprite を作成できるようにし、各 sprite は displayable を含みます。 sprite はスクリーン上にそれぞれの座標を持ち、 z-order を変更できます。

パフォーマンスを無視すれば、 sprite システムは概念的に Transform() をラッピングした Fixed() と同一です。 sprite は変換よりずっと速いですが、融通が利きません。 sprite の大きなパフォーマンスの改善は displayable が多くの sprite で使用されているとしても、各 displayable がフレーム毎に一回だけレンダリングされることです。制限としては sprite は変換が持つ多くのプロパティーのうち xoffset と yoffset しか変更できません。

sprite システムを使用するためには SpriteManager オブジェクトを作成し、create メソッドを呼び出して新しい sprite を作成してください。必要であれば、スクリーン上を移動するために各 sprite の xoffset, yoffset, zorder フィールドを更新してください。 updateevent 引数を SpriteManager に渡すことで、時間の経過に連れて、またユーザーの入力に反応して sprite を変化させられます。

Sprite クラス link

Sprite の例 link

SnowBlossom クラスはスクリーンに何かが落ちているのを表示する簡単な方法です。

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

この例ではどのように SpriteManager が複雑な動作作成のために使用されるかを表しています。この場合は 400 の粒子が表示され、それらがマウスを回避しています。

init python:
    import math

    def repulsor_update(st):

        # If we don't know where the mouse is, give up.
        if repulsor_pos is None:
            return .01

        px, py = repulsor_pos

        # For each sprite...
        for i in repulsor_sprites:

            # Compute the vector between it and the mouse.
            vx = i.x - px
            vy = i.y - py

            # Get the vector length, normalize the vector.
            vl = math.hypot(vx, vy)
            if vl >= 150:
                continue

            # Compute the distance to move.
            distance = 3.0 * (150 - vl) / 150

            # Move
            i.x += distance * vx / vl
            i.y += distance * vy / vl

            # Ensure we stay on the screen.
            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

    # On an event, record the mouse position.
    def repulsor_event(ev, x, y, st):
        store.repulsor_pos = (x, y)


label repulsor_demo:

    python:
        # Create a sprite manager.
        repulsor = SpriteManager(update=repulsor_update, event=repulsor_event)
        repulsor_sprites = [ ]
        repulsor_pos = None

        # Ensure we only have one smile displayable.
        smile = Image("smile.png")

        # Add 400 sprites.
        for i in range(400):
            repulsor_sprites.append(repulsor.create(smile))

        # Position the 400 sprites.
        for i in repulsor_sprites:
            i.x = renpy.random.randint(2, 798)
            i.y = renpy.random.randint(2, 598)

        del smile
        del i

    # Add the repulsor to the screen.
    show expression repulsor as repulsor

    "..."

    hide repulsor

    # Clean up.
    python:
        del repulsor
        del repulsor_sprites
        del repulsor_pos