Hatena::ブログ(Diary)

羊を運ぶ、私と兄

2009-02-27

Flash lite 1.1 で Math.atan2() に変数を使うと変な値が返ってくる

KONAMI LIFE 用に Flash lite 1.1 で作ってるゲームで Math.atan2 が妙な挙動をしました。


作っているゲームは、イメージ的には空中ブランコみたいな感じで、棒がある方向に手を伸ばしてつかむ、というものなんですが、

棒が左にある時だけ挙動が怪しくなりました。

よくよく調べてみたら Math.atan2( y, x ) の x に負の値が入っていると妙な値を返していました。

(Math.atan2 というのは、座標が原点から見てどの角度にあるかをラジアンで返すメソッドです。y と x の順番をうっかり間違える事が多々あります。)


例えばこんな感じ。

y = -3;
x = -36.6; 
Math.atan2( y, x) * 180 / Math.PI;// => 4.685899839502


同じ値を直接 Math.atan2 に渡すと

Math.atan2(-3,-36.6) * 180 / Math.PI;// => -175.314100160497

となって、こっちが正常。絶対値を合計すると180になるからなんか怪しい。自分のせいではなさげ。


で検索してみたところ、同じようなタイミングで同じような問題に遭遇している人を発見。

Math.atan2はFlash Lite 1.1では擬似的に再現してるらしい。というかMathオブジェクト全般がLite 1.1では疑似表現してるみたいです。といっても1.1ごときでMath.atan2使うような機会が無いような気もしなくはない。そんでMath.atan2の二つの引数に数値が入った変数を代入するとバグります(´・ω・) 

Flash Lite 1.1で気をつけること


なんじゃそら!!というバグ。直接値を渡すのと変数を使うのとで挙動が違うなんていうバグは今までの人生で初めての経験でした。

ユウさん、『いつか誰かがググってきた時に!!ってな』りましたよ!ありがとう!


という事で、第2引数が負の値のときにだけ例外的に処理をして、無事想定した通りの挙動になりました。


本件は、『_rotation を加算し続けるとムービークリップがだんだん小さくなる』バグと並ぶくらいの Flash lite 1.1 珍妙バグとして殿堂入りさせたいと思います。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/grkt/20090227/1235765565