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
    コメントする








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