Box2DFlashAS3をお試し

こんばんわ。iyamaです。

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

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

お手本として以下のサイトを参考にさせてもらいました。

Box2DFlashAS3 の単純なサンプルと使い方 (2.0.2版)

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

Box2DFlashAS3

ソースは以下のとおり。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/**
 * 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版のjsdoitもあるよーん。 以上です。

Comments