Box2DFlashAS3の最近のブログ記事

今まで、物体同士は勝手に衝突していたのですが、ある程度コントロールできるようなのでテスト。
テスト用に円と四角を5個づつ作り、円と円、または四角と四角が衝突したら、色を変えてます。円と四角は衝突しません。
まずはプレビューを。

何かと何かが衝突した場合、b2Bodyクラスのm_contactListで取得できますので、以下のように毎フレーム実行。

SOURCE:
for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
	//衝突判別
	for (var ce:b2ContactEdge = bb.m_contactList; ce != null; ce = ce.next) {
	
		if (ce.contact.GetShape1().m_body.m_userData.id != "wall" && ce.contact.GetShape2().m_body.m_userData.id != "wall" && ce.contact.GetManifoldCount() == 1) {
		
			var mc1 = ce.contact.GetShape1().m_body.m_userData;
			var mc2 = ce.contact.GetShape2().m_body.m_userData;
		
			mc1.changeColor();
			mc2.changeColor();
		
		}
	
	}

}
※四方の壁に"wall"というidを設定してます。
GetManifoldCount()はヒットエリアを矩形か?(0)オブジェクトの形か?(1)を判断してます。

衝突するオブジェクトをコントロールするには、b2ShapeクラスのcategoryBits、maskBitsを使用します。 Mtok-blogさんの記事を参考にすると、body同士が重なった時に一方のcategoryBitsともう一方のmaskBitsの論理積(AND)が0でなかった場合に衝突するそうです。
壁、円、四角は以下のように設定すると、円と四角の場合は衝突しなくなりました。(ちょっと論理積に自信がありませんが・・・)

SOURCE:
//壁
wallObject.filter.categoryBits = 0x0011;
wallObject.filter.maskBits = 0x0011;
//円
circle.filter.categoryBits = 0x0001;
circle.filter.maskBits = 0x0001;
//四角
rect.filter.categoryBits = 0x0010;
rect.filter.maskBits = 0x0010;
ソース
※ダウンロードしたソースはBox2DとTweenerにパスをつなげてください。


参考にした記事:
Box2Dサンプル maskBitsによる衝突フィルタリング | Mtok-blog
Box2d で降りしきる箱と戯れる箱 | parpue.net

衝突は他にもオブジェクトにid名を付けて、if文で分岐する方法や、
Box2DFlashAS3での衝突判定 | FICC LABS
コンタクトリスナを使って検出する方法などあります。
第7回 円を落として星を飛び散らせる|gihyo.jp

Box2DFlashAS3が2.0.2にバージョンUPした模様ですね。でもマイナーバージョンなんでスルーします。
Box2DFlashAS3 2.0.2 ダウンロードページ


trackbacks(0) comments(0)
キーボードからの入力を受け付ける場合もマウスと同様でInputクラスを使用します。
SOURCE:
import General.Input;

キーボードが押されたかどうかを判断するには以下のように記述すると、Boolean値を返してくれます。

キーを押した時:
Input.isKeyPressed(キーコード)

キーを離した時:
Input.isKeyReleased(キーコード)

isKeyPressed、isKeyReleased共に、アクションが実行された1回のみしか値を返してくれませんので、キーを押しっぱなしかどうかを判断するには以下、isKeyDownを使用します。

キーを押し続けている時:
Input.isKeyDown(キーコード)

← (左矢印)だと「37」、→ (右矢印)だと「39」という感じです。 キーコード一覧に関しては、Adobeのlivedocsで確認できます。キーボードのキーとキーコードの値


以下、オブジェクトを矢印キーで操作する部分です。
SOURCE:
		private function update(event:Event) {
			
			m_world.Step(m_timeStep, m_iterations);
			
			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 * m_physScale;
					bb.m_userData.y = bb.GetPosition().y * m_physScale;
					bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
				}
			}
			
			//キーを押した場合
			if (Input.isKeyDown(39)) {
				// Right Arrow
				var pt1:b2Vec2 = new b2Vec2(bar.GetPosition().x + 5 / m_physScale, bar.GetPosition().y);
				bar.WakeUp();
				bar.SetXForm(pt1, 0);
			}
			else if (Input.isKeyDown(37)) {
				// Left Arrow
				var pt2:b2Vec2 = new b2Vec2(bar.GetPosition().x - 5 / m_physScale, bar.GetPosition().y);
				bar.WakeUp();
				bar.SetXForm(pt2, 0);
			}
			
			Input.update();
			
		}

※オブジェクトを動かす際にWakeUp()でsleepモードを解除しないと、壁などを突き抜けてしまいます。
プレビュー | ソース


ワールド内での現在のポジションはGetPosition()で。
GetPosition()コンストラクタ
public function GetPosition() : b2Vec2
b2Body.GetPosition().x、b2Body.GetPosition().yで取得

