Box2d flash 2.0.2 デビュー

アバター画像 kawata

0
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); }
アバター画像

ぽちっとおうえん!

シェア

  • Facebook
  • LINE
  • X
Box2d flash 2.0.2 マウスジョイント 大地に立つ!