前回の第18回「2つのビットマップをパーティクルにしてアニメーションさせる」では、パーティクルにしてアニメーションさせるロゴを2つに増やした(第18回サンプル1「Away3D 15/03/13: Exploding two logos using particles」)。
今回は、画像をさらに2つ加えて、4つのロゴのパーティクルでアニメーションをつくりたい(図1)。アニメーションの動きもより細かく手直しする。そして、急遽補わなければならなくなったのは、2015年10月9日付でライブラリが改訂されたことだ。
2015年10月9日付ライブラリによる変更
例によって、2015年10月9日付ライブラリに改めると、これまでのコードが動かなくなる。今回のお題についていうと、クラスBitmapDataとMethodRendererPoolがあっさりとなくなった。とはいえ、幸いなことに修正すべき箇所は多くない。つぎのとおりだ。まず、DefaultRenderer()コンストラクタにMethodRendererPoolは渡さなくてよくなった。つぎに、Cast.bitmapData()がなくなり、とくに替わりのメソッドも使わない。LoaderEvent.assetsプロパティから取り出したオブジェクトがそのまま扱えるからだ。なお、得られるオブジェクトはBitmapDataに替わって、新たなBitmapImage2Dになる(変数名はbitmapDataのまま変えない)。
ロゴの縁を抜く
前回の結びにほのめかしていたアニメーションの気になるところを先に直そう。それは、2つのロゴが真ん中に重なったとき、うっすらと見える周りの縁だ(図2左)。コードにつぎのような手を加えて、Viewオブジェクトの背景色を白にするとはっきりわかる(図2右)。
元画像のPNGファイルは、縁がアルファで抜いてある(図3)。ところが、それらのピクセルについてもパーティクルをつくり、カラーに黒が与えられてしまったのだ。そこで、パーティクルの情報をつくる関数(setParticlesData())に、以下のようにアルファが抜けていないか確かめるif条件を加えた(アルファ値は0とせず、少し余裕をもたせた)。アルファが抜けていたらパーティクルの情報を変数(colorValuesとcolorPoints)に加えないので、パーティクルがつくられないことになる。
4つのビットマップからバーティクルをつくる
では、読み込むロゴの画像をあと2つ増やして、4つのビットマップからパーティクルをつくろう。加えるのはSafariとInternet Explorerのロゴで、awayjs-examplesの中のbin/assets/safari.pngとbin/assets/ie.pngだ(図4)。他の画像ファイルと同じassetsフォルダに納めておく。
画像ファイルのURLは配列の変数(assetsURLs)に入れていたので、エレメントを新たに2つ加える。ファイルを読み込んだときのリスナー関数(onResourceComplete())にもURLの判定をswitch文に加え、取り出したBitmapImage2Dオブジェクト(bitmapData)は配列の変数(bitmapDatas)に納めた。
そして、リスナー関数(onResourceComplete())は、すべてのBitmapImage2Dオブジェクトを取り出し終えたら、パーティクルのアニメーションをつくる処理(関数createParticles()とstartParticleAnimation()の呼出し)に移る。BitmapImage2Dオブジェクトが4つに増えたので、判定のための関数(allDataExists())を別に設けた。引数として渡した配列(array)にエレメントがすべて収められているかどうかを、for文により確かめてブール値で返す。そのために、BitmapImage2Dオブジェクトを納める配列(bitmapDatas)は、読み込むファイルの数(Array.lengthプロパティ)だけ長さを与えて初期化した。
あとは、パーティクルのアニメーションを初期化する関数(initColorParticle())で4つのロゴの行く先(endPoint)を、水平面(xz平面)の上で原点からそれぞれ一定値(size)移した。
4つのロゴの向きを変える
これで4つのロゴからつくられたパーティクルがそれぞれアニメーションする。ただもうひとつ気になるのが、ロゴがすべて同じ向きになっていることだ(図5)。ロゴの動く先は水平面で位置を動かしたたものの、垂直軸の角度はとくに変えていない。そこで、それぞれを異なった向きにしよう。パーティクルのアニメーションを開始する関数(startParticleAnimation())で、以下のように180度をロゴの数(numAnimators)で等分した角度、垂直軸(DisplayObject.rotationYプロパティ)で回すことにした[1]。
これで4つのロゴ画像からパーティクルがつくられ、それぞれ異なったアニメーションになる。JavaScriptは以下のコード1にまとめた。また、jsdo.itにサンプル1を掲げたので、動きがどうなったか確かめてほしい。次回はこの連載の最終回だ。アニメーションにもう少しだけ細かな手を加えて仕上げたい。