インデックス置き場はこちら
前回はこちら
●やだこの人……逃げても逃げてもついてくる……
『ひよこチャプター・すずか』略してひよキャプでは、自キャラのすずかちゃんをマウスカーソルで操作する。マウスカーソルを追尾させる訳だが、どうやって追尾すればいいのだろうか。
極めてシンプル且つ実用にはほど遠い方法として、こんなのがある。例えばまずはX軸に対して自分の座標と追尾したいモノの座標を比べ、小さければマイナス方向、大きければプラス方向に、対象物と並ぶまで移動させる。次いでY軸でも同じようにし、次はX軸、次は……と互い違いにやっていくと、一応じわじわと近寄る動きになる。敵の動きにはちょうど良さそうなアルゴリズムだ。
ただ、自キャラがそんな動きじゃ操作しづらい。やっぱり真っ直ぐ向かってきて欲しいものだ。
それを簡単に実現させてくれるのがMath.atan2()関数だ。通称あーたん二号。嘘です。俺もそんな呼び方したことない。
atan2は三角関数を利用した云々かんぬんと言う話はひとまず面倒なので置いておく。重要なのは、この関数は座標の位置を角度で教えてくれる関数と言うことだ。
yとxの二つの数字を渡して呼び出すと、(0,0)から見たその座標の方角をラジアン角で返してくる。ラジアン角は2πが360度に相当する角度だ。詳しくはググれ。FLASHの中では_rotationなんかは360度までのディグリー角なのに、こう言う時だけラジアンなのでややこしくなる。色々気を付けような。
都合のいいことに、_ymouseと_xmouseはそのスプライトから見たカーソルの位置になるのでとても使いやすい。二つのスプライトの位置関係を知りたい時は、相手のスプライトの位置から自分の位置を引いてやればいい。そうすれば、自分が中心の世界での位置関係を求められる。
なお、あーたんに渡す座標はなぜかyが先だ。ややこしいな。
r = Math.atan2(suzuka._ymouse,suzuka._xmouse);
これですずかちゃん視点でマウスカーソルがどの方向にあるのかは分かった。しかし、方向が分かったところでその方向に進ませる方法が分からないことにはまったくお話にもならない。
角度を求めるのに使ったMath.atan2()関数は三角関数を利用しているというのは先述の通り。ならば、角度を利用して座標の増分を求めるにも三角関数を使えばいいのではないか。それは小学生でも思いつきそうなことだ。いや、小学生は三角関数をまだ習ってないかも知れないな。
結論から述べてしまうと、X座標を求めるにはMath.cos()を、Y座標を求めるにはMath.sin()を使う。ラジアン角を渡してこれらの関数を呼び出すと、その角度にスプライトから見て1ピクセル分進むのに必要な座標増分値が得られる。あとは、単純にそれを座標に足してやればいい。
function trace_mouse(){
var r;
r = Math.atan2(suzuka._ymouse,suzuka._xmouse);
suzuka._x += Math.cos(r);
suzuka._y += Math.sin(r);
}
onEnterFrame = trace_mouse;
これで、すずかちゃんがカーソルを追いかけてくるスクリプトの完成だ。サンプルではSuzukaひよこだけど。
動きが何ともスローモーだが、それは1ドットずつしか動けないせい。もっと素早く動いて欲しければ、それぞれの増分に同じ数をかけてやればいい。

0