オブジェクトを移動させる場合はb2XForm()。
b2XForm()コンストラクタ
public function b2XForm(pos:b2Vec2=null, r:b2Mat22=null)

trackbacks(0) comments(0)
2つのオブジェクトをつなげるジョイントクラスについてメモがわりにまとめてみました。

  1. 回転ジョイント(b2RevoluteJoint) ... 重なったBody同士をつなぐ回転ジョイント(モーター機能あり)
  2. 距離ジョイント(b2DistanceJoint) ... 離れたBody同士をつなぐ回転ジョイント
  3. 滑車ジョイント(b2PulleyJoint) ... 一方を下げるともう一方が上がる動きをするジョイント
  4. スライドジョイント(b2PrismaticJoint) ... 軸に沿って移動するジョイント
  5. 歯車ジョイント(b2GearJoint) ... ギアのように、一方を回転させると、もう一方がそれに合わせて動くジョイント
  6. マウスジョイント(b2MouseJoint) ... マウスでドラッグする際に使用(「Box2DFlashAS3(2.0.1) マウスで動かす」参照)
trackbacks(0) comments(0)
前回のものにFlickrAPIのタグ検索を絡めてみました。

FlickrAPIはシンプルなRESTフォーマットでリクエストしてます。
設定は以下のような感じです。YOUR_API_KEYは取得したAPIキーを入れます。(APIキーの取得方法は第2回 JavaScriptからFlickr APIで画像検索:ITproを参考に。)

FlickrAPIリクエスト部分:
	private var fReqURL:String = "http://api.flickr.com/services/rest/";
	private var fMethod:String = "method=flickr.photos.search";
	private var fPage:String = "page=1";
	private var fTags:String = "tags=検索タグ";
	private var fAPIKey:String = "api_key=YOUR_API_KEY";
			...
	var flickrSearchURL:String = fReqURL + "?" + fMethod + "&" + fTags + "&" + fPage + "&" + fAPIKey;
	var urlReq:URLRequest = new URLRequest(flickrSearchURL);
	var loader:URLLoader = new URLLoader();
	loader.addEventListener(Event.COMPLETE,searchResponseHandler);
	loader.load(urlReq);


リクエストが成功するとXMLが返ってきますので、それを解析して画像パスを調べます。
一番小さい画像は以下のようにしてパスを取得できます。
var item:XML=xml.photos.photo[取得したい番号];
Sサイズ画像 = "http://farm"+item.@farm+".static.flickr.com/"+item.@server+"/"+item.@id+"_"+item.@secret+"_s.jpg";

他サイズは最後の「_s」を「_t」「_m」「なし」「_o」と変えることで取得できます。
詳しくはflickr.photos.getSizesメソッドで確認ください。

画像のパスが分かったら、後は読み込んでBox2Dオブジェクトに参照を渡せば完成です。

↓サンプル(右上のテキストエリアに検索タグを打ち込んでください。「SEARCH」ボタン押してからを写真を読み込むのに多少時間が掛かります。)
プレビュー | ソース
※ソース内、YOUR_API_KEYに自分のAPIキーを入れてください。
trackbacks(0) comments(2)
今まではBox2D内でデバック用のオブジェクトを動かしていたのですが、自前のムービクリップを割り当ててみました。
設定は簡単で、b2BodyDefクラスのuserDataプロパティを使用します。


trackbacks(0) comments(0)
前回(Box2DFlashAS3 2.0.0のメモ)、触ってみてから大分たってしまいましたが、今回はオブジェクトをマウスでドラッグできるようにしました。
バージョンも「2.0.1」が最新のようです。
「2.0.0」との違いはオフィシャルなドキュメントが見あたらないので詳しくは分かりませんが、他サイトを参考にするとb2WorldクラスのCreateStaticBody()、CreateDynamicBody()がCreateBody()に集約されたようです。
静止オブジェクトの場合はb2PolygonDef・b2CircleDefのdensityプロパティを0.0に設定します。

通常、FlashのドラッグはstartDrag()で動かしますが、Box2Dの場合はマウス座標とオブジェクトをジョイントを使って動かします。
trackbacks(0) comments(0)

Flash用の物理エンジンライブラリ「Box2DFlashAS3」の2.0.0を触ってみました。 元々、C++言語で書かれていた物理エンジンをFlash用に移植したようです。
本家オフィシャルサイト
Flash版オフィシャルサイト
ダウンロードページ
4月現在、最新版は2.0.0です。


参考ドキュメントは以下にあります。
オフィシャルマニュアル
APIドキュメント
※両ドキュメントとも、Flash用ではないと思いますが参考になります。


trackbacks(0) comments(0)

2010年11月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
twitter