[AS3] wonderflのCHECKMATEに応募してみたよ

2009/07/13

こんにちは。きんくまです。
Peftumeの△を買いましたです。

今回作ったやつです。
クリックするとスタートして、もう一回クリックすると止まります。

これが何かといいますと、

1. 数字をひとつずつ増やす(1,2,3,4…)
2. それをひとつずつ配列に格納
3. それを全て2進数に変換(1, 10, 11, 100…)
4. これをビットマップパターンに変換して模様を作る

ということをやっています。
この前買ったGMC-4の上部LEDをヒントにしてみました。
>> 4ビットマイコン GMC-4が面白い!

で、これが何かといいますとwonderflというflash投稿サービスがありまして。
そのwonderflで今CHECKMATEというコンテストをやっているんです。
お題があってみんながそれにこたえる見たいな。いわゆる大喜利です。それに投稿しました。

>> 2進数を可視化)forked from: fladdict challenge for professionals

wonderflについてもう少し詳しく説明すると、

・スクリプトを投稿して面白いネタを見せ合う
・その手の内(ソースコード)も勉強し合おう
・面白ネタを投稿すると反響(お気に入りがつく)があるよ
・ブラウザだけでスクリプトを書いてコンパイルできるよ
・特にお金はかかりません

みたいな感じです。
ASは全く触ったことないけど興味はある!みたいな方は、試しにやってみると面白いかもしれないです。

以下ソースコード

/**
 * Theme:
 * Play with BitmapPatterBuilder.
 * Purpose of this trial is to find the possibility of the dot pattern.
 *
 * by Takayuki Fukatsu aka fladdict
 *
 *
 * 増えていく数字を2進数にして可視化するとこんな感じ?
 **/
package {
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.Graphics;
  import flash.display.Sprite;
  import flash.display.StageScaleMode;
  import flash.events.Event;
  import flash.events.MouseEvent;
  import flash.geom.Matrix;
  import flash.geom.Rectangle;

  [SWF(width="480", height="480", frameRate="24", backgroundColor="#000000")]
  public class Professional extends Sprite {
    public var cnt:int;
    public var baseInts:Array;
    public var colors:Array = [0xff00ff00, 0xff000000];
    public var myg:Graphics;
    public var canvasBmd:BitmapData;
    public var startedFlag:Boolean = false;

    public function Professional() {
      stage.scaleMode = StageScaleMode.NO_SCALE;
      canvasBmd = new BitmapData(32, 480);
      myg = this.graphics;
      cnt = 0;
      baseInts = [0];
      this.stage.addEventListener(MouseEvent.CLICK, clickHD);
    }

    private function clickHD(e:MouseEvent):void
    {
      if (startedFlag == false) {
        startedFlag = true;
        this.stage.addEventListener(Event.ENTER_FRAME, ef);
      }else {
        startedFlag = false
        this.stage.removeEventListener(Event.ENTER_FRAME, ef);
      }
    }

    private function ef(e:Event):void
    {
      if (baseInts.length > 160) {
        baseInts = [0];
        cnt = 0;
      }else {
        cnt++;
        baseInts.push(cnt);
      }

      var pt:BitmapData = BitmapPatternBuilder.build(getPattern(), colors);
      var mtx:Matrix = new Matrix();
      mtx.scale(3, 3);
      canvasBmd.lock();
      canvasBmd.fillRect(new Rectangle(0, 0, canvasBmd.width, canvasBmd.height), 0);
      canvasBmd.draw(pt, mtx);
      canvasBmd.unlock();

      myg.clear();
      myg.beginBitmapFill(canvasBmd);
      myg.drawRect(0, 0, 480, 480);
      myg.endFill();
    }

    private function getPattern():Array
    {
      //桁揃えしたものをパターンに変換
      var i:int;
      var len:int = baseInts.length;
      var digit:int = cnt.toString(2).length;
      var temp:int = (new int(1)) << digit;
      var current:int;
      var ar:Array;
      var pt:Array = new Array();
      for (i = 0; i < len; i++) {
        current = baseInts[i] | temp;//桁揃え
        ar = current.toString(2).substr(1).split("");
        pt.push(ar);
      }
      return pt;
    }
  }
}

/**-----------------------------------------------------
 * Use following BitmapPatternBuilder class
 *
 * DO NOT CHANGE any codes below this comment.
 *
 * -----------------------------------------------------
*/
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Graphics;

class BitmapPatternBuilder{
  /**
   * creates BitmapData filled with dot pattern.
   * First parameter is 2d array that contains color index for each pixels;
   * Second parameter contains color reference table.
   *
   * @parameter pattern:Array 2d array that contains color index for each pixel.
   * @parameter colors:Array 1d array that contains color table.
   * @returns BitmapData
   */
  public static function build(pattern:Array, colors:Array):BitmapData{
    var bitmapW:int = pattern[0].length;
    var bitmapH:int = pattern.length;
    var bmd:BitmapData = new BitmapData(bitmapW,bitmapH,true,0x000000);
    for(var yy:int=0; yy<bitmapH; yy++){
      for(var xx:int=0; xx<bitmapW; xx++){
        var color:int = colors[pattern[yy][xx]];
        bmd.setPixel32(xx, yy, color);
      }
    }
    return bmd;
  }

  /**
   * short cut function for Graphics.beginBitmapFill with pattern.
   */
  public static function beginBitmapFill(pattern:Array, colors:Array, graphics:Graphics):void{
    var bmd:BitmapData = build(pattern, colors);
    graphics.beginBitmapFill(bmd);
    bmd.dispose();
  }
}

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る