Box2d flash 2.0.2 デビュー


Papervision3Dにつづいて、物理演算ライブラリのBox2dflashを使ってみる。
これって、ググっても結構高度のようで、ここまで理解するにも
結構時間かかったさ〜。クリックすると■が落下するので、
高橋名人バリに、いざ16連打さ〜。



[SWF]http://knap.jp/blog/swf/box2d_test1.swf, 425, 500[/SWF]

ソースはこちら。(まいど、flashIDE 直書き)

import Box2D.Collision.b2AABB;
import Box2D.Collision.Shapes.b2CircleDef;
import Box2D.Collision.Shapes.b2PolygonDef;
import Box2D.Collision.Shapes.b2PolygonShape;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2DebugDraw;
import Box2D.Dynamics.b2World;

var world:b2World;
const DRAW_SCALE:Number = 100;

init();
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(e:MouseEvent){
 makeBox();
}
function init():void {
 var worldAABB:b2AABB = new b2AABB();
 worldAABB.lowerBound.Set(-100, -100);
 worldAABB.upperBound.Set(100, 100);

 // 重力
 var gravity:b2Vec2 = new b2Vec2(0, 10);
 world = new b2World(worldAABB, gravity, true);

 /** 床    **/
 //床の位置
 var floorBodyDef:b2BodyDef = new b2BodyDef();
 floorBodyDef.position.Set(2.15, 5); //m単位
 // 床の形
 // 指定するのはその半分の値
 var floorShapeDef:b2PolygonDef = new b2PolygonDef();
 floorShapeDef.SetAsBox(2, 0.1);
 // 床を動かない物体として作る
 var floor:b2Body = world.CreateBody(floorBodyDef);
 floor.CreateShape(floorShapeDef);
 // 床のスプライトを作る
 var floorImage:Sprite = new FloorImage();
 // スプライトのサイズを合わせる
 floorImage.width = 4 * DRAW_SCALE;
 floorImage.height = 0.2 * DRAW_SCALE;
 // 床の中心が(0, 0)に来るように,左上にずらす
 floorImage.x = -floorImage.width / 2;
 floorImage.y = -floorImage.height / 2;
 // b2BodyのユーザデータとしてSpriteを作る
 floor.m_userData = new Sprite();
 // Spriteの場所を物理エンジン内の場所と一致させる
 floor.GetUserData().x = floor.GetWorldCenter().x * DRAW_SCALE;
 floor.GetUserData().y = floor.GetWorldCenter().y * DRAW_SCALE;
 floor.GetUserData().addChild(floorImage);
 addChild(floor.GetUserData());

 //落下箱の作成    
 makeBox();
}

function makeBox(){
 // 箱の設置
 //ランダムのX位置
 var posX:Number = Math.random()*2+1;
 //ランダムの回転
 var rotate:Number = Math.random()*0.8;
 // 箱の位置を左からランダム、上から0.5mとする
 var bodyDef:b2BodyDef = new b2BodyDef();
 bodyDef.position.Set(posX, 1);

 var bodyShape:b2PolygonDef = new b2PolygonDef();
 bodyShape.SetAsOrientedBox(0.5, 0.5, new b2Vec2(0, 0), rotate);
 bodyShape.density = 1;
 bodyShape.restitution = 0;

 var body:b2Body = world.CreateBody(bodyDef);
 body.CreateShape(bodyShape);
 body.SetMassFromShapes();

 // スプライトを表示する
 var bodyImage:Sprite = new BodyImage()
 bodyImage.width = 1 * DRAW_SCALE;
 bodyImage.height = 1 * DRAW_SCALE;
 bodyImage.rotation = rotate * 180 / Math.PI;
 body.m_userData = new Sprite();
 body.GetUserData().x = body.GetWorldCenter().x * DRAW_SCALE;
 body.GetUserData().y = body.GetWorldCenter().y * DRAW_SCALE;
 body.GetUserData().addChild(bodyImage);
 addChild(body.GetUserData());

 /*デバッグ非表示
 var debugDraw:b2DebugDraw = new b2DebugDraw();
 debugDraw.m_sprite = this;
 debugDraw.m_drawScale = 100; // 1mを100ピクセルにする
 debugDraw.m_fillAlpha = 0.3; // 不透明度
 debugDraw.m_lineThickness = 1; // 線の太さ
 debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
 world.SetDebugDraw(debugDraw);
 */
}

function enterFrameHandler(event:Event):void {
 // ワールド内の全てのb2Bodyに対する処理
 for (var b:b2Body = world.GetBodyList(); b; b = b.GetNext()) {
 if (b.GetUserData() is Sprite) {
 b.GetUserData().x = b.GetWorldCenter().x * DRAW_SCALE;
 b.GetUserData().y = b.GetWorldCenter().y * DRAW_SCALE;
 b.GetUserData().rotation = b.GetAngle() * 180 / Math.PI;
 }
 }
 world.Step(1 / 24, 10);
}
Scroll to top