« 企業が好む表現対策 Part2<吹出し>::Roundtrip Clip(JP) | Main | ケーススタディ[1] FLVの無限ループ(JP) »

企業が好む表現対策 Part3<磁石>::RM(JP)

磁石をflashで表現したがる人は多い。逃げ回る表現は企業は好きだ。吸い付く表現の次に好きである。マックOS風のメニューやナイキみたいのはさらに好きである。逃げ回る、吸い付く表現はUIとして使うと怒られる可能性があるが、キラキラ光るやキャストシャドーと同様、エフェクトとして利用すれば喜ばれることもある。もちろん企業は吹き出しも好きである。

逃げ回る表現
この表現をasで再現するにはムービークリップに速さを与えてマウスや他のオブジェクトの距離に比例するように速度に影響を与えて、向きを変えたり速さを変えたりすればよい。図のグラフのように距離が近ければ影響が大きければよいし、離れれば小さくなるようにすれば実現できそうだ。2つの距離が最も近いときにMaxForceが与えられる。

ベクトルで考える
物体を移動させるとき三角関数や平方根で距離や方向の計算をすることが必要となる。これはとても面倒なのでここではベクトルを使う。ベクトルは矢印だけで表現できる。まず紙面に図を描いて、足し算引き算とかけ算をするだけで最終的な物体の速度が割り出せる。あとでそれをコードにすればよい。flashにはもともとこの機能がないので、Vectorクラスを作成してある。このライブラリはダウンロードして自由に利用できる。

反発力
前述の通り四則演算だけで計算できる。ここではトラックしている赤い磁石はマウスで、マウスと黒い磁石が影響し合う関係にある。マウスの位置ベクトルと磁石の位置ベクトルを引き算して2つの物体間のベクトル(C)を計算する。このベクトルの長さは二点間の距離を表す。この距離から影響するフォースの大きさが求められる。グラフでわかるようにフォースが負になる可能性があるので、フォースが0より大きいときだけ磁石に影響を与えるようにする。フォースはベクトル(C)の向きを持つので、ベクトル(C)の単位ベクトルをフォースの長さ倍すればよい。

private function _execute():Void{
	var mouse:Vector = new Vector(_root._xmouse, _root._ymouse);
	for(var i in targetList){
		var magnet:Vector = new Vector(targetList[i]._x, targetList[i]._y);
		var magnetMinusMouse:Vector = Vector.minusVector(magnet, mouse);//ベクトル(C)
		var force:Number = -magnetMinusMouse.magnitude() / FieldStrength + MaxForce;
		if(force > 0){
			magnetMinusMouse.normalize();//単位ベクトル
			magnetMinusMouse._scale(force);//長さ倍
			dispatchEvent({type:"onForceDetected", data:{force:magnetMinusMouse, target:targetList[i]}});
		}
	}
}

黒い磁石
移動するムービークリップ(黒い磁石)に検出したフォースの影響を与えるには、算出したフォースをムービークリップの速度ベクトルに足し算するだけである。

public function addForce(v:Vector){
	this.v._add(v);
}

sourceも自由にダウンロードできる。

Post a comment