OpenSiv3Dで連番画像からアニメーションを再生する。

RPGツクールで見られるアニメーション用連番画像。今回の記事ではOpenSiv3Dを使って連番画像を読み込み、再生してみます。

f:id:movementi:20180319161652j:plain

本記事で使用する連番画像素材は「藤宮翔流のひきだし」様のものを使用させていただきました。

game-hikidashi.com

環境

OpenSiv3D Ver0.2.3及びWindows10です。

Siv3D - Scrapbox

コード全文

実行結果

f:id:movementi:20180317215255g:plain

素材

f:id:movementi:20180317215256p:plain
そのまま再配布はまずいのでモザイク処理を施しています。

解説

コンストラクタ

 animeDraw(const Texture& texture, const int32& x, const int32& y) :
        _flagDraw(false)
    {
        assert(x >= 0 && y >= 0 && !texture.isEmpty());
               
        for (int32 ny = 0; ny < y; ny++) {
            for (int32 nx = 0; nx < x; nx++) {
                _anime.push_back(texture.uv(1.0 / x * nx, 1.0 / y * ny, 1.0 / x, 1.0 / y));
            }
        }
    }

コンストラクタの引数には「連番画像のTexture」、「X方向のコマ数」、「Y方向のコマ数」を渡してください。
for文を回して連番画像左上から画像を切り取りTextureRegion型の配列に入れていきます。
Texture::uv()はUV座標を指定してテクスチャの一部を切り抜く関数です。

詳しくはコチラ。 テクスチャを描く · Siv3D/Reference-JP Wiki · GitHub

再生開始

    void startDraw(const uint64& effecttime, const Point& pos) {
      //省略
    }

startDraw()を呼ぶと再生を開始します。引数には「アニメーションの再生時間(単位はミリ秒)」と「表示位置」を渡してください。

描画

startDraw()が呼ばれる可能性がある場面では毎フレームdraw()を読んでください。startDraw()が呼ばれていない時や再生が終わったときは早期リターンで何もしません。

さいごに

ちょっと弄ればリピート再生や逆再生なんかは簡単に実装できるので、必要が有る方は是非チャレンジしてみてください。

ツクール用アニメ素材はツクールシリーズ以外での利用を禁止しているものもありますので使用の際はくれぐれも利用規約をよく読んでからにしてくださいね。