この記事のURL

http://www.dango-itimi.com/blog/archives/2011/001083.html


FLASH tips update Box2DFlash v2.1a 調査4 : 重力を無視して直進する物質

Box2D 上でプレイヤーに何か弾のようなものを撃たせたい場合に必要と思われる、「重力を無視して直進する物質」はどのようにすれば表現できるのかの調査を行ってみることに。

ネットで検索してみると以下のサイトに、重力を無視するにはどうすればよいかの説明がありました。(恐らくバージョンは Box2DFlash v2.0.2)

 Master of None
 http://d.hatena.ne.jp/o_healer/20080508

上記サイトでは、b2Math.MulFV というメソッドを用い、物質の質量と反対方向の重力数値を加工し、加工後取得可能な力を物質に加えているらしき事がわかります。

しかし v2.1a では b2Math クラスは無くなっており、v2.0.2 のリファレンスで b2Math.MulFV メソッドの項目を見てみるも何も説明がなく、MulFV メソッドによりどのような加工が行われるのかわからない状況です。

よって色々な方法を試し、なんとかそれっぽい動作になる形にしました。
重力を無視して物質を直進させるには以下の二行を毎フレーム呼び出す形となります。

body.SetLinearVelocity(new b2Vec2(x軸速度, y軸速度));
body.ApplyForce(new b2Vec2(0, body.GetMass() * -gravityY), body.GetPosition());

変数 body は直進させたい物質の b2Body クラスインスタンスとなります。
一行目 SetLinearVelocity は、今までの物質の速度を無視して、引数で指定した速度に強制的に変更します。二行目では重力を相殺しています。もっとスマートな方法はあるかもしれません。

物質を空中に留めたい場合は以下のように記述します。

body.SetLinearVelocity(new b2Vec2(0, 0));
body.ApplyForce(new b2Vec2(0, body.GetMass() * -gravityY), body.GetPosition());

今回作成したサンプルは以下のような記述を行い、弾が右方向に直進するようにしています。

body.SetLinearVelocity(new b2Vec2(10, 0));
body.ApplyForce(new b2Vec2(0, body.GetMass() * -gravityY), body.GetPosition());

サンプル swf は以下となります。スペースキーで弾が発射されます。(スペースキーを有効にするにはキーボード変換を半角英数モードにする必要があります)

 http://www.dango-itimi.com/blog/swf/142/preloader.swf


他参考にさせていただいたサイト

■ SetLinearVelocity 関連
http://www.haphands.com/sw_flash/tech/box2d/box2d_07.html

■ 衝突 する / しない のグループ分け関連
http://www40.atwiki.jp/spellbound/pages/647.html
http://hokori.net/2009/05/27/box2dflashas3_contact/

[ FLASH ] [ tips ] [ update ] 投稿者 siratama : 2011年08月07日 15:27

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/1043

コメント

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]