as3版 CrossDrawer

このエントリーを含むはてなブックマーク

Processingで作った作品をAS3に移植しました。

CrossDrawerのイメージ プログラムのイメージ画像。

こちらもご覧ください。 FlashDevelop環境で、AS3を開発してみる。

処理の流れ

  1. setup関数で初期化
  2. Event.ENTER_FRAMEでdraw関数をループ実行
  3. マウスクリックでreset関数を実行し、カンバスをクリア。

という流れになっています。

setupメソッドから見てみます。

  1. /**
  2. * A initialization function which refers Processing.
  3. */
  4. public function setup():void {
  5.     stage.scaleMode = StageScaleMode.NO_SCALE;
  6.     stage.align=StageAlign.TOP_LEFT;
  7.  
  8.     canvas = new BitmapData( stage.stageWidth, stage.stageHeight, false, bgColor );
  9.     addChild( new Bitmap( canvas ) );
  10.  
  11.     element = getCross();
  12.  
  13.     addEventListener( Event.ENTER_FRAME, draw );
  14.     stage.addEventListener( MouseEvent.MOUSE_DOWN, reset );
  15. }


変数canvasにステージのサイズで新しいBitmapDataインスタンスを生成し、その変数を利用してBitmapインスタンスをメインの表示リストに追加します。 次に変数エレメントにgetCross関数で描画用のエレメントを格納します。getCross関数については後述します。

Event.ENTER_FRAMEにリスナーを張り、draw関数を登録します。ステージがクリックされた時に、reset関数を呼ぶように、リスナーを張ります。 ここで、メインのSpriteインスタンスでなく、ステージにしたのは、Spriteの内容がビットマップのみだと、MouseEventを取れない(らしい)からです。

  1. /**
  2. * A function which returns the drawing element.
  3. * @return a drawing element
  4. */
  5. public function getCross():DisplayObject {
  6.  
  7.     var sp:Shape = new Shape();
  8.     sp.graphics.beginFill( 0xFFFFFF );
  9.     sp.graphics.lineTo( 1, 0 );
  10.     sp.graphics.lineTo( 2, 0 );
  11.     sp.graphics.lineTo( 2, 1 );
  12.     sp.graphics.lineTo( 3, 1 );
  13.     sp.graphics.lineTo( 3, 2 );
  14.     sp.graphics.lineTo( 2, 2 );
  15.     sp.graphics.lineTo( 2, 3 );
  16.     sp.graphics.lineTo( 1, 3 );
  17.     sp.graphics.lineTo( 1, 2 );
  18.     sp.graphics.lineTo( 0, 2 );
  19.     sp.graphics.lineTo( 0, 1 );
  20.     sp.graphics.lineTo( 1, 1 );
  21.     sp.graphics.lineTo( 1, 0 );
  22.     sp.graphics.endFill();
  23.     return sp as DisplayObject;
  24. }


getCross関数は描画用のDisplayObjectを返す関数です。 46行目で格納している、変数elementDisplayObject型なので、戻り値の型指定がDisplayObjectになっていますが 実際に返しているオブジェクトはSpriteです。 returnするときに、as演算子を使って、DisplayObjectとしています。 何故、elementSprite型にしないかというと、別の描画要素を返す関数を作る時にBitmapにしたい場合もあったり、Shapeにしたい場合もあると想定して 格納できるインスタンスの範囲を限定したくなかったからです。

ここではGraphics.lineTo関数を使って、十字のグラフィックを作成しています。

  1. /**
  2. * A drawing function called from Event.ENTER_FRAME
  3. * @param    event   Event
  4. */
  5. public function draw( event:Event ):void {
  6.  
  7.     var posX:uint = Math.random() * stage.stageWidth;
  8.     var posY:uint = Math.random() * stage.stageHeight;
  9.     var scale:Number = Math.random() * 6;
  10.     var radian:Number =  Math.random() * 360 * Math.PI / 180;
  11.  
  12.     var matrix:Matrix = new Matrix();
  13.     matrix.rotate( radian );
  14.     matrix.scale( scale, scale );
  15.     matrix.translate( posX, posY );
  16.     var coltrans:ColorTransform = new ColorTransform( 0, 0, 0, 0, Math.random() * 0xFF, 0x00, 0x64, 0xFF * 0.2 );
  17.     canvas.draw( element, matrix, coltrans, null, null, false );
  18. }


draw関数は、毎フレーム描画するためのメソッドです。 ランダムにX座標、Y座標、拡大率、角度(ラジアン)を設定し、カンバスに直接描いていきます。

  1. /**
  2. * A reset function called from MouseEvent.MOUSE_DOWN
  3. * @param    event   Event
  4. */
  5. public function reset( event:MouseEvent ):void {
  6.     var rect:Rectangle = new Rectangle( 0, 0, stage.stageWidth, stage.stageHeight);
  7.     canvas.fillRect( rect, bgColor );
  8. }


reset関数は、ステージをクリックした際に呼び出されるメソッドです。 カンバスをステージのサイズと初期設定の背景色で塗りつぶすだけです。

非常にシンプルなので、AS3で作るまでもないようなプログラミングですね。

Posted in actionscript3.0, flash, programing at 1月 8th, 2007. Trackback URI: trackback

No Responses to “as3版 CrossDrawer”

Leave a Reply