« Processing 「ライブの音と同期させる」 | トップページ | Box2D FLASH その2 »

2008年4月22日 (火)

Box2D FLASH その1

会社の勉強会でBox2Dについて発表することになったので
まとめのついでに書き込んでみる。

初めてさわったのはけっこう前だけど、サンプル見ても
bdBodyとかb2BodyDefとかb2BoxDefとか・・・何がなんだか
分からなくて放っておいた。。
でも最近久々にやってみたらなんか分かってきました。
といってもちゃんとは理解してないし間違ってることも
多そうだけど一応動くから全然間違ってはいないはず。

とりあえずはBOXを1個作ってみます。

●Box2Dのステージを作成
まずは下記でBox2Dの初期設定。

//Box2Dのステージを作成
var worldAABB:b2AABB = new b2AABB();
worldAABB.minVertex.Set(-1000.0, -1000.0);
worldAABB.maxVertex.Set(1000.0, 1000.0);
var gravity:b2Vec2 = new b2Vec2(0.0, 100.0);	//重力(X方向、Y方向)
var doSleep:Boolean = false;	//これまだ不明。。
m_world = new b2World(worldAABB, gravity, doSleep);

minVertexとmaxVertexはBox2Dのステージの範囲ですかね。
オブジェクトがこの領域から出ると動かなく(計算されなく)なります。

gravityは重力。X方向、Y方向それぞれに設定できます。

doSleepは中身も見たけど分からず。。これはなんだろ?

●BOXの作成
b2BoxDefとb2BodyDef、見た目似てるからよく間違う。。

Box2Dはb2BoxDef(四角)、b2CircleDef(丸)、b2PolyDef(多角)を使って
オブジェクトを作ります。
でももうちょい複雑な形を作りたい場合もあります。
その場合は複数のb2BoxDef、b2CircleDef、b2PolyDefを「b2BodyDef」で
1つのオブジェクトとしてまとめることができます。
オブジェクトが1つの場合でも「b2BodyDef」でまとめます。
今回の例でも1つだけです。

//BOXの作成
var boxDef:b2BoxDef = new b2BoxDef();
boxDef.extents.Set(40, 20);
boxDef.density = 0.2;
boxDef.friction = 0.8;
boxDef.restitution = 0.6;
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.AddShape(boxDef);
bodyDef.position.x = 200;
bodyDef.position.y = 200;
bodyDef.userData = { };
bodyDef.userData.fillColor = 0xFFCC00;
var body:b2Body = m_world.CreateBody(bodyDef);

これでBOXが1つ作成されます。

これだけじゃ動きませんが、長くなるので今回はこれくらいで。
次回以降、他の部分も書きます。
一応下記のスクリプトで動きます。
BOXが落ちていきます。今回はそれだけです。

package {
	import flash.display.Sprite;
	import flash.events.Event;

	import Box2D.Dynamics.*;
	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;
	import Box2D.Dynamics.Joints.*;
	import Box2D.Common.Math.*;
	public class Box2D0430Test01 extends Sprite {
		public var m_world:b2World;
		public var m_iterations:int = 1;
		public var m_timeStep:Number = 1/60;
		public var m_sprite:Sprite;
		public var m_physScale:Number = 1;
		function Box2D0430Test01() {
			init();
		}
		public function init():void {
			//Box2D 計算&描画用のENTER_FRAMEの設定
			addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
			
			//シェイプ描画用のSpriteを作成
			m_sprite = new Sprite();
			addChild(m_sprite);
			
			//Box2Dのステージを作成
			var worldAABB:b2AABB = new b2AABB();
			worldAABB.minVertex.Set(-1000.0, -1000.0);
			worldAABB.maxVertex.Set(1000.0, 1000.0);
			var gravity:b2Vec2 = new b2Vec2(0.0, 100.0);	//重力(X方向、Y方向)
			var doSleep:Boolean = false;	//これまだ不明。。
			m_world = new b2World(worldAABB, gravity, doSleep);

			//BOXの作成
			var boxDef:b2BoxDef = new b2BoxDef();
			boxDef.extents.Set(40, 20);
			boxDef.density = 0.2;
			boxDef.friction = 0.8;
			boxDef.restitution = 0.6;
			var bodyDef:b2BodyDef = new b2BodyDef();
			bodyDef.AddShape(boxDef);
			bodyDef.position.x = 200;
			bodyDef.position.y = 200;
			bodyDef.userData = { };
			bodyDef.userData.fillColor = 0xFFCC00;
			var body:b2Body = m_world.CreateBody(bodyDef);
		}
		
		public function Update(e:Event):void {
			//Box2Dに計算をさせる
			m_world.Step(m_timeStep, m_iterations);
			
			//シェイプを全て削除
			this.m_sprite.graphics.clear();
			
			//シェイプの描画
			for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
				for (var s:b2Shape = bb.GetShapeList(); s != null; s = s.GetNext()) {
					drawShape(s, bb.m_userData.fillColor);
				}
			}
		}
		
		public function drawShape(_shape:b2Shape, _fillColor:int = 0xFFFFFF):void {
			//シェイプの描画 このへんはコピペで。。
			var i:int;
			var v:b2Vec2;
			var poly:b2PolyShape = _shape as b2PolyShape;
			var tV:b2Vec2 = b2Math.AddVV(poly.m_position, b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));   
			m_sprite.graphics.beginFill(_fillColor, 1);   
			m_sprite.graphics.lineStyle(0, 0, 0);
			m_sprite.graphics.moveTo(tV.x * m_physScale, tV.y * m_physScale);   
			for (i = 0; i < poly.m_vertexCount; ++i){   
				v = b2Math.AddVV(poly.m_position, b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));   
				m_sprite.graphics.lineTo(v.x * m_physScale, v.y * m_physScale);   
			}   
			m_sprite.graphics.lineTo(tV.x * m_physScale, tV.y * m_physScale);   
			m_sprite.graphics.endFill();   
		}  
	}
}

|

« Processing 「ライブの音と同期させる」 | トップページ | Box2D FLASH その2 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: Box2D FLASH その1:

« Processing 「ライブの音と同期させる」 | トップページ | Box2D FLASH その2 »