Processingで作った作品をAS3に移植しました。
プログラムのイメージ画像。
こちらもご覧ください。 FlashDevelop環境で、AS3を開発してみる。
処理の流れ
- setup関数で初期化
- Event.ENTER_FRAMEでdraw関数をループ実行
- マウスクリックでreset関数を実行し、カンバスをクリア。
という流れになっています。
setupメソッドから見てみます。
* A initialization function which refers Processing.
*/
public function setup():void {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
canvas = new BitmapData( stage.stageWidth, stage.stageHeight, false, bgColor );
addChild( new Bitmap( canvas ) );
element = getCross();
addEventListener( Event.ENTER_FRAME, draw );
stage.addEventListener( MouseEvent.MOUSE_DOWN, reset );
}
変数canvasにステージのサイズで新しいBitmapDataインスタンスを生成し、その変数を利用してBitmapインスタンスをメインの表示リストに追加します。
次に変数エレメントにgetCross関数で描画用のエレメントを格納します。getCross関数については後述します。
Event.ENTER_FRAMEにリスナーを張り、draw関数を登録します。ステージがクリックされた時に、reset関数を呼ぶように、リスナーを張ります。
ここで、メインのSpriteインスタンスでなく、ステージにしたのは、Spriteの内容がビットマップのみだと、MouseEventを取れない(らしい)からです。
* A function which returns the drawing element.
* @return a drawing element
*/
public function getCross():DisplayObject {
var sp:Shape = new Shape();
sp.graphics.beginFill( 0xFFFFFF );
sp.graphics.lineTo( 1, 0 );
sp.graphics.lineTo( 2, 0 );
sp.graphics.lineTo( 2, 1 );
sp.graphics.lineTo( 3, 1 );
sp.graphics.lineTo( 3, 2 );
sp.graphics.lineTo( 2, 2 );
sp.graphics.lineTo( 2, 3 );
sp.graphics.lineTo( 1, 3 );
sp.graphics.lineTo( 1, 2 );
sp.graphics.lineTo( 0, 2 );
sp.graphics.lineTo( 0, 1 );
sp.graphics.lineTo( 1, 1 );
sp.graphics.lineTo( 1, 0 );
sp.graphics.endFill();
return sp as DisplayObject;
}
getCross関数は描画用のDisplayObjectを返す関数です。
46行目で格納している、変数elementはDisplayObject型なので、戻り値の型指定がDisplayObjectになっていますが
実際に返しているオブジェクトはSpriteです。
returnするときに、as演算子を使って、DisplayObjectとしています。
何故、elementをSprite型にしないかというと、別の描画要素を返す関数を作る時にBitmapにしたい場合もあったり、Shapeにしたい場合もあると想定して
格納できるインスタンスの範囲を限定したくなかったからです。
ここではGraphics.lineTo関数を使って、十字のグラフィックを作成しています。
* A drawing function called from Event.ENTER_FRAME
* @param event Event
*/
public function draw( event:Event ):void {
var posX:uint = Math.random() * stage.stageWidth;
var posY:uint = Math.random() * stage.stageHeight;
var scale:Number = Math.random() * 6;
var radian:Number = Math.random() * 360 * Math.PI / 180;
var matrix:Matrix = new Matrix();
matrix.rotate( radian );
matrix.scale( scale, scale );
matrix.translate( posX, posY );
var coltrans:ColorTransform = new ColorTransform( 0, 0, 0, 0, Math.random() * 0xFF, 0x00, 0x64, 0xFF * 0.2 );
canvas.draw( element, matrix, coltrans, null, null, false );
}
draw関数は、毎フレーム描画するためのメソッドです。
ランダムにX座標、Y座標、拡大率、角度(ラジアン)を設定し、カンバスに直接描いていきます。
* A reset function called from MouseEvent.MOUSE_DOWN
* @param event Event
*/
public function reset( event:MouseEvent ):void {
var rect:Rectangle = new Rectangle( 0, 0, stage.stageWidth, stage.stageHeight);
canvas.fillRect( rect, bgColor );
}
reset関数は、ステージをクリックした際に呼び出されるメソッドです。 カンバスをステージのサイズと初期設定の背景色で塗りつぶすだけです。
非常にシンプルなので、AS3で作るまでもないようなプログラミングですね。