前回の説明のスクリプト

参考とういか・・そのまんまだけど参考はhttp://gihyo.jp/dev/feature/01/box2d/ になります。


Box2Dは日本語サイトがほとんどないのが残念


package {

import flash.display.MovieClip;
import flash.events.*;
//
import Box2D.Collision.b2AABB;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2World;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Collision.Shapes.b2PolygonDef;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2DebugDraw;
/**
* ...
* @author $(DefaultUser)
*/
public class FirstMain extends MovieClip{
private var wordlAABB:b2AABB;
private var gravity:b2Vec2;
private var world:b2World;
private var floorbody:b2BodyDef;
private var floorshape:b2PolygonDef;
private var bodydef:b2BodyDef;
private var shapedef:b2PolygonDef;
public function FirstMain() {
stage.addEventListener(MouseEvent.CLICK, clickHandler);

}

private function clickHandler(e:MouseEvent):void {

//物理エンジンの影響する範囲
wordlAABB = new b2AABB();
wordlAABB.lowerBound.Set( -100, -100);
wordlAABB.upperBound.Set(100, 100);
//重力の定義
gravity = new b2Vec2(0, 10);
//物理エンジン全体のセットアップ
world = new b2World(wordlAABB, gravity, true);
//ここまでの時点で物理エンジンのセットアップのみで物理の世界を作ったにすぎない
//このあとはここから物を設置していく。床と今回は箱
floorbody = new b2BodyDef(); //床の場所はworldの左から2.5m,上から3mの位置に配置する
floorbody.position.Set(2.5, 3);//先の数値は床の中心座標なので注意
//床の形を定義
//床のサイズは幅4m,高さ(厚さ)20cmなので,その半分の2と0.1を指定.
//床の中心位置からの幅と高さだと思えば分かりやすい 基本的にBox2Dは長さをmで表す(ピクセルではない)ので20cmは0.2mなのでその半分の0.1
//重さはキログラム、時間は秒で表す
floorshape = new b2PolygonDef();
floorshape.SetAsBox(2, 0.1);
//定義した床の位置と形の情報をworldに指定する
var floor:b2Body = world.CreateBody(floorbody);
floor.CreateShape(floorshape);
//箱の場所を指定
bodydef = new b2BodyDef();
bodydef.position.Set(e.stageX/100,e.stageY/100);
//箱の形を定義
shapedef = new b2PolygonDef();
shapedef.SetAsOrientedBox(0.3, 0.2, new b2Vec2(0, 0), 0.8);//3番目の引数は回転させるときの中心座標で4番目は、傾ける角度(ラジアン指定)
//重さ(密度)の設定
shapedef.density = 1; //重さ1平方メートルだと1キロ。今回は0.24キロ。60キロと40キロをmに変換すると0.6×0.4=0.24平方メートル。なので0.24キロ
//反発係数
shapedef.restitution = 0.2; //反発係数が0だと跳ね返ることがなくなる
//worldに設定する
var body:b2Body = world.CreateBody(bodydef);
body.CreateShape(shapedef);//形を設定
body.SetMassFromShapes();//密度を設定
//
//床と箱を設置した後の描画処理
var debugDraw:b2DebugDraw = new b2DebugDraw();
debugDraw.m_sprite = this;
debugDraw.m_drawScale = 100;
debugDraw.m_fillAlpha = 0.3;
debugDraw.m_lineThickness = 1;
debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
//
world.SetDebugDraw(debugDraw);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void {
world.Step(1 / 24, 10);//24フレーム。物理エンジンのシミュレーション精度を指定します。値が大きいほど精度が上がるが,その分時間もかかる。マニュアルだと10を推奨

}

}

}