スマートフォンやhtml5+CSS3など新技術に四苦八苦。jQuery、AjaxなどJavaScriptも難しいですね。そんなWebに悩む人のネタ帳です。

Box2DFlashAS3で作成した物体を、マウスのドラッグで投げ飛ばす処理を作成しました。

いろんなサイトを調べていたのですが、処理としてはパターン化されているようです。ただ、少しずつ差異があるみたいで、こっちの処理を持ってくると動かなくて、もう一つのサンプルから部分的に参考にしたり、というふうにして私のプログラムに組み込みました。そんな流れで出来上がってしまったので、正直、処理詳細まで把握できていません。。。

「add Ball」ボタンで物体を追加できます。追加した物体はマウスのドラッグで動かすことができます。





プログラムはポイントだけ抜粋します。

まずは、マウスを押して物体をつかむ、ドラッグで物体を動かす、マウスクリック開放で物体を放す、といったイベントを登録します。

_stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent) {
	var body:b2Body = GetBodyAtMouse(e.stageX, e.stageY);
	if(body){
		var mjd:b2MouseJointDef = new b2MouseJointDef();
		mjd.body1 = _world.GetGroundBody();
		mjd.body2 = body;
		mjd.target.Set(e.stageX / _mperpix, e.stageY / _mperpix);
		mjd.maxForce = 500 * body.m_mass;
		mjd.timeStep = 1 / 24;
		body.WakeUp();
		_mj = b2MouseJoint(_world.CreateJoint(mjd));
	}
});
_stage.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent) {
	if (_mj) {
		_world.DestroyJoint(_mj);
		_mj = null;
	}
});
_stage.addEventListener(MouseEvent.MOUSE_MOVE, function(e:MouseEvent) {
	if (_mj) {
		var mjx:Number = e.stageX / 100;
		var mjy:Number = e.stageY / 100;
		_mj.SetTarget(new b2Vec2(mjx, mjy));
	}
});

プロパティのタイプ、「_stage」はStage、「_mj」はb2MouseJoint、「_world」はb2Worldです。

次に関数GetBodyAtMouseの中身なのですが、ステージ上にマウスクリック位置から、選択されている物体を探し出している、と思われます。。。ここは完全に理解できていません。。。

public function GetBodyAtMouse(stageX:Number, stageY:Number):b2Body {
	var mb2v:b2Vec2 = new b2Vec2();
	var msx:Number = stageX / _mperpix;
	var msy:Number = stageY / _mperpix;
	// Make a small box.
	mb2v.Set(msx, msy);
	var aabb:b2AABB = new b2AABB();
	aabb.lowerBound.Set(msx - 0.001, msy - 0.001);
	aabb.upperBound.Set(msx + 0.001, msy + 0.001);
	// Query the world for overlapping shapes.
	var k_maxCount:int = 10;
	var shapes:Array = new Array();
	var count:int = _world.Query(aabb, shapes, k_maxCount);
	var body:b2Body = null;
	for (var i:int = 0; i < count; ++i) {
		if (shapes[i].m_body.IsStatic() == false) {
			var tShape : b2Shape = shapes[i] as b2Shape;
			var inside : Boolean = tShape.TestPoint(tShape.m_body.GetXForm(), mb2v);
			if (inside) {
				body = tShape.m_body;
				break;
			}
		}
	}
	return body;
}

さて、今度は複雑なオブジェクトを作ってみたいですね。

これまでは円とか四角形などシンプルなオブジェクトしか生成していませんが、複雑な形となると、これらベースとなるオブジェクトを組み合わせることになりそうですが。想像しただけでもめんどくさそうですね。

このエントリーをはてなブックマークに追加

Comment

Comment Form

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Monthly Archives

Search