Sprite link

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

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

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

Sprite クラス link

class Sprite link

これは SpritesManager に管理される sprite を表しています。これはスクリーン上の sprite の位置を制御するフィールドを含んでいます。 Sprite は直接作成されるべきではありません。代わりに SpriteManager.create() の呼び出しで作成されるべきです。

sprite オブジェクトのフィールド

x, y

SpriteManager に対する sprite の左上角の x, y 座標です。

zorder

SpriteManager のその他の sprite に対するこの sprite の z-order を制御するために使われる整数です。数字が大きいほどその sprite はユーザーに近づきます。

events

True の場合 events は子に渡されます。既定値は False で、子は events を無視します (それ故それらの処理に時間をかけてはいけません)。

Sprite オブジェクトのメソッドは :

destroy() link

この sprite を廃棄し、これが表示されることを防ぎ、SpriteManager から除去します。

set_child(d) link

この sprite に関連づけられた Displayable を d に変更します。

class SpriteManager(update=None, event=None, predict=None, ignore_time=False, **properties) link

この displayable は sprite の集合を管理し、可能な限り最速のスピードでそれらを表示します。

update

None または SpriteManager に sprite がレンダリングされる度に呼び出される関数を指定します。これは1つの引数で呼び出され、それはこの SpriteManager が最初に表示されてからの秒数です。関数が再び呼び出され、 SpriteManager がもう一度レンダリングされるまでの秒数を返すことが期待されます。

event

None またはイベントが発生した時に呼び出される関数を指定します。引数として次を受け取ります。 : * pygame イベントオブジェクト、 * イベントの x 座標、 * イベントの y 座標 、* SpriteManager が最初に表示されてからの秒数。 None 以外の値を返すと処理は終了し、その値が返されます。

predict

None または displayable のリストを返す関数です。これらの displayable はSpriteManager が予想されたときに予想されます。

ignore_time

True の場合、 displayable のレンダリング時に時間は無視されます。これは SpriteManager が比較的小さな画像プールで使用され、それらの画像が時間の経過で変化しない時に使用すべきです。これは SpriteManager がある間、使用されているすべての displayable をメモリー上に保持するため、少数の displayable でのみ使用されるべきです。

一旦レンダリングされた後 ( update 関数が呼び出されるまで ) は SpriteManager は以下のフィールドを持ちます:

width, height

この SpriteManager のピクセル数での幅と高さ。

SpriteManager は以下のメソッドを持ちます:

create(d) link

displayable d で新しい sprite を作成し、この SpriteManager に追加します。

redraw(delay=0) link

この SpriteManager を delay 秒までに再描画させます。

SnowBlossom(d, count=10, border=50, xspeed=(20, 50), yspeed=(100, 200), start=0, fast=False, horizontal=False) link

花吹雪エフェクトは複数の sprite インスタンスをスクリーン上で上下左右に移動させます。sprite がスクリーンを出ると、それは最初に戻ります。

d

sprite に使われる displayable

border

スクリーンの境界のサイズ。sprite はそれが境界を越えるまではそのスクリーン上にいると考慮され、 sprite が唐突に消えないことを保証します。

xspeed, yspeed

それぞれ水平垂直方向の sprite の移動速度です。これらには1つの数字か2つの数字のタプルを使用できます。後者の場合、各粒子には2つの数字の間のランダムな速度が代入されます。速度はタプルの2つ目の数が1つ目よりも大きければ、正負どちらでも可能です。

start

各パーティクルが追加される前の秒数です。これによりパーティクル「 wave 」エフェクトとは違いスクリーンの一番上から出発出来るようになります。

fast

True の場合、粒子は端からだけでなくスクリーンの中心からも出発します。

horizontal

True の場合、粒子はスクリーンの上端や下端からではなく、左右の端から現れます。

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