マウスの移動距離でボックスサイズを自由に作成。
流れとしてはマウスをダウンした座標
イベントは
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, mouseup);
mouseDownでマウスをダウンしたらダウンしたステージ座標を保持しておく。
保持しておく変数はのちのち使用するのでprivate宣言しておく。(Pointを使用すると便利)
もう一つはm_drawScaleの数値がピクセルからメートルに変換するのに必要なので先に変数で設定しておく。
private var initPos:Point=new Point();
private var DRAW_SCALE:Number=100;
function mouseDown(e:MouseEvent):void{
initPos.x=e.stageX;
initPos.y=e.stageY;
}
重要なのはマウスアップ内での計算
function mouseup(e:MouseEvent):void{
var x:Number=(e.stageX+initPos.x)/2/DRAW_SCALE;
var y:Number=(e.stageY+initPos.y)/2/DRAW_SCALE;
//
var harfW:Number=Math.abs(e.stageX-initPos.x)/2/DRAW_SCALE;
var harfH:Nuumber=Math.abs(e.stageY-initPos.y)/2/DRAW_SCALE;
//
//小さすぎると計算が狂ってくるので0.05より小さいのは作成させないように処理を終了
if(harfW<0.05 || harfH<0.05){
return;
}
//ボックスの位置
var boxDef:b2BodyDef=new b2BodyDef();
boxDef.position.Set(x,y);
//
//ボックスの大きさを作成
var shapeDef:b2PolygonDef=new b2PolygonDef();
shapeDef.SetAsBox(harfW,harfH);
shapeDef.density = 1;
shapeDef.restitution = 0.1;
//
//
//箱をワールドに動く物体として設定
var body:b2Body = World.CreateBody(bodyDef);
body.CreateShape(shapeDef);
body.SetMassFromShapes();
}
式の説明 ボックスの位置
var x:Number=(e.stageX+initPos.x)/2/DRAW_SCALE;
var y:Number=(e.stageY+initPos.y)/2/DRAW_SCALE;
まずボックス(箱)の位置はそのボックスの中心点が基準になっているということ。
例えば左から2mのところ上から1mのところにあれば中心点の座標は(x:2m、y:100)になる。
ということはボックスの中心点を求めればよいということ。
マウスダウン時に保存しておいたinitPos.xの数値とマウスアップ時のstageXを足した値を2で割ると座標が割り出せる。それにDRAW_SCALEの値で割るとメートルへ変換することができる
その値を代入
//ボックスの位置
var boxDef:b2BodyDef=new b2BodyDef();
boxDef.position.Set(x,y);
式の説明 ボックスの大きさ
var harfW:Number=Math.abs(e.stageX-initPos.x)/2/DRAW_SCALE;
var harfH:Nuumber=Math.abs(e.stageY-initPos.y)/2/DRAW_SCALE;
幅と高さは、マウスアップした座標からマウスダウンした時の座標を引くことでボックスの幅を割り出せるので、その数値を2で割ると半分の幅と高さを表すことができる。
*前回で述べたようにBox2Dは、中心点からの計算なのでボックスを作る時は幅と高さの半分の数値が必要
その数値をDRAW_SCALEで割るとピクセルからメートル変換できる。その数値を代入
var shapeDef:b2PolygonDef=new b2PolygonDef();
shapeDef.SetAsBox(harfW,harfH);
shapeDef.density = 1;
shapeDef.restitution = 0.1;