Flex ActionScript 関連覚書などなど

前回記事 初めてのFOAMの続きです。

今回は多角形の表示をします。
FOAMの基本的な使い方は前回の記事を参考にしてください。

var rigid:RigidBody = new RigidBody([X位置], [Y位置], [サイズ], [頂点の座標配列]);
foam.addElement(rigid);

これが多角形を表示するコードです。
メソッドの引数はほかにもあるのでいろいろ調節はできるようですが、
まだ調査不足のためそのあたりはいずれ・・・。

今回のサンプルでのコードとしてはこのように書いています。

// 座標をランダムに決定。0-300で。(今回はswfのサイズが300×300なので)
var rnd_x:Number = Math.random() * 300;
var rnd_y:Number = Math.random() * 300;
// 多角形のサイズをランダムに決定。20-60。この数値は適当。
var rnd_size:Number = 20 + Math.random() * 40;
// 頂点数をランダムに決定。2-9。頂点数2なら直線、3なら三角形に。
var rnd_num_vertices:Number = 1 + Math.ceil(Math.random() * 8);
// createSymmetricPolygonメソッドで頂点座標の配列を返す。
var rigid_arr:Array = ShapeUtil.createSymmetricPolygon(rnd_num_vertices, rnd_size);
 
// RigidBodyインスタンスを生成し、foamエンジンへ追加。
var rigid:RigidBody = new RigidBody(rnd_x, rnd_y, rnd_size, rigid_arr);
foam.addElement(rigid);

簡単ですね。
ただ、ちょっと重いかな・・・。まだバージョン0.1.01だもんなぁ・・・。

デモはこちら
screenshot

ソースコード全体は以下。

package  {
	import flash.display.*;
	import flash.events.MouseEvent;
	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)));
 
			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));
 
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
 
			foam.addElement(new Circle(150, 100, 20));
			foam.simulate();
		}
 
		private function clickHandler(e:MouseEvent):void {
			// add Rigid
			var rnd_x:Number = Math.random() * 300;
			var rnd_y:Number = Math.random() * 300;
			var rnd_size:Number = 20 + Math.random() * 40;
			var rnd_num_vertices:Number = 1 + Math.ceil(Math.random() * 8);
			var rigid_arr:Array = ShapeUtil.createSymmetricPolygon(rnd_num_vertices, rnd_size);
 
			var rigid:RigidBody = new RigidBody(rnd_x, rnd_y, rnd_size, rigid_arr);
 
			foam.addElement(rigid);
		}
	}
}

コメント

コメントする