連番画像の表示を簡潔にする

Ren’PyにはMovie Displayableという、動画を画面全体に映すのでなく、他の画像と同様に扱える機能があります。アニメーションするのに便利なのですが、web版では現在対応していません。この用途には代わりに連番画像の使用をお勧めします。

連番画像といえばGIFですが、Ren’Pyでは対応予定がないため、次のようにするのが一般的です。

image animation sample:
    "画像名1"
    1/60 #画像名1を1/60 sec 表示する
    "画像名2"
    1/60
    .
    .
    .

この方法で連番画像を定義出来るのですが、短いアニメーションならともかく、ちょっと長くなると定義が大変かつ見づらいです。

以下のリンクで代わりに DynamicDisplayable を利用する方法を紹介していました。

https://lemmasoft.renai.us/forums/viewtopic.php?p=540520#p540520

init python:
    def animation(st, at, frames=[], interval=None):
        frame_count = len(frames)
    
        if interval is None:
            interval = 1 / float(frame_count)
    
        return frames[int((st // interval) % frame_count)], interval

    def predict_animation(st, at, frames=[], interval=None):
    
        return frames, interval
    
    def Animation(frames, interval=0.08):
        return DynamicDisplayable(animation, frames=frames, interval=interval, _predict_function=predict_animation)

240712 画像先読み用コードを追加しました

上記コードでAnimation関数を定義しています。実際の使用は以下のようにします。



image animated = Animation(
  frames=["stills/{}.png".format(i) for i in range(6)], interval=None # "stills/0.png" から "stills/5.png" までを使用したアニメーションの生成
)

ここではgame/stills/1.pngから5.pngまでをアニメーションに使用しています。画像の数を増やしたければ、rangeの部分の数値を変更してください。interval=Noneならすべての画像を1秒で表示します。24枚あれば、24fpsになります。全部表示したら最初からループします。interval引数に秒数を指定すれば、その秒数一枚の数画像が画面に表示され続けます。

動画を連番画像化する方法は検索すればでてくるのでそちらを参照してください。ちなみにpngよりjpegの方が負荷は軽いそうです。

240709 追記

DynamicDisplayableを使用したこの方法では画像の予測読み込みが恐らく出来ません。念のため、renpy.start_predict, renpy.stop_predictを使用して手動で画像をキャッシュした方がよいです。

https://ja.renpy.org/doc/html/displaying_images.html#renpy.start_predict

画像先読み用のコードを上記のコードに含めました。

Pocket