最近は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したクラスとして提供されています。
今回は円形と四角を使ったサンプルを作ってみました。
デモはこちら。
ソースは以下。
/** * 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(); } } }