Home > ActionScript3.0 | Library > [as3][FOAM]初めてのFOAM(2) 多角形の表示

[as3][FOAM]初めてのFOAM(2) 多角形の表示

前回記事 初めての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);
		}
	}
}

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://www.jinten.net/blog/archives/43/trackback
Listed below are links to weblogs that reference
[as3][FOAM]初めてのFOAM(2) 多角形の表示 from Jinten Blog

Home > ActionScript3.0 | Library > [as3][FOAM]初めてのFOAM(2) 多角形の表示

Search
Google
Feeds
Meta
Advertisement

Return to page top