Box2DFlashAS3をお試し

このエントリーをはてなブックマークに追加

こんばんわ。iyamaです。
今日はwonderflを使ってActionScriptで遊んでみようと思います。
久々にwonderflのアカウント引っ張り出してきたよ。

wonderflでサポートされている物理演算ライブラリのBox2DFlashAS3(2.0.2)を使ってみましょー。

お手本として以下のサイトを参考にさせてもらいました。
Box2DFlashAS3 の単純なサンプルと使い方 (2.0.2版)

そして作成したwonderflは以下からどうぞ。

Box2DFlashAS3 on 2011-11-5 – wonderfl build flash online

ソースは以下のとおり。
参考サイトを元にちょこちょこと私好みに書き換えてあります。
wonderflではBox2FlashAS3のライブラリが使えるので、
import Box2D.*とするだけで使えるのです。楽チン。




/**

 * Copyright aiyco ( http://wonderfl.net/user/aiyco )

 * MIT License ( http://www.opensource.org/licenses/mit-license.php )

 * Downloaded from: http://wonderfl.net/c/mX2o

 */



package {

    import Box2D.Dynamics.*;

    import Box2D.Collision.*;

    import Box2D.Collision.Shapes.*;

    import Box2D.Common.Math.*;

    import flash.events.Event;

    import flash.events.MouseEvent;

    import flash.display.Sprite;

    import flash.display.Stage;

    import flash.display.StageAlign;

    import flash.display.StageScaleMode;

    import flash.text.TextField;

    

    [SWF(backgroundColor="#ffffcc", width="350", height="200")]

    public class FlashTest extends Sprite {

        // 重力

        private const SCALE:Number = 8;

        private var world:b2World;

        

        private var tf:TextField;

        private var animation:Boolean = false;

        private var count:int = 0;

        

        // 世界

        private var worldAABB:b2AABB;

        private var gravity:b2Vec2;

        private var wallBdDef:b2BodyDef;

        private var wallBd:b2Body;

        private var wallShapeDef:b2PolygonDef;

        private var debugDraw:b2DebugDraw;

        

        // Object

        private var objBdDef:b2BodyDef;

        private var objBd:b2Body;

        private var shapeDef:b2PolygonDef;

        

        public function FlashTest() {

            // write as3 code here..

            stage.scaleMode = StageScaleMode.NO_SCALE;

            stage.align = StageAlign.TOP_LEFT;

            

            tf = new TextField();

            tf.textColor = 0x000000;

            tf.text = "Click to start";

            addChild(tf);

            animation = false;

            stage.addEventListener(MouseEvent.CLICK, tfClickEventHandler);



            // 初期化

            init();

            createObject();

            

            count = 0;

            stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

        }

        

        /**

         * init

         */

        private function init():void {

            // 世界を作る

            worldAABB = new b2AABB();

            worldAABB.lowerBound.Set(-100.0, -100.0);

            worldAABB.upperBound.Set(100.0, 100.0);

            

            // 重力

            gravity = new b2Vec2(0.0, 10.0);

            

            // 世界のインスタンス

            world = new b2World(worldAABB, gravity, true);

            

            // 床

            wallBdDef = new b2BodyDef();

            wallBdDef.position.Set(400 / SCALE / 2, 300 / SCALE);

            wallBdDef.angle = Math.PI / 20;

            

            wallBd = world.CreateBody(wallBdDef);

            

            wallShapeDef = new b2PolygonDef();

            wallShapeDef.SetAsBox(180 / SCALE, 10 / SCALE);

            

            wallBd.CreateShape(wallShapeDef);

            

            // DebugDraw

            debugDraw = new b2DebugDraw();

            debugDraw.m_sprite = this;

            debugDraw.m_drawScale = SCALE;

            debugDraw.m_fillAlpha = .5;

            debugDraw.m_lineThickness = 3;

            debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit;

            world.SetDebugDraw(debugDraw);

        }

        

        /**

         * createObject

         */

        private function createObject():void {

            objBdDef = new b2BodyDef();

            objBdDef.position.Set((300 * Math.random()) / SCALE, 0);

            objBdDef.angle = Math.PI / 2 * Math.random();

            

            objBd = world.CreateBody(objBdDef);

            

            shapeDef = new b2PolygonDef();

            shapeDef.SetAsBox(30 / SCALE, 30 / SCALE);

            shapeDef.density = 1;

            shapeDef.restitution = 0.4;

            shapeDef.friction = 0.1;

            

            objBd.CreateShape(shapeDef);

            

            shapeDef.SetAsBox(40 / SCALE, 5 / SCALE);

            objBd.CreateShape(shapeDef);

            

            objBd.SetMassFromShapes();

        }        

                

        /**

         * tfClickEventHandler

         * @event : MouseEvent

         */

        private function tfClickEventHandler(event:MouseEvent):void {

            count = 0;

            animation = !animation;

            if (animation) {

                tf.text = "Click to stop";

            } else {

                tf.text = "Click to start";

            }

        }

        

        /**

         * enterFrameHandler

         * @event : Event

         */

        private function enterFrameHandler(event:Event):void {

            world.Step(1 / 15, 10);

            if (count == 0 && animation) {

                createObject();

            }

            count = (count + 1) % 30;

            

            // 下に行ったオブジェクトを削除

            for (var b:b2Body = world.GetBodyList(); b; b = b.GetNext()) {

                if (b.GetWorldCenter().y * SCALE > 600) {

                    world.DestroyBody(b);

                }

            }

        }        

    }

}



wonderflはいいですね。
リアルタイムにコーディングしたものがプレビューできるので。
前に紹介したas3corelibもサポートしているので、ちょっとしたテストにはもってこいです。

そして、皆様ご存知かと思いますが、Javascript版のjsdo itもあるよーん。
以上です。

return top