使用ライブラリ : AS3 Flash Physics Engine Box2DFlash
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.*;
import Box2D.Common.Math.*;
public class Learning14 extends Sprite {
public function Learning14() {
stage.addEventListener(MouseEvent.MOUSE_DOWN, fall);
//********************************
//Box2D
//お金が降ってくる
//********************************
//物理エンジンが影響する範囲を定義
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100, -100);//左上
worldAABB.upperBound.Set(100, 100);//右下
//重力を定義
var gravity:b2Vec2=new b2Vec2(0.0,10.0);
//物理エンジンワールドを作成
var doSleep:Boolean=true;
var m_world:b2World=new b2World(worldAABB,gravity,doSleep);
//描画設定
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;
//画像のみの場合は消す
m_world.SetDebugDraw(debugDraw);
//オブジェクト(床)を定義
var body:b2Body;
var bodyDef:b2BodyDef = new b2BodyDef();//1.インスタンスを生成
bodyDef.position.Set(2.8, 3);//2.インスタンスの中心座標を設定 左からの位置,上からの位置
var bodyShapeDef:b2PolygonDef = new b2PolygonDef();//3.どんな形のオブジェクトを造るかを選択
bodyShapeDef.SetAsBox(2, 0.1);//4.幅/2 , 高さ/2 1 = 1メートル
body=m_world.CreateBody(bodyDef);//6.物理エンジンワールドにインスタンスを追加
body.CreateShape(bodyShapeDef);//7.インスタンスにShape(多角形)を追加
//オブジェクト(札)を定義
var m_body:b2Body;
var m_bodyDef:b2BodyDef = new b2BodyDef();//1.インスタンスを生成
m_bodyDef.position.Set(2.8, 0);//2.インスタンスの中心座標を設定 左からの位置,上からの位置
var m_bodyShapeDef:b2PolygonDef = new b2PolygonDef();//3.どんな形のオブジェクトを造るかを選択
m_bodyShapeDef.SetAsOrientedBox(0.38, 0.225, new b2Vec2(0, 0), 0);//幅/2 , 高さ/2 ,右に回す
m_bodyShapeDef.density=1.0;//5.オブジェクトの質量を定義
m_bodyShapeDef.friction=0.5;//オブジェクトの摩擦を定義
m_bodyShapeDef.restitution=0.8;//オブジェクトの反発係数を定義
m_bodyDef.userData = new Movie();//userDataに画像を生成
m_bodyDef.userData.width=80;
m_bodyDef.userData.height=45;
m_body=m_world.CreateBody(m_bodyDef);//6.物理エンジンワールドにインスタンスを追加
m_body.CreateShape(m_bodyShapeDef);//7.インスタンスにShape(多角形)を追加
m_body.SetMassFromShapes();//8.重さを設定
//時間を動かす
function fall(e:Event):void {
addEventListener(Event.ENTER_FRAME, func, false, 0, true);
}
function func(e:Event):void {
m_world.Step(1/24,10);//1フレーム1/24秒,シミュレーション精度
//セットしたuserDataの位置と回転をオブジェクトのそれらに合わせる
for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
if (bb.m_userData is Sprite) {
//インスタンスの画像を中心にセットして
bb.m_userData.x=bb.GetPosition().x*100;//userDataの横軸をオブジェクトの横軸に
bb.m_userData.y=bb.GetPosition().y*100;//userDataの縦軸をオブジェクトの縦軸に
bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);//userDataの回転をオブジェクトの回転に
addChild(m_bodyDef.userData);//stageにuserDataを追加
}
}
}
}
}
}