前回(Box2DFlashAS3 2.0.0のメモ)、触ってみてから大分たってしまいましたが、今回はオブジェクトをマウスでドラッグできるようにしました。
バージョンも「2.0.1」が最新のようです。
「2.0.0」との違いはオフィシャルなドキュメントが見あたらないので詳しくは分かりませんが、他サイトを参考にするとb2WorldクラスのCreateStaticBody()、CreateDynamicBody()がCreateBody()に集約されたようです。
静止オブジェクトの場合はb2PolygonDef・b2CircleDefのdensityプロパティを0.0に設定します。
通常、FlashのドラッグはstartDrag()で動かしますが、Box2Dの場合はマウス座標とオブジェクトをジョイントを使って動かします。
バージョンも「2.0.1」が最新のようです。
「2.0.0」との違いはオフィシャルなドキュメントが見あたらないので詳しくは分かりませんが、他サイトを参考にするとb2WorldクラスのCreateStaticBody()、CreateDynamicBody()がCreateBody()に集約されたようです。
静止オブジェクトの場合はb2PolygonDef・b2CircleDefのdensityプロパティを0.0に設定します。
通常、FlashのドラッグはstartDrag()で動かしますが、Box2Dの場合はマウス座標とオブジェクトをジョイントを使って動かします。
以下、関連部分ソースです。
マウスやキーボードを使用する際はInputクラスをインポートします。
SOURCE:
import General.Input;
で、宣言部分。
SOURCE:
//マウスジョイント public var m_mouseJoint:b2MouseJoint; //マウス座標 static public var mouseXWorldPhys:Number; static public var mouseYWorldPhys:Number; static public var mouseXWorld:Number; static public var mouseYWorld:Number; //入力オブジェクト public var m_input:Input; //マウスのベクトル private var mousePVec:b2Vec2 = new b2Vec2();
コンストラクタ内で、m_spriteをInputクラスに送る。
SOURCE:
m_sprite = new Sprite(); addChild(m_sprite); m_input = new Input(m_sprite);
ドラッグのくだりです。
この辺りの計算式はもうなんだか分かりませんが、サンプルのものをコピーします。
SOURCE:
////////////////////////////////////////// マウス座標
public function UpdateMouseWorld():void{
mouseXWorldPhys = (Input.mouseX)/m_physScale;
mouseYWorldPhys = (Input.mouseY)/m_physScale;
mouseXWorld = (Input.mouseX);
mouseYWorld = (Input.mouseY);
}
////////////////////////////////////////// ドラッグ
public function MouseDrag():void{
// mouse press
if (Input.mouseDown && !m_mouseJoint){
var body:b2Body = GetBodyAtMouse();
if (body)
{
var md:b2MouseJointDef = new b2MouseJointDef();
md.body1 = m_world.GetGroundBody();
md.body2 = body;
md.target.Set(mouseXWorldPhys, mouseYWorldPhys);
md.maxForce = 300.0 * body.GetMass();
md.timeStep = m_timeStep;
m_mouseJoint = m_world.CreateJoint(md) as b2MouseJoint;
body.WakeUp();
}
}
// mouse release
if (!Input.mouseDown){
if (m_mouseJoint)
{
m_world.DestroyJoint(m_mouseJoint);
m_mouseJoint = null;
}
}
// mouse move
if (m_mouseJoint)
{
var p2:b2Vec2 = new b2Vec2(mouseXWorldPhys, mouseYWorldPhys);
m_mouseJoint.SetTarget(p2);
}
}
////////////////////////////////////////// マウス位置のオブジェクト取得
public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body{
// Make a small box.
mousePVec.Set(mouseXWorldPhys, mouseYWorldPhys);
var aabb:b2AABB = new b2AABB();
aabb.lowerBound.Set(mouseXWorldPhys - 0.001, mouseYWorldPhys - 0.001);
aabb.upperBound.Set(mouseXWorldPhys + 0.001, mouseYWorldPhys + 0.001);
// Query the world for overlapping shapes.
var k_maxCount:int = 10;
var shapes:Array = new Array();
var count:int = m_world.Query(aabb, shapes, k_maxCount);
var body:b2Body = null;
for (var i:int = 0; i < count; ++i)
{
if (shapes[i].GetBody().IsStatic() == false || includeStatic)
{
var tShape:b2Shape = shapes[i] as b2Shape;
var inside:Boolean = tShape.TestPoint(tShape.GetBody().GetXForm(), mousePVec);
if (inside)
{
body = tShape.GetBody();
break;
}
}
}
return body;
}
最後に描画処理を毎フレーム実行。
SOURCE:
private function update(event:Event) {
m_world.Step(m_timeStep, m_iterations);
UpdateMouseWorld();
MouseDrag();
Input.update();
}
プレビュー | ソース


コメントする