calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
<< September 2017 >>

categories

archives

Box2Dを簡単に扱えるようにするGravity2D

0
    以前作った、Box2Dを楽に扱えるようにする為の自作ライブラリ「Gravity2D」をSpark Projectで公開する事にしました。

    Gravity2Dの簡単な紹介デモを作ったのでご覧ください。
    デモ1(Gravity2D:メソッド基本編)
    デモ2(GravityObject2D:基本的なメソッドやプロパティ)
    デモ3(GravityObject2D:ジョイント系のメソッド。ジョイント、回転、回転角度制限)
    デモ4(GravityGroup2D:グループで一括設定)
    Gravity2Dのソースコードはこちら

    物理演算ライブラリBox2Dは、理解して使いこなすのにはそれなりに労力を要します。Gravity2Dを使えば、その手間がグッと楽になります。どのぐらい楽になるかというと、初めてBox2Dを勉強しながら試行錯誤して作ったゲーム「ぐらびっちょん」は、完成するのに一カ月位かかりましたが、Gravity2Dを使って作ったゲーム「JUMPER」は約2日で完成させています。(むりげーで出展したゲームです)

    Gravity2Dを使う利点は、プログラムが簡単に記述できる、という点だけではありません。Box2Dでは座標をコード上で指定しなくてはいけない為、物理演算という特性上、ちょっとでも複雑なレイアウトを考えたときに、何度も位置をずらしては実行、を繰り返しながら調整していかなくてはいけないのでとっても時間がかかるのです。ところがGravity2Dでは、静的(または動的)に配置したMovieClipの座標をそのまま物理座標として自動設定してくれるため、GUIで物理デザインができます。更に、各オブジェクト同士や背景への回転ジョイントも自動的に座標を設定してくれるメソッドも用意されている為、デザイン時の思考錯誤の時間が大幅に削減できます。もちろん、個別にコード上で座標を指定して設定する事もできます。

    国内のflashの物理演算ゲームは、海外に比べて少ない気がしますので、このライブラリを公開する事によって国産の物理ゲームが増えるといいなと思っております。

    いつか勉強会みたいのもやってみたいなあ〜と妄想したりしております。
    (希望者が集まれば、ですけど)

    コメント
    とても便利で、いまいろいろと試しています!
    ひとつ教えていただきたいのですが、mc1などのmovieclipをステージ上に置いているときはうまく動くのですが、ステージ外(y軸をマイナス方向)に持って行くと動かなくなります。これは仕様でしょうか。
    いま作ってるものが10個ぐらいmovieclipを上から落としてきたいので、10個一度に落ちるのではなく、じょじょに落としたいと思っています。
    • tk
    • 2010/08/24 5:11 PM
    >>tkさん
    評価頂きありがとうございますっ。

    申し訳ありませんが、この件でのバグがある事が分かり修正を施しましたので、最新版(v.1.0.1)を再度ダウンロードをお願いしますm(_ _)m

    以下回答になります---------------------

    Gravity2Dでは、生成時の引数で、物理計算をする画面座標のTop,Left,Width,Heightを指定できます。

    例などにあるように、
    var gv = Gravity2D();
    のように引数に何も指定しないと、
    var gv = Gravity2D(0, 0, 600, 400);
    と指定したとみなされます。これは左上座標(0,0)、幅600,高さ400の範囲で物理計算をする、という意味になります。(また自動的にその範囲に「壁、床、天井」が設定されます。画面の端でバウンドするのはこのためです。)

    なので例えば画面外(上)から物を降らせる場合は、
    var gv = Gravity2D(-200, 0, stage.stageWidth, stage.stageHeight + 200);
    とやれば、画面の上部200までの高さは物理計算させる事ができます。

    ただし、この範囲指定の数字は大きくし過ぎると、計算上の負荷が大きくなり重くなりますので、必要最小限の数値で設定することをお勧めします。


    • polig
    • 2010/08/25 9:57 AM
    バグ修正ありがとうございます!

    助かりました。

    サンプルのmain.asを

    var gv:Gravity2D = new Gravity2D(-400, 0, stage.stageWidth, stage.stageHeight + 400);

    としたところ、画面外から落としても物理計算してくれるようになりました。

    これはおもしろいですねー。

    • tk
    • 2010/08/25 4:57 PM
    Gravity2Dを見て、BOX2Dに挑戦してみたくなりました。見事丸と四角が動き出しました。しかし、すぐに
    つまづいてしまいました。
    初歩的な質問で申し訳ありませんが、
    go2.addPosition(5,0);
    は、どのように命令を出せば実行されるのでしょうか?
    • ken
    • 2010/09/20 8:49 PM
    >kenさん

    デモでは直接addPositionと書いてしまっていますが、実際はボタンやマウスなどの押下イベントにこの記述をします。

    例えば、マウスクリック時にaddPositionするには以下のように記述します。

    stage.addEventListener(MouseEvent.CLICK, eClick);

    ...

    public function eClick(e:MouseEvent):void
    {
    go2.addPosition(5,0);
    }


    この辺は、キーボードやマウスのイベント記述方法
    について調べると分かると思いますよ〜
    頑張ってください!
    • polig
    • 2010/09/21 10:41 AM
    素晴らしいライブラリですね><b
    早速色々試してまして、ぐりぐり動くムービークリップ
    に感動中です。ありがとうございます。

    作品が完成したら自分のサイトで
    公開出来ればと思っているのですが、
    ライブラリに利用規約などあれば
    お教え願えないでしょうかm(_ _)m
    • E.Honda
    • 2010/10/27 3:12 PM
    >E.Hondaさん

    評価いただき有難うございます。

    ライブラリの利用規約とかは特にありません。
    本家BOX2Dの方の利用規約に準じていただければ。

    できればご自分のサイトのどこかに「Gravity2Dを使って作りました」的な事を書いて頂けると幸いです
    (必須ではないです)
    • polig
    • 2010/10/27 11:16 PM
    早速のご回答に感謝ですm(_ _)m
    • E.Honda
    • 2010/10/28 12:37 PM
    非常に使いやすい素晴らしいライブラリを提供していただきありがとうございます。
    こんな時間まで夢中になってしまいました(笑)

    質問なのですがループ処理中に
    go1.addPosition(5,0);
    を記述すると移動したあとオブジェクトに重力が
    かかってない状態になってしまいます。

    Gravity2D_demo2.swfの11ページ目のキー入力の
    ように動かすにはどのようにすればよいのか
    もしよろしければご教授ください

    現段階の対策として私はこのように記述しています
    go1.setPosition(go1.x+5,go1.y);

    • MIZSI
    • 2011/04/03 3:14 AM
    MIZSIさん

    go1.addPosition(x, y)した後に再度物理演算を行う際にはgo1.wakeup()メソッドを実行します。
    デモでは、キーボード入力イベントでフラグを立てて、ENTER_FRAMEで以下の様な記述を行っています。
    (key_up,key_down,key_left,key_rightがキーが押されているかどうかのフラグです)

    var vecX:int = 0;
    var vecY:int = 0;

    if (key_up && go2.y >= 35) vecY = -5;
    if (key_down && go2.y <= 400 - 35) vecY = 5;
    if (key_left && go2.x >= 35) vecX = -5;
    if (key_right && go2.x <= 600 - 35) vecX = 5;

    if (vecX == 0 && vecY == 0) {
    go2.wakeup();
    } else {
    go2.addPosition(vecX, vecY);
    }

    • polig
    • 2011/04/05 8:44 AM
    返事がかなり遅くなってすみませんでした。
    早急にお答えいただいたのに、AS3をほとんど理解していなかったので、意味がわからなかったのですが、なんとかGravity2Dを楽しめるようになってきました。
    ありがとうございます。

    欲が出てきまして、物体同士が衝突した時に音をならしたり、効果をつけたいのですが、Gravity2Dで可能ですか。
    • ken
    • 2012/07/21 4:22 PM
    衝突の際に音を鳴らしたいと投稿したものです。getContactListを使うとできそうな感じですが、
    いろいろ試してはみたのですが、
    使い方がわかりません。
    お忙しいとは思いますが、よろしくお願いいたします。
    • kt
    • 2012/07/30 3:09 AM
    ktさん、getContactListはBox2Dの衝突判定の変数をそのまま利用しているものですが、これはあまり正確な値を返しません。なので、衝突音を出したい場合は、Gravity2D以外に別途自分自身でロジックを作った方がより正確に制御できます。

    例として、ボールが壁にバウンドしたタイミングで音を鳴らす場合ですが、EnterFrameイベントで、GravityObjectのb2から、ボールの進行方向をX方向,Y方向にそれぞれチェックし、逆に動いたらバウンドしたとみなして音を鳴らす、というようにします。また、移動速度によって音のボリュームを変化させるとよりリアルな感じになります。

    public var directX:Number = 0;
    public var directY:Number = 0;

    public function enter(e:Enter):void //EnterFrameイベント
    {
    var nowX:Number = go.b2.GetLinearVelocity().x; //goはGravityObject
    var nowY:Number = go.b2.GetLinearVelocity().y;
    var minimum:Number = 0.6; //音を鳴らす最小の速度
    var vol:Number = 0; //音のボリューム

    //前のフレームと逆方向に動いていたらボリュームを設定
    if (directX < minimum && minimum < nowX) { vol = (directX + nowX) * 0.6; }
    if (nowX < minimum && minimum < directX) { vol = (directX + nowX) * 0.6; }
    if (nowY < minimum && minimum < directY) { vol = (directY + nowY) * 0.8; }

    if (vol!=0) { //ボリュームが0じゃなかったら音を鳴らす
    if (vol<0) vol *= -1; //マイナス方向だった場合は、volをプラスにする
    if (vol > 2) vol = 2; //ボリュームの最大値制御
    //ここで音を鳴らす処理を入れる。volはボリューム
    }

    directX = nowX;
    directY = nowY;
    }

    • polig
    • 2012/07/30 9:23 AM
    すごく参考になりました。
    ありがとうございました。
    物体の方向の変化と衝突判定と
    音量を組み合わせてやってみようと思います。
    • kt
    • 2012/08/04 2:32 PM
    こちらで質問させてください。
    Box2D for Flash Gamesという洋書で物理アプリに取りくみ始めたのですが、gravity2Dの存在を知りぜひ使わせて頂きたいと思いました。

    こちらの書籍はサンプルは下記URLよりDLできます。
    http://www.packtpub.com/support/10576

    Box2D内のファイルが足りない問題は、自分で配置して解決しました。(○○が定義されていないなど)

    FLASH CS6の環境でビルドすると、アクセスできないプロパティ m_userDataへの参照でエラーが起きています。

    CS3でないと動作は難しいのでしょうか。
    • sugichan
    • 2013/05/01 8:04 PM
    Box2Dのバージョンが違ったようです。
    Box2DFlashAS3 v2.0.2 + CS6の環境で無事動作しました。

    ありがたく
    使わせていただきます。
    • sugichan
    • 2013/05/03 9:14 AM
    コメントする








       
    この記事のトラックバックURL
    トラックバック