アニメーションを行うには

◆PROCESSING 逆引きリファレンス

 カテゴリー:動画・アニメーション

アニメーションを行うには

【解説】

ゲームでは弾と敵が衝突した時や、イベントが発生した時(宝箱をGETした、ボスが出現したなど)にアニメーションを表示したい場合があります。

アニメーションの種類にもいろいろありますが、ここではパラパラ漫画風のアニメーションを表示することを考えてみます。

パラパラ漫画はご存知ですよね?。あらかじめ用意された少しづつ絵柄が異なる画像を高速で連続表示して、動いているように見せかけるテクニックです。

教科書の端に漫画を書いて、パラパラめくって遊んだ記憶がある方もみえるのではないでしょうか?。あれです(笑)。

これをPROCESSINGで実現する方法を考えてみましょう。

といっても難しいことはなく、PROCESSINGの描画処理関数(draw)が回るごとに、異なる絵をどんどんと表示させればOKです。

parapara(画像URL:illust-AC 様:ターシィ教授さん)

PROCESSINGの描画処理関数(draw)は、デフォルトで 1/60秒=約16.6ミリセカンド毎にグルグルと繰り返し実行されます。

このタイミングで、表示する絵柄(アニメーションの1フレーム)を切り替えて表示するのです。

処理の理屈は単純です。ちょっと工夫がいるとすれば、なるべく滑らかに表示を行う事でしょうか。

というのも描画処理関数(draw)は、かならず一定速度でループするわけではないからです。

描画処理関数(draw)の内部で重たい処理を実行すると(例えば、たくさんの画像を表示するなど)、呼び出されるタイミングに遅延が発生します。遅延が発生すると、本来期待した画像が表示できず、アニメーションがガタガタする事になります。

chien(画像URL:illust-AC 様:ターシィ教授さん)

遅延が発生しても(なるべく)スムーズに表示する方法はいくつか考えられます。

1つの方法として遅延が発生した「次の」描画処理で、前回描画できなかった画像をまとめて表示してしまう方法があります。

chien2(画像URL:illust-AC 様:ターシィ教授さん)

遅延が発生したか否かを知るには、前回の処理から今回の処理までの経過時間を測定すればOKです。前回の処理から今回の処理までの時間が、1フレーム(16ミリセカンド)よりも長ければ、処理が遅延したことになります。

chien3
今回は経過時間を測定するために、PROCESSINGがもつミリセカンド取得関数(millis)を利用してみたいと思います。

【構文】

int   mil   =   millis( ) ;

【パラメータ】

mil : PROCESSINGが実行開始されてからのミリセカンド

【注意】

int 値の範囲(+2147483647)を超えるミリセカンド=約596時間=24.8日は扱えません。まぁ、PROCESSINGのプログラムを連続で25日以上も動作させる人はいないとは思いますが・・・。

上記で紹介した工夫を行っても、あまりにも遅延が酷いとアニメーションの表示に違和感が出ます。

シューティングゲームでは遅延が発生すると、敵や弾の動きがガクガクする事になります。なめらかな動作をさせる為には、描画処理関数(draw)内部の処理は、なるべく早く処理完了するようにしないといけないですね。

【関連記事】


サンプルプログラム

アニメーション例:

※上記処理の一部に、kitao’s blog 様の記事を参考にさせて頂きました。ありがとうございます。

爆発画像(bomb.png)は縦横が80ピクセルの爆発シーンが、横に8個、縦に2個集まったものです。これを aniScene クラスのコンストラクタ内部で切り出しています。

(画像URL:HSP3オフィシャル2D素材 様)

anime クラスは、アニメーションさせたいシーンを管理する為のクラスです。animeクラス内部にある sceneList で、表示したいシーンの一覧を管理しています。

上記サンプルを実行すると、キーボードが押されるたびに画面に謎の爆発が発生します(笑)。

<出力サンプル>

bombeffect(画像URL:HSP3オフィシャル2D素材 様)

下記はサンプルプログラムをP5.jsで書き直したものです。

キーボードの押下ではなく、マウスクリックで表示するように変更してあります。また爆発アニメをランダムな位置に描くのではなく、マウス座標に描くようにしました。

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。