縦スクロールシューティング09

移動量の計算

キー押しの検出は終わり次にイベントグループ「movement」に処理が移ります。「movement」でやっているのは移動量の計算です。
イベントエディタから見た「movement」のイベント一覧

イベントエディタから見た「movement」のイベント一覧

一番最初にXY移動量が0の時の処理が書かれていますが、これは楽チン。内部フラグ0を無効にしてるだけです。要するにこの後何も処理しなくて良いから高速ループ回すのやめましょうってことです。

イベントリストエディタで見たアクション一覧

イベントリストエディタで見たアクション一覧

次にX移動量が0、Y移動量の絶対値が1の場合の処理です。絶対値(Abs)を用いる理由は、移動量は-1の場合と+1の場合の二種類があるからです。どうせ後で方向を求めるなら最初からここで素直に上と下で条件判断を分けるのも良いのですが、サンプルなのであえてアプローチを少し変えて絶対値(absolute value)を使ってあります。

参考URL:絶対値(Wikipediaより)
参考URL:絶対値について

Wikipediaからの引用ですが、絶対値(Abs)というのは「その数が 0(あるいは基準値) からどれだけ離れているかを知ることができる」ってものです。対象となる実数の正負符号を外して評価します。例えばAbs(-1)とAbs(+1)の比較結果は等しい、となります。つまりこれはキーコントロール的にはカーソルキーの「上」か「下」か、プレイヤーはいずれかを押している、と同義です。

次に実際の移動量の計算ですが、変数(plane_speed)×変数(ymove:移動量)=変数(ymove)とします。今度は変数(ymove)をそのまま乗算してあるので変数(ymove)がマイナスの時はマイナスの移動量が求められるし、プラスのときはプラスとなります。条件判断の際には絶対値(Abs)で一つに処理をまとめてしまっても移動量の計算結果を求める際にはちゃんと別々の結果が得られるようになっています。具体的にはこの処理でスプライトは上か下に動くための移動量(計算結果)を得ます。

・・さて、これで縦移動は完了。次に横移動ですが、上と同じようなロジックなので割愛。そして縦横、ここまでやれば4方向移動の完了です。8方向移動はこれに「斜め移動」が考慮されれば良いだけ。つまり次の処理はX移動量、Y移動量の絶対値が両方共に「1」の場合の処理です。

斜め移動のSin(45)について

これは改造の際、オリジナルのサンプルがこうやっていたのでそのまんま使ってみました。考え方としては円を使って考える、そして三角関数Sinを用いる方法で、八方向=斜め=45度という前提(ちょっとおかしいが・・)だから成り立つもの。あとこれMMF2的には成り立つけど、普通はMath.sin(45*math.pi/180)が一般的・・・だと思います。角度からラジアンに変換する過程が要らないのがMMF2風味ってわけです。角度が固定なら三角比表から0.7071を用いても良いし、1/√2の近似値 0.707106とか、1.41421356で割った距離を求めるとか、さらに誤差を無視して大雑把で良いのならこんなアプローチもあるようです。

参考URL:三角比の表

以上、斜め移動の際の移動量を割り出すためのポイントだけを述べましたが、補正を入れてる以外は普通の縦横移動処理と斜め移動処理はなんら変わりがありません。そしてこれで8方向全部の移動量が計算できるようになったので、移動量を用いてスプライトのXY座標を決定するだけです。

実際のサンプルはその後で方向を求める処理もしてあるのですが、今回の主な目的は果たしたので方向を決定してる部分の説明を省きます。

MMF2のエクスプレッションエディタ

数式エディタってやつですが、Sin(45)やCos(45)の計算結果が「0.707106」となるように、MMF2的な方言みたいな表現が混じってる気がします。たとえばエディタに「Pi」と入力しても構文エラーとなり、じゃあ「Pi」ボタン押したらどうなるんだろと思ったら「3.141592654」と入力されます、まさしくそのまんま・・・

数式エディタに付属のボタンからも数式は入力できますがこれで全部ではなく、右側のボタン「オブジェクトからデータを抽出」を押して現れたウィンドウの左一番隅の「特別(Special)」から、ボタンでは選べない数式もいくつか選べるようになっています。


なんでいまさらというか、絶対値(abs)はここからじゃないと選べなかったことに気がついたので一応補足。さらにエクスポーターによってはここから選べる計算も選べないという制限が付く場合もあります(Javaモバイルで作っていたらAtan2が使えなかった)。こういう場合は、エクステンションの「Advanced Direction Object」を使うと楽ができます。「Advanced Direction Object」はJava全般、SWF、iOSなど各種エクスポーターで使えるという実績があるので、数式以外にも対応してるエクステンションで計算は楽できる可能性があることは覚えておくと良いかもしれません。