Flex ActionScript 関連覚書などなど

最近はBox2DFlashAS3と言うのがはやっているようですね。今更いろいろやろうにも出遅れた感が否めないので、ここはあえて違う物理エンジンをいじってみようと思います。

今回触ってみたのは、FOAMという物理エンジンです。
バージョンは0.1.01。まだまだ開発版ということですかね。

ではでは、初めてなので、まずは使い方から。

必要なものは、Foamクラスのインスタンスです。

private var foam:Foam = new Foam();
addChild(foam);

しかも、FoamクラスはSpriteクラスを継承しているため、描画もしてくれます。
なので、addChildしておきます。

foam.addGlobalForceGenerator(new Gravity(new Vector(0, 0.3)));

Gravityクラスが重力になるようです。(まだ調査しきれてません・・・)
これを、先ほどのfoamインスタンスのメソッド、addGlobalForceGeneratorに渡します。
これで、重力発生です。

続いて、オブジェクトを配置します。
FormインスタンスのメソッドaddElementに、ISimulatableインターフェースなインスタンスを渡してやります。
円形や多角形、ベジェ曲線などがISimulatableインターフェースをimplementsしたクラスとして提供されています。
今回は円形と四角を使ったサンプルを作ってみました。

デモはこちら。screenshot

ソースは以下。

/**
* FOAM sample1
* @author jinten.net
*/
package  {
	import flash.display.*;
	import org.generalrelativity.foam.dynamics.element.body.*;
	import org.generalrelativity.foam.dynamics.enum.Simplification;
	import org.generalrelativity.foam.dynamics.force.Gravity;
	import org.generalrelativity.foam.Foam;
	import org.generalrelativity.foam.math.Vector;
	import org.generalrelativity.foam.util.ShapeUtil;
 
	[SWF(width="300", height="300")]
	public class FoamSample1 extends Sprite {
 
		private const W:Number = 300;
		private const H:Number = 300;
 
		private var foam:Foam;
 
		public function FoamSample1() {
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.BOTTOM;
 
			//FOAMインスタンスの生成
			foam = new Foam();
			addChild(foam);
 
			//オブジェクトのドラッグ有効化
			foam.useMouseDragger(true);
 
			foam.addGlobalForceGenerator(new Gravity(new Vector(0, 0.3)));
 
			//circle
			foam.addElement(new Circle(100, 100, 30));
			foam.addElement(new Circle(200, 100, 30));
 
			var wall_arr:Array;
			//ground
			wall_arr = ShapeUtil.createRectangle(W, 20);
			foam.addElement(new RigidBody(W/2, 0, Simplification.INFINITE_MASS, wall_arr));
			foam.addElement(new RigidBody(W/2, H, Simplification.INFINITE_MASS, wall_arr));
			//wall
			wall_arr = ShapeUtil.createRectangle(20, H);
			foam.addElement(new RigidBody(0, H/2, Simplification.INFINITE_MASS, wall_arr));
			foam.addElement(new RigidBody(W, H/2, Simplification.INFINITE_MASS, wall_arr));
 
			foam.simulate();
		}
	}
}

コメント

コメントする