※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


FORKED
  1. // forked from soundkitchen's Happy Birthday Koko ;-)
  2. /**
  3.  *  koko さんおたんじょうびおめでとーございまーす :-)
  4.  *  happy birthday な画像を使って happy birthday を作るよ。
  5.  *
  6.  *  @see http://www.flickr.com/groups/happybirthday/
  7.  */
  8. package
  9. {
  10.     import flash.display.Sprite;
  11.     import flash.display.StageAlign;
  12.     import flash.display.StageQuality;
  13.     import flash.display.StageScaleMode;
  14.     import flash.events.Event;
  15.     import com.flashdynamix.utils.SWFProfiler;
  16.     import org.libspark.thread.EnterFrameThreadExecutor;
  17.     import org.libspark.thread.Thread;
  18.     [SWF(width=465, height=465, frameRate=30, backgroundColor=0xFFFFFF)]
  19.     /**
  20.      *  document class.
  21.      */
  22.     public class HappyBirthdayKoko extends Sprite
  23.     {
  24.         /**
  25.          *  constructor.
  26.          */
  27.         public function HappyBirthdayKoko()
  28.         {
  29.             Wonderfl.disable_capture();
  30.             addEventListener(Event.ADDED_TO_STAGE, initialize);
  31.         }
  32.         /**
  33.          *  initialize.
  34.          */
  35.         private function initialize(evt:Event):void
  36.         {
  37.             removeEventListener(Event.ADDED_TO_STAGE, initialize);
  38.             if (!Thread.isReady)
  39.             {
  40.                 //  setup stage.
  41.                 stage.align = StageAlign.TOP_LEFT;
  42.                 stage.quality = StageQuality.HIGH;
  43.                 stage.scaleMode = StageScaleMode.NO_SCALE;
  44.                 //
  45.                 Thread.initialize(new EnterFrameThreadExecutor());
  46.                 //  setup debugger.
  47.                 SWFProfiler.init(this);
  48.             }
  49.             new MainThread(this).start();
  50.         }
  51.     }
  52. }
  53. import flash.display.Bitmap;
  54. import flash.display.BitmapData;
  55. import flash.display.BlendMode;
  56. import flash.display.DisplayObject;
  57. import flash.display.DisplayObjectContainer;
  58. import flash.display.Graphics;
  59. import flash.display.Loader;
  60. import flash.display.PixelSnapping;
  61. import flash.display.Shape;
  62. import flash.display.Sprite;
  63. import flash.display.Stage;
  64. import flash.events.Event;
  65. import flash.events.MouseEvent;
  66. import flash.geom.Matrix;
  67. import flash.net.URLLoader;
  68. import flash.net.URLRequest;
  69. import flash.net.URLVariables;
  70. import flash.text.TextField;
  71. import flash.text.TextFieldAutoSize;
  72. import flash.text.TextFormat;
  73. import flash.system.LoaderContext;
  74. import com.adobe.serialization.json.JSON;
  75. import org.libspark.betweenas3.BetweenAS3;
  76. import org.libspark.betweenas3.easing.*;
  77. import org.libspark.betweenas3.tweens.ITween;
  78. import org.libspark.thread.Monitor;
  79. import org.libspark.thread.Thread;
  80. import org.libspark.thread.threads.display.LoaderThread;
  81. import org.libspark.thread.threads.net.URLLoaderThread;
  82. import org.libspark.thread.threads.tweener.TweenerThread;
  83. import org.libspark.thread.utils.ParallelExecutor;
  84. /**
  85.  *  main thread.
  86.  */
  87. internal class MainThread extends Thread
  88. {
  89.     private var _layer:DisplayObjectContainer;
  90.     private var _jsonLoader:URLLoader;
  91.     /**
  92.      *  constructor.
  93.      */
  94.     public function MainThread(layer:DisplayObjectContainer)
  95.     {
  96.         _layer = layer;
  97.     }
  98.     /**
  99.      *  show waiting message.
  100.      */
  101.     override protected function run():void
  102.     {
  103.         var th:Thread;
  104.         th = new FixBackgroundThread(_layer);
  105.         th.start();
  106.         th = new WaitAnimationThread(_layer);
  107.         th.start();
  108.         th.join();
  109.         next(loadData);
  110.         interrupted(empty);
  111.     }
  112.     /**
  113.      *  laod data from YQL.
  114.      */
  115.     private function loadData():void
  116.     {
  117.         var req:URLRequest,
  118.             data:URLVariables,
  119.             th:Thread;
  120.         _jsonLoader = new URLLoader();
  121.         data = new URLVariables();
  122.         data['format'] = "json";
  123.         data['diagnostics'] = "false";
  124.         data['q'] = "SELECT * FROM flickr.photos.search(50) WHERE group_id = '62402008@N00'";
  125.         req = new URLRequest();
  126.         req.url = "http://query.yahooapis.com/v1/public/yql";
  127.         req.data = data;
  128.         th = new URLLoaderThread(req, _jsonLoader);
  129.         th.start();
  130.         th.join();
  131.         next(animate);
  132.         interrupted(empty);
  133.     }
  134.     /**
  135.      *
  136.      */
  137.     private function animate():void
  138.     {
  139.         var json:Object,
  140.             row:Object,
  141.             urls:Vector.<String>,
  142.             pool:ImagePool,
  143.             tasks:ParallelExecutor;
  144.         json = JSON.decode(_jsonLoader.data);
  145.         urls = new Vector.<String>();
  146.         for each (row in json.query.results.photo)
  147.         {
  148.             urls.push("http://farm" + row.farm + ".static.flickr.com/" +
  149.                       row.server + "/" + row.id + "_" + row.secret + "_s.jpg");
  150.         }
  151.         Wonderfl.capture_delay(5);
  152.         
  153.         pool = new ImagePool();
  154.         tasks = new ParallelExecutor();
  155.         tasks.addThread(new LoadImageThread(urls, pool));
  156.         tasks.addThread(new LoadImageThread(urls, pool));
  157.         tasks.addThread(new LoadImageThread(urls, pool));
  158.         tasks.addThread(new LoadImageThread(urls, pool));
  159.         tasks.addThread(new LoadImageThread(urls, pool));
  160.         tasks.addThread(new LoadImageThread(urls, pool));
  161.         tasks.addThread(new DisplayImageThread(_layer, pool));
  162.         tasks.start();
  163.     }
  164.     /**
  165.      *  empty task.
  166.      */
  167.     private function empty(...args):void
  168.     {
  169.         //  nothing to do.
  170.     }
  171.     /**
  172.      *  finalize the object.
  173.      */
  174.     override protected function finalize():void
  175.     {
  176.         _layer = null;
  177.     }
  178. }
  179. /**
  180.  *
  181.  */
  182. internal class WaitAnimationThread extends Thread
  183. {
  184.     private var _layer:DisplayObjectContainer;
  185.     private var _message:DisplayObject;
  186.     /**
  187.      *
  188.      */
  189.     public function WaitAnimationThread(layer:DisplayObjectContainer)
  190.     {
  191.         _layer = layer;
  192.     }
  193.     /**
  194.      *
  195.      */
  196.     override protected function run():void
  197.     {
  198.         var txt:TextField,
  199.             data:BitmapData,
  200.             stage:Stage;
  201.         stage = _layer.stage;
  202.         txt = new TextField();
  203.         txt.autoSize = TextFieldAutoSize.LEFT;
  204.         txt.defaultTextFormat = new TextFormat("Lucida Grande"36);
  205.         txt.text = "click to start";
  206.         data = new BitmapData(txt.width, txt.height, true0);
  207.         data.draw(txt);
  208.         _message = new Bitmap(data, PixelSnapping.AUTO, true);
  209.         _message.blendMode = BlendMode.INVERT;
  210.         _message.x = (stage.stageWidth - _message.width) >> 1;
  211.         _message.y = (stage.stageHeight - _message.height) >> 1;
  212.         _layer.addChild(_message);
  213.         event(stage, MouseEvent.CLICK, clickHandler);
  214.     }
  215.     private function clickHandler(evt:MouseEvent):void
  216.     {
  217.         var th:Thread;
  218.         th = new HideMessageThread(_message);
  219.         th.start();
  220.     }
  221.     /**
  222.      *
  223.      */
  224.     override protected function finalize():void
  225.     {
  226.         _layer = null;
  227.         _message = null;
  228.     }
  229. }
  230. /**
  231.  *
  232.  */
  233. internal class HideMessageThread extends Thread
  234. {
  235.     private var _message:DisplayObject;
  236.     /**
  237.      *  constructor.
  238.      */
  239.     public function HideMessageThread(message:DisplayObject)
  240.     {
  241.         _message = message;
  242.     }
  243.     /**
  244.      *  hide message.
  245.      */
  246.     override protected function run():void
  247.     {
  248.         var th:Thread;
  249.         th = new TweenerThread(_message, {
  250.             alpha: 0,
  251.             time: 1,
  252.             transition: "easeOutCubic"
  253.         });
  254.         th.start();
  255.         th.join();
  256.         next(complete);
  257.         interrupted(empty);
  258.     }
  259.     /**
  260.      *  remove message from parent.
  261.      */
  262.     private function complete():void
  263.     {
  264.         var parent:DisplayObjectContainer;
  265.         parent = _message.parent;
  266.         if (parent)
  267.             parent.removeChild(_message);
  268.     }
  269.     /**
  270.      *  empty task.
  271.      */
  272.     private function empty(...args):void
  273.     {
  274.         //  do nothing.
  275.     }
  276.     /**
  277.      *  finalize the object.
  278.      */
  279.     override protected function finalize():void
  280.     {
  281.         _message = null;
  282.     }
  283. }
  284. /**
  285.  *  load image from flickr.
  286.  */
  287. internal class LoadImageThread extends Thread
  288. {
  289.     private var _data:Vector.<String>;
  290.     private var _pool:ImagePool;
  291.     private var _loader:Loader;
  292.     /**
  293.      *  constructor.
  294.      */
  295.     public function LoadImageThread(data:Vector.<String>, pool:ImagePool)
  296.     {
  297.         _data = data;
  298.         _pool = pool;
  299.     }
  300.     /**
  301.      *  load image.
  302.      */
  303.     override protected function run():void
  304.     {
  305.         var req:URLRequest,
  306.             ctx:LoaderContext,
  307.             th:Thread;
  308.         if (!_data.length) return;
  309.         _loader = new Loader();
  310.         req = new URLRequest(_data.shift());
  311.         ctx = new LoaderContext(true);
  312.         th = new LoaderThread(req, ctx, _loader);
  313.         th.start();
  314.         th.join();
  315.         next(complete);
  316.         error(Error, failure);
  317.     }
  318.     /**
  319.      *  stack data to queue and rewind.
  320.      */
  321.     private function complete():void
  322.     {
  323.         var data:BitmapData;
  324.         data = new BitmapData(_loader.width, _loader.height, false0);
  325.         data.draw(_loader);
  326.         _pool.offer(data);
  327.         _loader.unload();
  328.         _loader = null;
  329.         next(run);
  330.     }
  331.     /**
  332.      *  error fallback.
  333.      */
  334.     private function failure(e:Error, t:Thread):void
  335.     {
  336.         _loader.unload();
  337.         _loader = null;
  338.         next(run);
  339.     }
  340.     /**
  341.      *  finalize the object.
  342.      */
  343.     override protected function finalize():void
  344.     {
  345.         _data = null;
  346.         _pool = null;
  347.     }
  348. }
  349. /**
  350.  *  show image.
  351.  */
  352. internal class DisplayImageThread extends Thread
  353. {
  354.     private var _layer:DisplayObjectContainer;
  355.     private var _container:Sprite;
  356.     private var _pool:ImagePool;
  357.     private var _map:Vector.<uint>;
  358.     private var _width:uint;
  359.     private var _height:uint;
  360.     private var _index:uint;
  361.     /**
  362.      *  constructor.
  363.      */
  364.     public function DisplayImageThread(layer:DisplayObjectContainer, pool:ImagePool)
  365.     {
  366.         _layer = layer;
  367.         _pool = pool;
  368.         _index = 0;
  369.     }
  370.     /**
  371.      *  create map.
  372.      */
  373.     override protected function run():void
  374.     {
  375.         var i:uint, j:uint,
  376.             l:uint, m:uint,
  377.             txt:TextField,
  378.             map:BitmapData,
  379.             stage:Stage;
  380.         stage = _layer.stage;
  381.         txt = new TextField();
  382.         txt.autoSize = TextFieldAutoSize.LEFT;
  383.         txt.defaultTextFormat = new TextFormat("Arial"18, 0xFFFFFF);//, true);
  384.         txt.text = "Happy\nBirthday\nOyajidonoまる";
  385.         _width = txt.width >> 0;
  386.         _height = txt.height >> 0;
  387.         map = new BitmapData(_width, _height, true0);
  388.         map.draw(txt);
  389.         _map = new Vector.<uint>();
  390.         for (i=0; i<_height; i++)
  391.         {
  392.             for (j=0; j<_width; j++)
  393.             {
  394.                 if (map.getPixel32(j, i))
  395.                 {
  396.                     _map.push(i*_width+j);
  397.                 }
  398.             }
  399.         }
  400.         map.dispose();
  401.         _container = new Sprite();
  402.         _container.transform.matrix = new Matrix(.0800, .08,
  403.                                                  stage.stageWidth>>1,
  404.                                                  stage.stageHeight>>1);
  405.         _layer.addChild(_container);
  406.         next(update);
  407.     }
  408.     private function update():void
  409.     {
  410.         var i:uint,
  411.             data:BitmapData,
  412.             bitmap:Bitmap,
  413.             th:Thread,
  414.             tw:ITween,
  415.             angle:Number,
  416.             strength:Number,
  417.             tx:Number, ty:Number;
  418.         if (_pool.check())
  419.         {
  420.             bitmap = new Bitmap(_pool.pickup());
  421.             i = Math.random() * _map.length >> 0;
  422.             i = _map.splice(i, 1).pop();
  423.             tx = int(i % _width) * bitmap.width - _width * bitmap.width / 2;
  424.             ty = int(i / _width) * bitmap.height - _height * bitmap.height / 2;
  425.             angle = Math.random() * Math.PI * 2;
  426.             strength = Math.random() * 200 / _container.scaleX;
  427.             bitmap.alpha = 0;
  428.             bitmap.x = tx + Math.cos(angle) * strength;
  429.             bitmap.y = ty + Math.sin(angle) * strength;
  430.             bitmap.scaleX = bitmap.scaleY = 2 / _container.scaleX;
  431.             tw = BetweenAS3.serial(
  432.                 BetweenAS3.addChild(bitmap, _container),
  433.                 BetweenAS3.to(bitmap, {
  434.                     x: tx,
  435.                     y: ty,
  436.                     scaleX: 1,
  437.                     scaleY: 1,
  438.                     alpha: 1
  439.                 }, 1.5, Expo.easeIn)
  440.             );
  441.             tw.play();
  442.         }
  443.         next(_map.length ? update : complete);
  444.     }
  445.     private function complete():void
  446.     {
  447.         var tw:ITween;
  448.         tw = BetweenAS3.tween(_container, {
  449.             transform: {
  450.                 colorTransform: {
  451.                     redMultiplier: 5,
  452.                     greenMultiplier: 5,
  453.                     blueMultiplier: 5
  454.                 }
  455.             },
  456.             _glowFilter: {
  457.                 color: 0xFFFFFF,
  458.                 alpha: .5,
  459.                 blurX: 32,
  460.                 blurY: 32
  461.             }
  462.         }, {
  463.             _glowFilter: {
  464.                 color: 0xFFFFFF,
  465.                 alpha: 0,
  466.                 blurX: 0,
  467.                 blurY: 0
  468.             }
  469.         }, 1.6, Cubic.easeIn);
  470.         tw = BetweenAS3.serial(
  471.             BetweenAS3.delay(tw, 1.6),
  472.             BetweenAS3.reverse(tw)
  473.         );
  474.         tw.play();
  475.     }
  476.     /**
  477.      *
  478.      */
  479.     override protected function finalize():void
  480.     {
  481.         _layer = null;
  482.         _container = null;
  483.         _pool = null;
  484.     }
  485. }
  486. /**
  487.  *  fix background layer.
  488.  */
  489. internal class FixBackgroundThread extends Thread
  490. {
  491.     private var _layer:DisplayObjectContainer;
  492.     private var _background:Shape;
  493.     /**
  494.      *  constructor.
  495.      */
  496.     public function FixBackgroundThread(layer:DisplayObjectContainer)
  497.     {
  498.         _layer = layer;
  499.     }
  500.     /**
  501.      *
  502.      */
  503.     override protected function run():void
  504.     {
  505.         _background = new Shape();
  506.         _layer.addChild(_background);
  507.         update();
  508.     }
  509.     private function update():void
  510.     {
  511.         var stage:Stage,
  512.             gr:Graphics;
  513.         stage = _layer.stage;
  514.         if (!stage) return;
  515.         gr = _background.graphics;
  516.         gr.clear();
  517.         gr.beginFill(0);
  518.         gr.drawRect(00, stage.stageWidth, stage.stageHeight);
  519.         gr.endFill();
  520.         event(stage, Event.RESIZE, resizeHandler);
  521.         interrupted(empty);
  522.     }
  523.     private function resizeHandler(evt:Event):void
  524.     {
  525.         update();
  526.     }
  527.     private function empty(...args):void
  528.     {
  529.         //  nothing to do.
  530.     }
  531.     /**
  532.      *  finalize the object.
  533.      */
  534.     override protected function finalize():void
  535.     {
  536.         _layer.removeChild(_background);
  537.         _layer = null;
  538.         _background = null;
  539.     }
  540. }
  541. /**
  542.  *  image pool
  543.  */
  544. internal class ImagePool
  545. {
  546.     private var _pool:Vector.<BitmapData>;
  547.     private var _monitor:Monitor;
  548.     /**
  549.      *  check pool is empty.
  550.      */
  551.     public function get isEmpty():Boolean
  552.     {
  553.         return _pool.length == 0;
  554.     }
  555.     /**
  556.      *  constructor.
  557.      */
  558.     public function ImagePool()
  559.     {
  560.         _pool = new Vector.<BitmapData>();
  561.         _monitor = new Monitor();
  562.     }
  563.     /**
  564.      *  check data available.
  565.      */
  566.     public function check():Boolean
  567.     {
  568.         var f:Boolean = true;
  569.         if (isEmpty)
  570.         {
  571.             f = false;
  572.             _monitor.wait();
  573.         }
  574.         return f;
  575.     }
  576.     /**
  577.      *  pickup image.
  578.      */
  579.     public function pickup():BitmapData
  580.     {
  581.         return _pool[int(Math.random() * _pool.length)];
  582.     }
  583.     /**
  584.      *  stack new data.
  585.      */
  586.     public function offer(data:BitmapData):void
  587.     {
  588.         _pool.push(data);
  589.         _monitor.notifyAll();
  590.     }
  591. }
noswf
  1. // forked from soundkitchen's Happy Birthday Koko ;-)
  2. /**
  3.  *  koko さんおたんじょうびおめでとーございまーす :-)
  4.  *  happy birthday な画像を使って happy birthday を作るよ。
  5.  *
  6.  *  @see http://www.flickr.com/groups/happybirthday/
  7.  */
  8. package
  9. {
  10.     import flash.display.Sprite;
  11.     import flash.display.StageAlign;
  12.     import flash.display.StageQuality;
  13.     import flash.display.StageScaleMode;
  14.     import flash.events.Event;
  15.     import com.flashdynamix.utils.SWFProfiler;
  16.     import org.libspark.thread.EnterFrameThreadExecutor;
  17.     import org.libspark.thread.Thread;
  18.     [SWF(width=465, height=465, frameRate=30, backgroundColor=0x000000)]
  19.     /**
  20.      *  document class.
  21.      */
  22.     public class HappyBirthdayKoko extends Sprite
  23.     {
  24.         /**
  25.          *  constructor.
  26.          */
  27.         public function HappyBirthdayKoko()
  28.         {
  29.             Wonderfl.disable_capture();
  30.             addEventListener(Event.ADDED_TO_STAGE, initialize);
  31.         }
  32.         /**
  33.          *  initialize.
  34.          */
  35.         private function initialize(evt:Event):void
  36.         {
  37.             removeEventListener(Event.ADDED_TO_STAGE, initialize);
  38.             if (!Thread.isReady)
  39.             {
  40.                 //  setup stage.
  41.                 stage.align = StageAlign.TOP_LEFT;
  42.                 stage.quality = StageQuality.HIGH;
  43.                 stage.scaleMode = StageScaleMode.NO_SCALE;
  44.                 //
  45.                 Thread.initialize(new EnterFrameThreadExecutor());
  46.                 //  setup debugger.
  47.                 SWFProfiler.init(this);
  48.             }
  49.             new MainThread(this).start();
  50.         }
  51.     }
  52. }
  53. import flash.display.Bitmap;
  54. import flash.display.BitmapData;
  55. import flash.display.BlendMode;
  56. import flash.display.DisplayObject;
  57. import flash.display.DisplayObjectContainer;
  58. import flash.display.Graphics;
  59. import flash.display.Loader;
  60. import flash.display.PixelSnapping;
  61. import flash.display.Shape;
  62. import flash.display.Sprite;
  63. import flash.display.Stage;
  64. import flash.events.Event;
  65. import flash.events.MouseEvent;
  66. import flash.geom.Matrix;
  67. import flash.net.URLLoader;
  68. import flash.net.URLRequest;
  69. import flash.net.URLVariables;
  70. import flash.text.TextField;
  71. import flash.text.TextFieldAutoSize;
  72. import flash.text.TextFormat;
  73. import flash.system.LoaderContext;
  74. import com.adobe.serialization.json.JSON;
  75. import org.libspark.betweenas3.BetweenAS3;
  76. import org.libspark.betweenas3.easing.*;
  77. import org.libspark.betweenas3.tweens.ITween;
  78. import org.libspark.thread.Monitor;
  79. import org.libspark.thread.Thread;
  80. import org.libspark.thread.threads.display.LoaderThread;
  81. import org.libspark.thread.threads.net.URLLoaderThread;
  82. import org.libspark.thread.threads.tweener.TweenerThread;
  83. import org.libspark.thread.utils.ParallelExecutor;
  84. /**
  85.  *  main thread.
  86.  */
  87. internal class MainThread extends Thread
  88. {
  89.     private var _layer:DisplayObjectContainer;
  90.     private var _jsonLoader:URLLoader;
  91.     /**
  92.      *  constructor.
  93.      */
  94.     public function MainThread(layer:DisplayObjectContainer)
  95.     {
  96.         _layer = layer;
  97.     }
  98.     /**
  99.      *  show waiting message.
  100.      */
  101.     override protected function run():void
  102.     {
  103.         var th:Thread;
  104.         th = new FixBackgroundThread(_layer);
  105.         th.start();
  106.         th = new WaitAnimationThread(_layer);
  107.         th.start();
  108.         th.join();
  109.         next(loadData);
  110.         interrupted(empty);
  111.     }
  112.     /**
  113.      *  laod data from YQL.
  114.      */
  115.     private function loadData():void
  116.     {
  117.         var req:URLRequest,
  118.             data:URLVariables,
  119.             th:Thread;
  120.         _jsonLoader = new URLLoader();
  121.         data = new URLVariables();
  122.         data['format'] = "json";
  123.         data['diagnostics'] = "false";
  124.         data['q'] = "SELECT * FROM flickr.photos.search(50) WHERE group_id = '62402008@N00'";
  125.         req = new URLRequest();
  126.         req.url = "http://query.yahooapis.com/v1/public/yql";
  127.         req.data = data;
  128.         th = new URLLoaderThread(req, _jsonLoader);
  129.         th.start();
  130.         th.join();
  131.         next(animate);
  132.         interrupted(empty);
  133.     }
  134.     /**
  135.      *
  136.      */
  137.     private function animate():void
  138.     {
  139.         var json:Object,
  140.             row:Object,
  141.             urls:Vector.<String>,
  142.             pool:ImagePool,
  143.             tasks:ParallelExecutor;
  144.         json = JSON.decode(_jsonLoader.data);
  145.         urls = new Vector.<String>();
  146.         for each (row in json.query.results.photo)
  147.         {
  148.             urls.push("http://farm" + row.farm + ".static.flickr.com/" +
  149.                       row.server + "/" + row.id + "_" + row.secret + "_s.jpg");
  150.         }
  151.         Wonderfl.capture_delay(5);
  152.         
  153.         pool = new ImagePool();
  154.         tasks = new ParallelExecutor();
  155.         tasks.addThread(new LoadImageThread(urls, pool));
  156.         tasks.addThread(new LoadImageThread(urls, pool));
  157.         tasks.addThread(new LoadImageThread(urls, pool));
  158.         tasks.addThread(new LoadImageThread(urls, pool));
  159.         tasks.addThread(new LoadImageThread(urls, pool));
  160.         tasks.addThread(new LoadImageThread(urls, pool));
  161.         tasks.addThread(new DisplayImageThread(_layer, pool));
  162.         tasks.start();
  163.     }
  164.     /**
  165.      *  empty task.
  166.      */
  167.     private function empty(...args):void
  168.     {
  169.         //  nothing to do.
  170.     }
  171.     /**
  172.      *  finalize the object.
  173.      */
  174.     override protected function finalize():void
  175.     {
  176.         _layer = null;
  177.     }
  178. }
  179. /**
  180.  *
  181.  */
  182. internal class WaitAnimationThread extends Thread
  183. {
  184.     private var _layer:DisplayObjectContainer;
  185.     private var _message:DisplayObject;
  186.     /**
  187.      *
  188.      */
  189.     public function WaitAnimationThread(layer:DisplayObjectContainer)
  190.     {
  191.         _layer = layer;
  192.     }
  193.     /**
  194.      *
  195.      */
  196.     override protected function run():void
  197.     {
  198.         var txt:TextField,
  199.             data:BitmapData,
  200.             stage:Stage;
  201.         stage = _layer.stage;
  202.         txt = new TextField();
  203.         txt.autoSize = TextFieldAutoSize.LEFT;
  204.         txt.defaultTextFormat = new TextFormat("Lucida Grande"36);
  205.         txt.text = "click to start";
  206.         data = new BitmapData(txt.width, txt.height, true0);
  207.         data.draw(txt);
  208.         _message = new Bitmap(data, PixelSnapping.AUTO, true);
  209.         _message.blendMode = BlendMode.INVERT;
  210.         _message.x = (stage.stageWidth - _message.width) >> 1;
  211.         _message.y = (stage.stageHeight - _message.height) >> 1;
  212.         _layer.addChild(_message);
  213.         event(stage, MouseEvent.CLICK, clickHandler);
  214.     }
  215.     private function clickHandler(evt:MouseEvent):void
  216.     {
  217.         var th:Thread;
  218.         th = new HideMessageThread(_message);
  219.         th.start();
  220.     }
  221.     /**
  222.      *
  223.      */
  224.     override protected function finalize():void
  225.     {
  226.         _layer = null;
  227.         _message = null;
  228.     }
  229. }
  230. /**
  231.  *
  232.  */
  233. internal class HideMessageThread extends Thread
  234. {
  235.     private var _message:DisplayObject;
  236.     /**
  237.      *  constructor.
  238.      */
  239.     public function HideMessageThread(message:DisplayObject)
  240.     {
  241.         _message = message;
  242.     }
  243.     /**
  244.      *  hide message.
  245.      */
  246.     override protected function run():void
  247.     {
  248.         var th:Thread;
  249.         th = new TweenerThread(_message, {
  250.             alpha: 0,
  251.             time: 1,
  252.             transition: "easeOutCubic"
  253.         });
  254.         th.start();
  255.         th.join();
  256.         next(complete);
  257.         interrupted(empty);
  258.     }
  259.     /**
  260.      *  remove message from parent.
  261.      */
  262.     private function complete():void
  263.     {
  264.         var parent:DisplayObjectContainer;
  265.         parent = _message.parent;
  266.         if (parent)
  267.             parent.removeChild(_message);
  268.     }
  269.     /**
  270.      *  empty task.
  271.      */
  272.     private function empty(...args):void
  273.     {
  274.         //  do nothing.
  275.     }
  276.     /**
  277.      *  finalize the object.
  278.      */
  279.     override protected function finalize():void
  280.     {
  281.         _message = null;
  282.     }
  283. }
  284. /**
  285.  *  load image from flickr.
  286.  */
  287. internal class LoadImageThread extends Thread
  288. {
  289.     private var _data:Vector.<String>;
  290.     private var _pool:ImagePool;
  291.     private var _loader:Loader;
  292.     /**
  293.      *  constructor.
  294.      */
  295.     public function LoadImageThread(data:Vector.<String>, pool:ImagePool)
  296.     {
  297.         _data = data;
  298.         _pool = pool;
  299.     }
  300.     /**
  301.      *  load image.
  302.      */
  303.     override protected function run():void
  304.     {
  305.         var req:URLRequest,
  306.             ctx:LoaderContext,
  307.             th:Thread;
  308.         if (!_data.length) return;
  309.         _loader = new Loader();
  310.         req = new URLRequest(_data.shift());
  311.         ctx = new LoaderContext(true);
  312.         th = new LoaderThread(req, ctx, _loader);
  313.         th.start();
  314.         th.join();
  315.         next(complete);
  316.         error(Error, failure);
  317.     }
  318.     /**
  319.      *  stack data to queue and rewind.
  320.      */
  321.     private function complete():void
  322.     {
  323.         var data:BitmapData;
  324.         data = new BitmapData(_loader.width, _loader.height, false0);
  325.         data.draw(_loader);
  326.         _pool.offer(data);
  327.         _loader.unload();
  328.         _loader = null;
  329.         next(run);
  330.     }
  331.     /**
  332.      *  error fallback.
  333.      */
  334.     private function failure(e:Error, t:Thread):void
  335.     {
  336.         _loader.unload();
  337.         _loader = null;
  338.         next(run);
  339.     }
  340.     /**
  341.      *  finalize the object.
  342.      */
  343.     override protected function finalize():void
  344.     {
  345.         _data = null;
  346.         _pool = null;
  347.     }
  348. }
  349. /**
  350.  *  show image.
  351.  */
  352. internal class DisplayImageThread extends Thread
  353. {
  354.     private var _layer:DisplayObjectContainer;
  355.     private var _container:Sprite;
  356.     private var _pool:ImagePool;
  357.     private var _map:Vector.<uint>;
  358.     private var _width:uint;
  359.     private var _height:uint;
  360.     private var _index:uint;
  361.     /**
  362.      *  constructor.
  363.      */
  364.     public function DisplayImageThread(layer:DisplayObjectContainer, pool:ImagePool)
  365.     {
  366.         _layer = layer;
  367.         _pool = pool;
  368.         _index = 0;
  369.     }
  370.     /**
  371.      *  create map.
  372.      */
  373.     override protected function run():void
  374.     {
  375.         var i:uint, j:uint,
  376.             l:uint, m:uint,
  377.             txt:TextField,
  378.             map:BitmapData,
  379.             stage:Stage;
  380.         stage = _layer.stage;
  381.         txt = new TextField();
  382.         txt.autoSize = TextFieldAutoSize.LEFT;
  383.         txt.defaultTextFormat = new TextFormat("Arial"18, 0x000000);//, true);
  384.         txt.text = "Happy\nBirthday\nKoko";
  385.         _width = txt.width >> 0;
  386.         _height = txt.height >> 0;
  387.         map = new BitmapData(_width, _height, true0);
  388.         map.draw(txt);
  389.         _map = new Vector.<uint>();
  390.         for (i=0; i<_height; i++)
  391.         {
  392.             for (j=0; j<_width; j++)
  393.             {
  394.                 if (map.getPixel32(j, i))
  395.                 {
  396.                     _map.push(i*_width+j);
  397.                 }
  398.             }
  399.         }
  400.         map.dispose();
  401.         _container = new Sprite();
  402.         _container.transform.matrix = new Matrix(.0800, .08,
  403.                                                  stage.stageWidth>>1,
  404.                                                  stage.stageHeight>>1);
  405.         _layer.addChild(_container);
  406.         next(update);
  407.     }
  408.     private function update():void
  409.     {
  410.         var i:uint,
  411.             data:BitmapData,
  412.             bitmap:Bitmap,
  413.             th:Thread,
  414.             tw:ITween,
  415.             angle:Number,
  416.             strength:Number,
  417.             tx:Number, ty:Number;
  418.         if (_pool.check())
  419.         {
  420.             bitmap = new Bitmap(_pool.pickup());
  421.             i = Math.random() * _map.length >> 0;
  422.             i = _map.splice(i, 1).pop();
  423.             tx = int(i % _width) * bitmap.width - _width * bitmap.width / 2;
  424.             ty = int(i / _width) * bitmap.height - _height * bitmap.height / 2;
  425.             angle = Math.random() * Math.PI * 2;
  426.             strength = Math.random() * 200 / _container.scaleX;
  427.             bitmap.alpha = 0;
  428.             bitmap.x = tx + Math.cos(angle) * strength;
  429.             bitmap.y = ty + Math.sin(angle) * strength;
  430.             bitmap.scaleX = bitmap.scaleY = 2 / _container.scaleX;
  431.             tw = BetweenAS3.serial(
  432.                 BetweenAS3.addChild(bitmap, _container),
  433.                 BetweenAS3.to(bitmap, {
  434.                     x: tx,
  435.                     y: ty,
  436.                     scaleX: 1,
  437.                     scaleY: 1,
  438.                     alpha: 1
  439.                 }, 1.5, Expo.easeIn)
  440.             );
  441.             tw.play();
  442.         }
  443.         next(_map.length ? update : complete);
  444.     }
  445.     private function complete():void
  446.     {
  447.         var tw:ITween;
  448.         tw = BetweenAS3.tween(_container, {
  449.             transform: {
  450.                 colorTransform: {
  451.                     redMultiplier: 5,
  452.                     greenMultiplier: 5,
  453.                     blueMultiplier: 5
  454.                 }
  455.             },
  456.             _glowFilter: {
  457.                 color: 0xFFFFFF,
  458.                 alpha: .5,
  459.                 blurX: 32,
  460.                 blurY: 32
  461.             }
  462.         }, {
  463.             _glowFilter: {
  464.                 color: 0xFFFFFF,
  465.                 alpha: 0,
  466.                 blurX: 0,
  467.                 blurY: 0
  468.             }
  469.         }, 1.6, Cubic.easeIn);
  470.         tw = BetweenAS3.serial(
  471.             BetweenAS3.delay(tw, 1.6),
  472.             BetweenAS3.reverse(tw)
  473.         );
  474.         tw.play();
  475.     }
  476.     /**
  477.      *
  478.      */
  479.     override protected function finalize():void
  480.     {
  481.         _layer = null;
  482.         _container = null;
  483.         _pool = null;
  484.     }
  485. }
  486. /**
  487.  *  fix background layer.
  488.  */
  489. internal class FixBackgroundThread extends Thread
  490. {
  491.     private var _layer:DisplayObjectContainer;
  492.     private var _background:Shape;
  493.     /**
  494.      *  constructor.
  495.      */
  496.     public function FixBackgroundThread(layer:DisplayObjectContainer)
  497.     {
  498.         _layer = layer;
  499.     }
  500.     /**
  501.      *
  502.      */
  503.     override protected function run():void
  504.     {
  505.         _background = new Shape();
  506.         _layer.addChild(_background);
  507.         update();
  508.     }
  509.     private function update():void
  510.     {
  511.         var stage:Stage,
  512.             gr:Graphics;
  513.         stage = _layer.stage;
  514.         if (!stage) return;
  515.         gr = _background.graphics;
  516.         gr.clear();
  517.         gr.beginFill(0);
  518.         gr.drawRect(00, stage.stageWidth, stage.stageHeight);
  519.         gr.endFill();
  520.         event(stage, Event.RESIZE, resizeHandler);
  521.         interrupted(empty);
  522.     }
  523.     private function resizeHandler(evt:Event):void
  524.     {
  525.         update();
  526.     }
  527.     private function empty(...args):void
  528.     {
  529.         //  nothing to do.
  530.     }
  531.     /**
  532.      *  finalize the object.
  533.      */
  534.     override protected function finalize():void
  535.     {
  536.         _layer.removeChild(_background);
  537.         _layer = null;
  538.         _background = null;
  539.     }
  540. }
  541. /**
  542.  *  image pool
  543.  */
  544. internal class ImagePool
  545. {
  546.     private var _pool:Vector.<BitmapData>;
  547.     private var _monitor:Monitor;
  548.     /**
  549.      *  check pool is empty.
  550.      */
  551.     public function get isEmpty():Boolean
  552.     {
  553.         return _pool.length == 0;
  554.     }
  555.     /**
  556.      *  constructor.
  557.      */
  558.     public function ImagePool()
  559.     {
  560.         _pool = new Vector.<BitmapData>();
  561.         _monitor = new Monitor();
  562.     }
  563.     /**
  564.      *  check data available.
  565.      */
  566.     public function check():Boolean
  567.     {
  568.         var f:Boolean = true;
  569.         if (isEmpty)
  570.         {
  571.             f = false;
  572.             _monitor.wait();
  573.         }
  574.         return f;
  575.     }
  576.     /**
  577.      *  pickup image.
  578.      */
  579.     public function pickup():BitmapData
  580.     {
  581.         return _pool[int(Math.random() * _pool.length)];
  582.     }
  583.     /**
  584.      *  stack new data.
  585.      */
  586.     public function offer(data:BitmapData):void
  587.     {
  588.         _pool.push(data);
  589.         _monitor.notifyAll();
  590.     }
  591. }
noswf
  1. // forked from soundkitchen's Happy Birthday Koko ;-)
  2. /**
  3.  *  koko さんおたんじょうびおめでとーございまーす :-)
  4.  *  happy birthday な画像を使って happy birthday を作るよ。
  5.  *
  6.  *  @see http://www.flickr.com/groups/happybirthday/
  7.  */
  8. package
  9. {
  10.     import flash.display.Sprite;
  11.     import flash.display.StageAlign;
  12.     import flash.display.StageQuality;
  13.     import flash.display.StageScaleMode;
  14.     import flash.events.Event;
  15.     import com.flashdynamix.utils.SWFProfiler;
  16.     import org.libspark.thread.EnterFrameThreadExecutor;
  17.     import org.libspark.thread.Thread;
  18.     [SWF(width=465, height=465, frameRate=30, backgroundColor=0x000000)]
  19.     /**
  20.      *  document class.
  21.      */
  22.     public class HappyBirthdayKoko extends Sprite
  23.     {
  24.         /**
  25.          *  constructor.
  26.          */
  27.         public function HappyBirthdayKoko()
  28.         {
  29.             Wonderfl.disable_capture();
  30.             addEventListener(Event.ADDED_TO_STAGE, initialize);
  31.         }
  32.         /**
  33.          *  initialize.
  34.          */
  35.         private function initialize(evt:Event):void
  36.         {
  37.             removeEventListener(Event.ADDED_TO_STAGE, initialize);
  38.             if (!Thread.isReady)
  39.             {
  40.                 //  setup stage.
  41.                 stage.align = StageAlign.TOP_LEFT;
  42.                 stage.quality = StageQuality.HIGH;
  43.                 stage.scaleMode = StageScaleMode.NO_SCALE;
  44.                 //
  45.                 Thread.initialize(new EnterFrameThreadExecutor());
  46.                 //  setup debugger.
  47.                 SWFProfiler.init(this);
  48.             }
  49.             new MainThread(this).start();
  50.         }
  51.     }
  52. }
  53. import flash.display.Bitmap;
  54. import flash.display.BitmapData;
  55. import flash.display.BlendMode;
  56. import flash.display.DisplayObject;
  57. import flash.display.DisplayObjectContainer;
  58. import flash.display.Graphics;
  59. import flash.display.Loader;
  60. import flash.display.PixelSnapping;
  61. import flash.display.Shape;
  62. import flash.display.Sprite;
  63. import flash.display.Stage;
  64. import flash.events.Event;
  65. import flash.events.MouseEvent;
  66. import flash.geom.Matrix;
  67. import flash.net.URLLoader;
  68. import flash.net.URLRequest;
  69. import flash.net.URLVariables;
  70. import flash.text.TextField;
  71. import flash.text.TextFieldAutoSize;
  72. import flash.text.TextFormat;
  73. import flash.system.LoaderContext;
  74. import com.adobe.serialization.json.JSON;
  75. import org.libspark.betweenas3.BetweenAS3;
  76. import org.libspark.betweenas3.easing.*;
  77. import org.libspark.betweenas3.tweens.ITween;
  78. import org.libspark.thread.Monitor;
  79. import org.libspark.thread.Thread;
  80. import org.libspark.thread.threads.display.LoaderThread;
  81. import org.libspark.thread.threads.net.URLLoaderThread;
  82. import org.libspark.thread.threads.tweener.TweenerThread;
  83. import org.libspark.thread.utils.ParallelExecutor;
  84. /**
  85.  *  main thread.
  86.  */
  87. internal class MainThread extends Thread
  88. {
  89.     private var _layer:DisplayObjectContainer;
  90.     private var _jsonLoader:URLLoader;
  91.     /**
  92.      *  constructor.
  93.      */
  94.     public function MainThread(layer:DisplayObjectContainer)
  95.     {
  96.         _layer = layer;
  97.     }
  98.     /**
  99.      *  show waiting message.
  100.      */
  101.     override protected function run():void
  102.     {
  103.         var th:Thread;
  104.         th = new FixBackgroundThread(_layer);
  105.         th.start();
  106.         th = new WaitAnimationThread(_layer);
  107.         th.start();
  108.         th.join();
  109.         next(loadData);
  110.         interrupted(empty);
  111.     }
  112.     /**
  113.      *  laod data from YQL.
  114.      */
  115.     private function loadData():void
  116.     {
  117.         var req:URLRequest,
  118.             data:URLVariables,
  119.             th:Thread;
  120.         _jsonLoader = new URLLoader();
  121.         data = new URLVariables();
  122.         data['format'] = "json";
  123.         data['diagnostics'] = "false";
  124. //        data['q'] = "SELECT * FROM flickr.photos.search(50) WHERE group_id = '62402008@N00'";
  125.         data['q'] = "SELECT * FROM flickr.photos.search(50) WHERE text = 'aiko+nakamura'";
  126.         req = new URLRequest();
  127.         req.url = "http://query.yahooapis.com/v1/public/yql";
  128.         req.data = data;
  129.         th = new URLLoaderThread(req, _jsonLoader);
  130.         th.start();
  131.         th.join();
  132.         next(animate);
  133.         interrupted(empty);
  134.     }
  135.     /**
  136.      *
  137.      */
  138.     private function animate():void
  139.     {
  140.         var json:Object,
  141.             row:Object,
  142.             urls:Vector.<String>,
  143.             pool:ImagePool,
  144.             tasks:ParallelExecutor;
  145.         json = JSON.decode(_jsonLoader.data);
  146.         urls = new Vector.<String>();
  147.         for each (row in json.query.results.photo)
  148.         {
  149.             urls.push("http://farm" + row.farm + ".static.flickr.com/" +
  150.                       row.server + "/" + row.id + "_" + row.secret + "_s.jpg");
  151.         }
  152.         Wonderfl.capture_delay(5);
  153.         
  154.         pool = new ImagePool();
  155.         tasks = new ParallelExecutor();
  156.         tasks.addThread(new LoadImageThread(urls, pool));
  157.         tasks.addThread(new LoadImageThread(urls, pool));
  158.         tasks.addThread(new LoadImageThread(urls, pool));
  159.         tasks.addThread(new LoadImageThread(urls, pool));
  160.         tasks.addThread(new LoadImageThread(urls, pool));
  161.         tasks.addThread(new LoadImageThread(urls, pool));
  162.         tasks.addThread(new DisplayImageThread(_layer, pool));
  163.         tasks.start();
  164.     }
  165.     /**
  166.      *  empty task.
  167.      */
  168.     private function empty(...args):void
  169.     {
  170.         //  nothing to do.
  171.     }
  172.     /**
  173.      *  finalize the object.
  174.      */
  175.     override protected function finalize():void
  176.     {
  177.         _layer = null;
  178.     }
  179. }
  180. /**
  181.  *
  182.  */
  183. internal class WaitAnimationThread extends Thread
  184. {
  185.     private var _layer:DisplayObjectContainer;
  186.     private var _message:DisplayObject;
  187.     /**
  188.      *
  189.      */
  190.     public function WaitAnimationThread(layer:DisplayObjectContainer)
  191.     {
  192.         _layer = layer;
  193.     }
  194.     /**
  195.      *
  196.      */
  197.     override protected function run():void
  198.     {
  199.  /*
  200.         var txt:TextField,
  201.             data:BitmapData,
  202.             stage:Stage;
  203.         stage = _layer.stage;
  204.         txt = new TextField();
  205.         txt.autoSize = TextFieldAutoSize.LEFT;
  206.         txt.defaultTextFormat = new TextFormat("Lucida Grande", 36);
  207.         txt.text = "click to start";
  208.         data = new BitmapData(txt.width, txt.height, true, 0);
  209.         data.draw(txt);
  210.         _message = new Bitmap(data, PixelSnapping.AUTO, true);
  211.         _message.blendMode = BlendMode.INVERT;
  212.         _message.x = (stage.stageWidth - _message.width) >> 1;
  213.         _message.y = (stage.stageHeight - _message.height) >> 1;
  214.         _layer.addChild(_message);
  215.         event(stage, MouseEvent.CLICK, clickHandler);
  216. */
  217.          var th:Thread;
  218.         th = new HideMessageThread(_message);
  219.         th.start();
  220.     }
  221.     private function clickHandler(evt:MouseEvent):void
  222.     {
  223.         var th:Thread;
  224.         th = new HideMessageThread(_message);
  225.         th.start();
  226.     }
  227.     /**
  228.      *
  229.      */
  230.     override protected function finalize():void
  231.     {
  232.         _layer = null;
  233.         _message = null;
  234.     }
  235. }
  236. /**
  237.  *
  238.  */
  239. internal class HideMessageThread extends Thread
  240. {
  241.     private var _message:DisplayObject;
  242.     /**
  243.      *  constructor.
  244.      */
  245.     public function HideMessageThread(message:DisplayObject)
  246.     {
  247.         _message = message;
  248.     }
  249.     /**
  250.      *  hide message.
  251.      */
  252.     override protected function run():void
  253.     {
  254.         var th:Thread;
  255.         th = new TweenerThread(_message, {
  256.             alpha: 0,
  257.             time: 1,
  258.             transition: "easeOutCubic"
  259.         });
  260.         th.start();
  261.         th.join();
  262.         next(complete);
  263.         interrupted(empty);
  264.     }
  265.     /**
  266.      *  remove message from parent.
  267.      */
  268.     private function complete():void
  269.     {
  270.         var parent:DisplayObjectContainer;
  271.         parent = _message.parent;
  272.         if (parent)
  273.             parent.removeChild(_message);
  274.     }
  275.     /**
  276.      *  empty task.
  277.      */
  278.     private function empty(...args):void
  279.     {
  280.         //  do nothing.
  281.     }
  282.     /**
  283.      *  finalize the object.
  284.      */
  285.     override protected function finalize():void
  286.     {
  287.         _message = null;
  288.     }
  289. }
  290. /**
  291.  *  load image from flickr.
  292.  */
  293. internal class LoadImageThread extends Thread
  294. {
  295.     private var _data:Vector.<String>;
  296.     private var _pool:ImagePool;
  297.     private var _loader:Loader;
  298.     /**
  299.      *  constructor.
  300.      */
  301.     public function LoadImageThread(data:Vector.<String>, pool:ImagePool)
  302.     {
  303.         _data = data;
  304.         _pool = pool;
  305.     }
  306.     /**
  307.      *  load image.
  308.      */
  309.     override protected function run():void
  310.     {
  311.         var req:URLRequest,
  312.             ctx:LoaderContext,
  313.             th:Thread;
  314.         if (!_data.length) return;
  315.         _loader = new Loader();
  316.         req = new URLRequest(_data.shift());
  317.         ctx = new LoaderContext(true);
  318.         th = new LoaderThread(req, ctx, _loader);
  319.         th.start();
  320.         th.join();
  321.         next(complete);
  322.         error(Error, failure);
  323.     }
  324.     /**
  325.      *  stack data to queue and rewind.
  326.      */
  327.     private function complete():void
  328.     {
  329.         var data:BitmapData;
  330.         data = new BitmapData(_loader.width, _loader.height, false0);
  331.         data.draw(_loader);
  332.         _pool.offer(data);
  333.         _loader.unload();
  334.         _loader = null;
  335.         next(run);
  336.     }
  337.     /**
  338.      *  error fallback.
  339.      */
  340.     private function failure(e:Error, t:Thread):void
  341.     {
  342.         _loader.unload();
  343.         _loader = null;
  344.         next(run);
  345.     }
  346.     /**
  347.      *  finalize the object.
  348.      */
  349.     override protected function finalize():void
  350.     {
  351.         _data = null;
  352.         _pool = null;
  353.     }
  354. }
  355. /**
  356.  *  show image.
  357.  */
  358. internal class DisplayImageThread extends Thread
  359. {
  360.     private var _layer:DisplayObjectContainer;
  361.     private var _container:Sprite;
  362.     private var _pool:ImagePool;
  363.     private var _map:Vector.<uint>;
  364.     private var _width:uint;
  365.     private var _height:uint;
  366.     private var _index:uint;
  367.     /**
  368.      *  constructor.
  369.      */
  370.     public function DisplayImageThread(layer:DisplayObjectContainer, pool:ImagePool)
  371.     {
  372.         _layer = layer;
  373.         _pool = pool;
  374.         _index = 0;
  375.     }
  376.     /**
  377.      *  create map.
  378.      */
  379.     override protected function run():void
  380.     {
  381.         var i:uint, j:uint,
  382.             l:uint, m:uint,
  383.             txt:TextField,
  384.             map:BitmapData,
  385.             stage:Stage;
  386.         stage = _layer.stage;
  387.         txt = new TextField();
  388.         txt.autoSize = TextFieldAutoSize.LEFT;
  389.         txt.defaultTextFormat = new TextFormat("Arial"18, 0x000000);//, true);
  390.         txt.text = "Happy\nBirthday\naiko";
  391.         _width = txt.width >> 0;
  392.         _height = txt.height >> 0;
  393.         map = new BitmapData(_width, _height, true0);
  394.         map.draw(txt);
  395.         _map = new Vector.<uint>();
  396.         for (i=0; i<_height; i++)
  397.         {
  398.             for (j=0; j<_width; j++)
  399.             {
  400.                 if (map.getPixel32(j, i))
  401.                 {
  402.                     _map.push(i*_width+j);
  403.                 }
  404.             }
  405.         }
  406.         map.dispose();
  407.         _container = new Sprite();
  408.         _container.transform.matrix = new Matrix(.0800, .08,
  409.                                                  stage.stageWidth>>1,
  410.                                                  stage.stageHeight>>1);
  411.         _layer.addChild(_container);
  412.         next(update);
  413.     }
  414.     private function update():void
  415.     {
  416.         var i:uint,
  417.             data:BitmapData,
  418.             bitmap:Bitmap,
  419.             th:Thread,
  420.             tw:ITween,
  421.             angle:Number,
  422.             strength:Number,
  423.             tx:Number, ty:Number;
  424.         if (_pool.check())
  425.         {
  426.             bitmap = new Bitmap(_pool.pickup());
  427.             i = Math.random() * _map.length >> 0;
  428.             i = _map.splice(i, 1).pop();
  429.             tx = int(i % _width) * bitmap.width - _width * bitmap.width / 2;
  430.             ty = int(i / _width) * bitmap.height - _height * bitmap.height / 2;
  431.             angle = Math.random() * Math.PI * 2;
  432.             strength = Math.random() * 200 / _container.scaleX;
  433.             bitmap.alpha = 0;
  434.             bitmap.x = tx + Math.cos(angle) * strength;
  435.             bitmap.y = ty + Math.sin(angle) * strength;
  436.             bitmap.scaleX = bitmap.scaleY = 2 / _container.scaleX;
  437.             tw = BetweenAS3.serial(
  438.                 BetweenAS3.addChild(bitmap, _container),
  439.                 BetweenAS3.to(bitmap, {
  440.                     x: tx,
  441.                     y: ty,
  442.                     scaleX: 1,
  443.                     scaleY: 1,
  444.                     alpha: 1
  445.                 }, 1.5, Expo.easeIn)
  446.             );
  447.             tw.play();
  448.         }
  449.         next(_map.length ? update : complete);
  450.     }
  451.     private function complete():void
  452.     {
  453.         var tw:ITween;
  454.         tw = BetweenAS3.tween(_container, {
  455.             transform: {
  456.                 colorTransform: {
  457.                     redMultiplier: 5,
  458.                     greenMultiplier: 5,
  459.                     blueMultiplier: 5
  460.                 }
  461.             },
  462.             _glowFilter: {
  463.                 color: 0xFFFFFF,
  464.                 alpha: .5,
  465.                 blurX: 32,
  466.                 blurY: 32
  467.             }
  468.         }, {
  469.             _glowFilter: {
  470.                 color: 0xFFFFFF,
  471.                 alpha: 0,
  472.                 blurX: 0,
  473.                 blurY: 0
  474.             }
  475.         }, 1.6, Cubic.easeIn);
  476.         tw = BetweenAS3.serial(
  477.             BetweenAS3.delay(tw, 1.6),
  478.             BetweenAS3.reverse(tw)
  479.         );
  480.         tw.play();
  481.     }
  482.     /**
  483.      *
  484.      */
  485.     override protected function finalize():void
  486.     {
  487.         _layer = null;
  488.         _container = null;
  489.         _pool = null;
  490.     }
  491. }
  492. /**
  493.  *  fix background layer.
  494.  */
  495. internal class FixBackgroundThread extends Thread
  496. {
  497.     private var _layer:DisplayObjectContainer;
  498.     private var _background:Shape;
  499.     /**
  500.      *  constructor.
  501.      */
  502.     public function FixBackgroundThread(layer:DisplayObjectContainer)
  503.     {
  504.         _layer = layer;
  505.     }
  506.     /**
  507.      *
  508.      */
  509.     override protected function run():void
  510.     {
  511.         _background = new Shape();
  512.         _layer.addChild(_background);
  513.         update();
  514.     }
  515.     private function update():void
  516.     {
  517.         var stage:Stage,
  518.             gr:Graphics;
  519.         stage = _layer.stage;
  520.         if (!stage) return;
  521.         gr = _background.graphics;
  522.         gr.clear();
  523.         gr.beginFill(0);
  524.         gr.drawRect(00, stage.stageWidth, stage.stageHeight);
  525.         gr.endFill();
  526.         event(stage, Event.RESIZE, resizeHandler);
  527.         interrupted(empty);
  528.     }
  529.     private function resizeHandler(evt:Event):void
  530.     {
  531.         update();
  532.     }
  533.     private function empty(...args):void
  534.     {
  535.         //  nothing to do.
  536.     }
  537.     /**
  538.      *  finalize the object.
  539.      */
  540.     override protected function finalize():void
  541.     {
  542.         _layer.removeChild(_background);
  543.         _layer = null;
  544.         _background = null;
  545.     }
  546. }
  547. /**
  548.  *  image pool
  549.  */
  550. internal class ImagePool
  551. {
  552.     private var _pool:Vector.<BitmapData>;
  553.     private var _monitor:Monitor;
  554.     /**
  555.      *  check pool is empty.
  556.      */
  557.     public function get isEmpty():Boolean
  558.     {
  559.         return _pool.length == 0;
  560.     }
  561.     /**
  562.      *  constructor.
  563.      */
  564.     public function ImagePool()
  565.     {
  566.         _pool = new Vector.<BitmapData>();
  567.         _monitor = new Monitor();
  568.     }
  569.     /**
  570.      *  check data available.
  571.      */
  572.     public function check():Boolean
  573.     {
  574.         var f:Boolean = true;
  575.         if (isEmpty)
  576.         {
  577.             f = false;
  578.             _monitor.wait();
  579.         }
  580.         return f;
  581.     }
  582.     /**
  583.      *  pickup image.
  584.      */
  585.     public function pickup():BitmapData
  586.     {
  587.         return _pool[int(Math.random() * _pool.length)];
  588.     }
  589.     /**
  590.      *  stack new data.
  591.      */
  592.     public function offer(data:BitmapData):void
  593.     {
  594.         _pool.push(data);
  595.         _monitor.notifyAll();
  596.     }
  597. }
noswf
  1. // forked from soundkitchen's Happy Birthday Koko ;-)
  2. /**
  3.  *  koko さんおたんじょうびおめでとーございまーす :-)
  4.  *  happy birthday な画像を使って happy birthday を作るよ。
  5.  *
  6.  *  @see http://www.flickr.com/groups/happybirthday/
  7.  */
  8. package
  9. {
  10.     import flash.display.Sprite;
  11.     import flash.display.StageAlign;
  12.     import flash.display.StageQuality;
  13.     import flash.display.StageScaleMode;
  14.     import flash.events.Event;
  15.     import com.flashdynamix.utils.SWFProfiler;
  16.     import org.libspark.thread.EnterFrameThreadExecutor;
  17.     import org.libspark.thread.Thread;
  18.     [SWF(width=465, height=465, frameRate=30, backgroundColor=0x000000)]
  19.     /**
  20.      *  document class.
  21.      */
  22.     public class HappyBirthdayKoko extends Sprite
  23.     {
  24.         /**
  25.          *  constructor.
  26.          */
  27.         public function HappyBirthdayKoko()
  28.         {
  29.             Wonderfl.disable_capture();
  30.             addEventListener(Event.ADDED_TO_STAGE, initialize);
  31.         }
  32.         /**
  33.          *  initialize.
  34.          */
  35.         private function initialize(evt:Event):void
  36.         {
  37.             removeEventListener(Event.ADDED_TO_STAGE, initialize);
  38.             if (!Thread.isReady)
  39.             {
  40.                 //  setup stage.
  41.                 stage.align = StageAlign.TOP_LEFT;
  42.                 stage.quality = StageQuality.HIGH;
  43.                 stage.scaleMode = StageScaleMode.NO_SCALE;
  44.                 //
  45.                 Thread.initialize(new EnterFrameThreadExecutor());
  46.                 //  setup debugger.
  47.                 SWFProfiler.init(this);
  48.             }
  49.             new MainThread(this).start();
  50.         }
  51.     }
  52. }
  53. import flash.display.Bitmap;
  54. import flash.display.BitmapData;
  55. import flash.display.BlendMode;
  56. import flash.display.DisplayObject;
  57. import flash.display.DisplayObjectContainer;
  58. import flash.display.Graphics;
  59. import flash.display.Loader;
  60. import flash.display.PixelSnapping;
  61. import flash.display.Shape;
  62. import flash.display.Sprite;
  63. import flash.display.Stage;
  64. import flash.events.Event;
  65. import flash.events.MouseEvent;
  66. import flash.geom.Matrix;
  67. import flash.net.URLLoader;
  68. import flash.net.URLRequest;
  69. import flash.net.URLVariables;
  70. import flash.text.TextField;
  71. import flash.text.TextFieldAutoSize;
  72. import flash.text.TextFormat;
  73. import flash.system.LoaderContext;
  74. import com.adobe.serialization.json.JSON;
  75. import org.libspark.betweenas3.BetweenAS3;
  76. import org.libspark.betweenas3.easing.*;
  77. import org.libspark.betweenas3.tweens.ITween;
  78. import org.libspark.thread.Monitor;
  79. import org.libspark.thread.Thread;
  80. import org.libspark.thread.threads.display.LoaderThread;
  81. import org.libspark.thread.threads.net.URLLoaderThread;
  82. import org.libspark.thread.threads.tweener.TweenerThread;
  83. import org.libspark.thread.utils.ParallelExecutor;
  84. /**
  85.  *  main thread.
  86.  */
  87. internal class MainThread extends Thread
  88. {
  89.     private var _layer:DisplayObjectContainer;
  90.     private var _jsonLoader:URLLoader;
  91.     /**
  92.      *  constructor.
  93.      */
  94.     public function MainThread(layer:DisplayObjectContainer)
  95.     {
  96.         _layer = layer;
  97.     }
  98.     /**
  99.      *  show waiting message.
  100.      */
  101.     override protected function run():void
  102.     {
  103.         var th:Thread;
  104.         th = new FixBackgroundThread(_layer);
  105.         th.start();
  106.         th = new WaitAnimationThread(_layer);
  107.         th.start();
  108.         th.join();
  109.         next(loadData);
  110.         interrupted(empty);
  111.     }
  112.     /**
  113.      *  laod data from YQL.
  114.      */
  115.     private function loadData():void
  116.     {
  117.         var req:URLRequest,
  118.             data:URLVariables,
  119.             th:Thread;
  120.         _jsonLoader = new URLLoader();
  121.         data = new URLVariables();
  122.         data['format'] = "json";
  123.         data['diagnostics'] = "false";
  124.         data['q'] = "SELECT * FROM flickr.photos.search(50) WHERE text = 'aiko+nakamura'";
  125.         req = new URLRequest();
  126.         req.url = "http://query.yahooapis.com/v1/public/yql";
  127. //        req.url = "http://www.aiko-nakamura.com/gallery/";
  128.         req.data = data;
  129.         th = new URLLoaderThread(req, _jsonLoader);
  130.         th.start();
  131.         th.join();
  132.         next(animate);
  133.         interrupted(empty);
  134.     }
  135.     /**
  136.      *
  137.      */
  138.     private function animate():void
  139.     {
  140.         var json:Object,
  141.             row:Object,
  142.             urls:Vector.<String>,
  143.             pool:ImagePool,
  144.             tasks:ParallelExecutor;
  145.         json = JSON.decode(_jsonLoader.data);
  146.         urls = new Vector.<String>();
  147.         for each (row in json.query.results.photo)
  148.         {
  149.             urls.push("http://farm" + row.farm + ".static.flickr.com/" +
  150.                       row.server + "/" + row.id + "_" + row.secret + "_s.jpg");
  151.         }
  152.         Wonderfl.capture_delay(5);
  153.         
  154.         pool = new ImagePool();
  155.         tasks = new ParallelExecutor();
  156.         tasks.addThread(new LoadImageThread(urls, pool));
  157.         tasks.addThread(new LoadImageThread(urls, pool));
  158.         tasks.addThread(new LoadImageThread(urls, pool));
  159.         tasks.addThread(new LoadImageThread(urls, pool));
  160.         tasks.addThread(new LoadImageThread(urls, pool));
  161.         tasks.addThread(new LoadImageThread(urls, pool));
  162.         tasks.addThread(new DisplayImageThread(_layer, pool));
  163.         tasks.start();
  164.     }
  165.     /**
  166.      *  empty task.
  167.      */
  168.     private function empty(...args):void
  169.     {
  170.         //  nothing to do.
  171.     }
  172.     /**
  173.      *  finalize the object.
  174.      */
  175.     override protected function finalize():void
  176.     {
  177.         _layer = null;
  178.     }
  179. }
  180. /**
  181.  *
  182.  */
  183. internal class WaitAnimationThread extends Thread
  184. {
  185.     private var _layer:DisplayObjectContainer;
  186.     private var _message:DisplayObject;
  187.     /**
  188.      *
  189.      */
  190.     public function WaitAnimationThread(layer:DisplayObjectContainer)
  191.     {
  192.         _layer = layer;
  193.     }
  194.     /**
  195.      *
  196.      */
  197.     override protected function run():void
  198.     {
  199.         var txt:TextField,
  200.             data:BitmapData,
  201.             stage:Stage;
  202.         stage = _layer.stage;
  203.         txt = new TextField();
  204.         txt.autoSize = TextFieldAutoSize.LEFT;
  205.         txt.defaultTextFormat = new TextFormat("Lucida Grande"36);
  206.         txt.text = "click to start";
  207.         data = new BitmapData(txt.width, txt.height, true0);
  208.         data.draw(txt);
  209.         _message = new Bitmap(data, PixelSnapping.AUTO, true);
  210.         _message.blendMode = BlendMode.INVERT;
  211.         _message.x = (stage.stageWidth - _message.width) >> 1;
  212.         _message.y = (stage.stageHeight - _message.height) >> 1;
  213.         _layer.addChild(_message);
  214.         event(stage, MouseEvent.CLICK, clickHandler);
  215.     }
  216.     private function clickHandler(evt:MouseEvent):void
  217.     {
  218.         var th:Thread;
  219.         th = new HideMessageThread(_message);
  220.         th.start();
  221.     }
  222.     /**
  223.      *
  224.      */
  225.     override protected function finalize():void
  226.     {
  227.         _layer = null;
  228.         _message = null;
  229.     }
  230. }
  231. /**
  232.  *
  233.  */
  234. internal class HideMessageThread extends Thread
  235. {
  236.     private var _message:DisplayObject;
  237.     /**
  238.      *  constructor.
  239.      */
  240.     public function HideMessageThread(message:DisplayObject)
  241.     {
  242.         _message = message;
  243.     }
  244.     /**
  245.      *  hide message.
  246.      */
  247.     override protected function run():void
  248.     {
  249.         var th:Thread;
  250.         th = new TweenerThread(_message, {
  251.             alpha: 0,
  252.             time: 1,
  253.             transition: "easeOutCubic"
  254.         });
  255.         th.start();
  256.         th.join();
  257.         next(complete);
  258.         interrupted(empty);
  259.     }
  260.     /**
  261.      *  remove message from parent.
  262.      */
  263.     private function complete():void
  264.     {
  265.         var parent:DisplayObjectContainer;
  266.         parent = _message.parent;
  267.         if (parent)
  268.             parent.removeChild(_message);
  269.     }
  270.     /**
  271.      *  empty task.
  272.      */
  273.     private function empty(...args):void
  274.     {
  275.         //  do nothing.
  276.     }
  277.     /**
  278.      *  finalize the object.
  279.      */
  280.     override protected function finalize():void
  281.     {
  282.         _message = null;
  283.     }
  284. }
  285. /**
  286.  *  load image from flickr.
  287.  */
  288. internal class LoadImageThread extends Thread
  289. {
  290.     private var _data:Vector.<String>;
  291.     private var _pool:ImagePool;
  292.     private var _loader:Loader;
  293.     /**
  294.      *  constructor.
  295.      */
  296.     public function LoadImageThread(data:Vector.<String>, pool:ImagePool)
  297.     {
  298.         _data = data;
  299.         _pool = pool;
  300.     }
  301.     /**
  302.      *  load image.
  303.      */
  304.     override protected function run():void
  305.     {
  306.         var req:URLRequest,
  307.             ctx:LoaderContext,
  308.             th:Thread;
  309.         if (!_data.length) return;
  310.         _loader = new Loader();
  311.         req = new URLRequest(_data.shift());
  312.         ctx = new LoaderContext(true);
  313.         th = new LoaderThread(req, ctx, _loader);
  314.         th.start();
  315.         th.join();
  316.         next(complete);
  317.         error(Error, failure);
  318.     }
  319.     /**
  320.      *  stack data to queue and rewind.
  321.      */
  322.     private function complete():void
  323.     {
  324.         var data:BitmapData;
  325.         data = new BitmapData(_loader.width, _loader.height, false0);
  326.         data.draw(_loader);
  327.         _pool.offer(data);
  328.         _loader.unload();
  329.         _loader = null;
  330.         next(run);
  331.     }
  332.     /**
  333.      *  error fallback.
  334.      */
  335.     private function failure(e:Error, t:Thread):void
  336.     {
  337.         _loader.unload();
  338.         _loader = null;
  339.         next(run);
  340.     }
  341.     /**
  342.      *  finalize the object.
  343.      */
  344.     override protected function finalize():void
  345.     {
  346.         _data = null;
  347.         _pool = null;
  348.     }
  349. }
  350. /**
  351.  *  show image.
  352.  */
  353. internal class DisplayImageThread extends Thread
  354. {
  355.     private var _layer:DisplayObjectContainer;
  356.     private var _container:Sprite;
  357.     private var _pool:ImagePool;
  358.     private var _map:Vector.<uint>;
  359.     private var _width:uint;
  360.     private var _height:uint;
  361.     private var _index:uint;
  362.     /**
  363.      *  constructor.
  364.      */
  365.     public function DisplayImageThread(layer:DisplayObjectContainer, pool:ImagePool)
  366.     {
  367.         _layer = layer;
  368.         _pool = pool;
  369.         _index = 0;
  370.     }
  371.     /**
  372.      *  create map.
  373.      */
  374.     override protected function run():void
  375.     {
  376.         var i:uint, j:uint,
  377.             l:uint, m:uint,
  378.             txt:TextField,
  379.             map:BitmapData,
  380.             stage:Stage;
  381.         stage = _layer.stage;
  382.         txt = new TextField();
  383.         txt.autoSize = TextFieldAutoSize.LEFT;
  384.         txt.defaultTextFormat = new TextFormat("Arial"18, 0x000000);//, true);
  385.         txt.text = "Happy\nBirthday\nAiko";
  386.         _width = txt.width >> 0;
  387.         _height = txt.height >> 0;
  388.         map = new BitmapData(_width, _height, true0);
  389.         map.draw(txt);
  390.         _map = new Vector.<uint>();
  391.         for (i=0; i<_height; i++)
  392.         {
  393.             for (j=0; j<_width; j++)
  394.             {
  395.                 if (map.getPixel32(j, i))
  396.                 {
  397.                     _map.push(i*_width+j);
  398.                 }
  399.             }
  400.         }
  401.         map.dispose();
  402.         _container = new Sprite();
  403.         _container.transform.matrix = new Matrix(.0800, .08,
  404.                                                  stage.stageWidth>>1,
  405.                                                  stage.stageHeight>>1);
  406.         _layer.addChild(_container);
  407.         next(update);
  408.     }
  409.     private function update():void
  410.     {
  411.         var i:uint,
  412.             data:BitmapData,
  413.             bitmap:Bitmap,
  414.             th:Thread,
  415.             tw:ITween,
  416.             angle:Number,
  417.             strength:Number,
  418.             tx:Number, ty:Number;
  419.         if (_pool.check())
  420.         {
  421.             bitmap = new Bitmap(_pool.pickup());
  422.             i = Math.random() * _map.length >> 0;
  423.             i = _map.splice(i, 1).pop();
  424.             tx = int(i % _width) * bitmap.width - _width * bitmap.width / 2;
  425.             ty = int(i / _width) * bitmap.height - _height * bitmap.height / 2;
  426.             angle = Math.random() * Math.PI * 2;
  427.             strength = Math.random() * 200 / _container.scaleX;
  428.             bitmap.alpha = 0;
  429.             bitmap.x = tx + Math.cos(angle) * strength;
  430.             bitmap.y = ty + Math.sin(angle) * strength;
  431.             bitmap.scaleX = bitmap.scaleY = 2 / _container.scaleX;
  432.             tw = BetweenAS3.serial(
  433.                 BetweenAS3.addChild(bitmap, _container),
  434.                 BetweenAS3.to(bitmap, {
  435.                     x: tx,
  436.                     y: ty,
  437.                     scaleX: 1,
  438.                     scaleY: 1,
  439.                     alpha: 1
  440.                 }, 1.5, Expo.easeIn)
  441.             );
  442.             tw.play();
  443.         }
  444.         next(_map.length ? update : complete);
  445.     }
  446.     private function complete():void
  447.     {
  448.         var tw:ITween;
  449.         tw = BetweenAS3.tween(_container, {
  450.             transform: {
  451.                 colorTransform: {
  452.                     redMultiplier: 5,
  453.                     greenMultiplier: 5,
  454.                     blueMultiplier: 5
  455.                 }
  456.             },
  457.             _glowFilter: {
  458.                 color: 0xFFFFFF,
  459.                 alpha: .5,
  460.                 blurX: 32,
  461.                 blurY: 32
  462.             }
  463.         }, {
  464.             _glowFilter: {
  465.                 color: 0xFFFFFF,
  466.                 alpha: 0,
  467.                 blurX: 0,
  468.                 blurY: 0
  469.             }
  470.         }, 1.6, Cubic.easeIn);
  471.         tw = BetweenAS3.serial(
  472.             BetweenAS3.delay(tw, 1.6),
  473.             BetweenAS3.reverse(tw)
  474.         );
  475.         tw.play();
  476.     }
  477.     /**
  478.      *
  479.      */
  480.     override protected function finalize():void
  481.     {
  482.         _layer = null;
  483.         _container = null;
  484.         _pool = null;
  485.     }
  486. }
  487. /**
  488.  *  fix background layer.
  489.  */
  490. internal class FixBackgroundThread extends Thread
  491. {
  492.     private var _layer:DisplayObjectContainer;
  493.     private var _background:Shape;
  494.     /**
  495.      *  constructor.
  496.      */
  497.     public function FixBackgroundThread(layer:DisplayObjectContainer)
  498.     {
  499.         _layer = layer;
  500.     }
  501.     /**
  502.      *
  503.      */
  504.     override protected function run():void
  505.     {
  506.         _background = new Shape();
  507.         _layer.addChild(_background);
  508.         update();
  509.     }
  510.     private function update():void
  511.     {
  512.         var stage:Stage,
  513.             gr:Graphics;
  514.         stage = _layer.stage;
  515.         if (!stage) return;
  516.         gr = _background.graphics;
  517.         gr.clear();
  518.         gr.beginFill(0);
  519.         gr.drawRect(00, stage.stageWidth, stage.stageHeight);
  520.         gr.endFill();
  521.         event(stage, Event.RESIZE, resizeHandler);
  522.         interrupted(empty);
  523.     }
  524.     private function resizeHandler(evt:Event):void
  525.     {
  526.         update();
  527.     }
  528.     private function empty(...args):void
  529.     {
  530.         //  nothing to do.
  531.     }
  532.     /**
  533.      *  finalize the object.
  534.      */
  535.     override protected function finalize():void
  536.     {
  537.         _layer.removeChild(_background);
  538.         _layer = null;
  539.         _background = null;
  540.     }
  541. }
  542. /**
  543.  *  image pool
  544.  */
  545. internal class ImagePool
  546. {
  547.     private var _pool:Vector.<BitmapData>;
  548.     private var _monitor:Monitor;
  549.     /**
  550.      *  check pool is empty.
  551.      */
  552.     public function get isEmpty():Boolean
  553.     {
  554.         return _pool.length == 0;
  555.     }
  556.     /**
  557.      *  constructor.
  558.      */
  559.     public function ImagePool()
  560.     {
  561.         _pool = new Vector.<BitmapData>();
  562.         _monitor = new Monitor();
  563.     }
  564.     /**
  565.      *  check data available.
  566.      */
  567.     public function check():Boolean
  568.     {
  569.         var f:Boolean = true;
  570.         if (isEmpty)
  571.         {
  572.             f = false;
  573.             _monitor.wait();
  574.         }
  575.         return f;
  576.     }
  577.     /**
  578.      *  pickup image.
  579.      */
  580.     public function pickup():BitmapData
  581.     {
  582.         return _pool[int(Math.random() * _pool.length)];
  583.     }
  584.     /**
  585.      *  stack new data.
  586.      */
  587.     public function offer(data:BitmapData):void
  588.     {
  589.         _pool.push(data);
  590.         _monitor.notifyAll();
  591.     }
  592. }
noswf
  1. // forked from soundkitchen's Happy Birthday Koko ;-)
  2. /**
  3.  *  koko さんおたんじょうびおめでとーございまーす :-)
  4.  *  happy birthday な画像を使って happy birthday を作るよ。
  5.  *
  6.  *  @see http://www.flickr.com/groups/happybirthday/
  7.  */
  8. package
  9. {
  10.     import flash.display.Sprite;
  11.     import flash.display.StageAlign;
  12.     import flash.display.StageQuality;
  13.     import flash.display.StageScaleMode;
  14.     import flash.events.Event;
  15.     import com.flashdynamix.utils.SWFProfiler;
  16.     import org.libspark.thread.EnterFrameThreadExecutor;
  17.     import org.libspark.thread.Thread;
  18.     [SWF(width=465, height=465, frameRate=30, backgroundColor=0x000000)]
  19.     /**
  20.      *  document class.
  21.      */
  22.     public class HappyBirthdayKoko extends Sprite
  23.     {
  24.         /**
  25.          *  constructor.
  26.          */
  27.         public function HappyBirthdayKoko()
  28.         {
  29.             Wonderfl.disable_capture();
  30.             addEventListener(Event.ADDED_TO_STAGE, initialize);
  31.         }
  32.         /**
  33.          *  initialize.
  34.          */
  35.         private function initialize(evt:Event):void
  36.         {
  37.             removeEventListener(Event.ADDED_TO_STAGE, initialize);
  38.             if (!Thread.isReady)
  39.             {
  40.                 //  setup stage.
  41.                 stage.align = StageAlign.TOP_LEFT;
  42.                 stage.quality = StageQuality.HIGH;
  43.                 stage.scaleMode = StageScaleMode.NO_SCALE;
  44.                 //
  45.                 Thread.initialize(new EnterFrameThreadExecutor());
  46.                 //  setup debugger.
  47.                 SWFProfiler.init(this);
  48.             }
  49.             new MainThread(this).start();
  50.         }
  51.     }
  52. }
  53. import flash.display.Bitmap;
  54. import flash.display.BitmapData;
  55. import flash.display.BlendMode;
  56. import flash.display.DisplayObject;
  57. import flash.display.DisplayObjectContainer;
  58. import flash.display.Graphics;
  59. import flash.display.Loader;
  60. import flash.display.PixelSnapping;
  61. import flash.display.Shape;
  62. import flash.display.Sprite;
  63. import flash.display.Stage;
  64. import flash.events.Event;
  65. import flash.events.MouseEvent;
  66. import flash.geom.Matrix;
  67. import flash.net.URLLoader;
  68. import flash.net.URLRequest;
  69. import flash.net.URLVariables;
  70. import flash.text.TextField;
  71. import flash.text.TextFieldAutoSize;
  72. import flash.text.TextFormat;
  73. import flash.system.LoaderContext;
  74. import com.adobe.serialization.json.JSON;
  75. import org.libspark.betweenas3.BetweenAS3;
  76. import org.libspark.betweenas3.easing.*;
  77. import org.libspark.betweenas3.tweens.ITween;
  78. import org.libspark.thread.Monitor;
  79. import org.libspark.thread.Thread;
  80. import org.libspark.thread.threads.display.LoaderThread;
  81. import org.libspark.thread.threads.net.URLLoaderThread;
  82. import org.libspark.thread.threads.tweener.TweenerThread;
  83. import org.libspark.thread.utils.ParallelExecutor;
  84. /**
  85.  *  main thread.
  86.  */
  87. internal class MainThread extends Thread
  88. {
  89.     private var _layer:DisplayObjectContainer;
  90.     private var _jsonLoader:URLLoader;
  91.     /**
  92.      *  constructor.
  93.      */
  94.     public function MainThread(layer:DisplayObjectContainer)
  95.     {
  96.         _layer = layer;
  97.     }
  98.     /**
  99.      *  show waiting message.
  100.      */
  101.     override protected function run():void
  102.     {
  103.         var th:Thread;
  104.         th = new FixBackgroundThread(_layer);
  105.         th.start();
  106.         th = new WaitAnimationThread(_layer);
  107.         th.start();
  108.         th.join();
  109.         next(loadData);
  110.         interrupted(empty);
  111.     }
  112.     /**
  113.      *  laod data from YQL.
  114.      */
  115.     private function loadData():void
  116.     {
  117.         var req:URLRequest,
  118.             data:URLVariables,
  119.             th:Thread;
  120.         _jsonLoader = new URLLoader();
  121.         data = new URLVariables();
  122.         data['format'] = "json";
  123.         data['diagnostics'] = "false";
  124.         data['q'] = "SELECT * FROM flickr.photos.search(50) WHERE group_id = '62402008@N00'";
  125.         req = new URLRequest();
  126.         req.url = "http://query.aiko-nakamura.com/v1/public/yql";
  127.         req.data = data;
  128.         th = new URLLoaderThread(req, _jsonLoader);
  129.         th.start();
  130.         th.join();
  131.         next(animate);
  132.         interrupted(empty);
  133.     }
  134.     /**
  135.      *
  136.      */
  137.     private function animate():void
  138.     {
  139.         var json:Object,
  140.             row:Object,
  141.             urls:Vector.<String>,
  142.             pool:ImagePool,
  143.             tasks:ParallelExecutor;
  144.         json = JSON.decode(_jsonLoader.data);
  145.         urls = new Vector.<String>();
  146.         for each (row in json.query.results.photo)
  147.         {
  148.             urls.push("http://farm" + row.farm + ".static.flickr.com/" +
  149.                       row.server + "/" + row.id + "_" + row.secret + "_s.jpg");
  150.         }
  151.         Wonderfl.capture_delay(5);
  152.         
  153.         pool = new ImagePool();
  154.         tasks = new ParallelExecutor();
  155.         tasks.addThread(new LoadImageThread(urls, pool));
  156.         tasks.addThread(new LoadImageThread(urls, pool));
  157.         tasks.addThread(new LoadImageThread(urls, pool));
  158.         tasks.addThread(new LoadImageThread(urls, pool));
  159.         tasks.addThread(new LoadImageThread(urls, pool));
  160.         tasks.addThread(new LoadImageThread(urls, pool));
  161.         tasks.addThread(new DisplayImageThread(_layer, pool));
  162.         tasks.start();
  163.     }
  164.     /**
  165.      *  empty task.
  166.      */
  167.     private function empty(...args):void
  168.     {
  169.         //  nothing to do.
  170.     }
  171.     /**
  172.      *  finalize the object.
  173.      */
  174.     override protected function finalize():void
  175.     {
  176.         _layer = null;
  177.     }
  178. }
  179. /**
  180.  *
  181.  */
  182. internal class WaitAnimationThread extends Thread
  183. {
  184.     private var _layer:DisplayObjectContainer;
  185.     private var _message:DisplayObject;
  186.     /**
  187.      *
  188.      */
  189.     public function WaitAnimationThread(layer:DisplayObjectContainer)
  190.     {
  191.         _layer = layer;
  192.     }
  193.     /**
  194.      *
  195.      */
  196.     override protected function run():void
  197.     {
  198.         var txt:TextField,
  199.             data:BitmapData,
  200.             stage:Stage;
  201.         stage = _layer.stage;
  202.         txt = new TextField();
  203.         txt.autoSize = TextFieldAutoSize.LEFT;
  204.         txt.defaultTextFormat = new TextFormat("Lucida Grande"36);
  205.         txt.text = "click to start";
  206.         data = new BitmapData(txt.width, txt.height, true0);
  207.         data.draw(txt);
  208.         _message = new Bitmap(data, PixelSnapping.AUTO, true);
  209.         _message.blendMode = BlendMode.INVERT;
  210.         _message.x = (stage.stageWidth - _message.width) >> 1;
  211.         _message.y = (stage.stageHeight - _message.height) >> 1;
  212.         _layer.addChild(_message);
  213.         event(stage, MouseEvent.CLICK, clickHandler);
  214.     }
  215.     private function clickHandler(evt:MouseEvent):void
  216.     {
  217.         var th:Thread;
  218.         th = new HideMessageThread(_message);
  219.         th.start();
  220.     }
  221.     /**
  222.      *
  223.      */
  224.     override protected function finalize():void
  225.     {
  226.         _layer = null;
  227.         _message = null;
  228.     }
  229. }
  230. /**
  231.  *
  232.  */
  233. internal class HideMessageThread extends Thread
  234. {
  235.     private var _message:DisplayObject;
  236.     /**
  237.      *  constructor.
  238.      */
  239.     public function HideMessageThread(message:DisplayObject)
  240.     {
  241.         _message = message;
  242.     }
  243.     /**
  244.      *  hide message.
  245.      */
  246.     override protected function run():void
  247.     {
  248.         var th:Thread;
  249.         th = new TweenerThread(_message, {
  250.             alpha: 0,
  251.             time: 1,
  252.             transition: "easeOutCubic"
  253.         });
  254.         th.start();
  255.         th.join();
  256.         next(complete);
  257.         interrupted(empty);
  258.     }
  259.     /**
  260.      *  remove message from parent.
  261.      */
  262.     private function complete():void
  263.     {
  264.         var parent:DisplayObjectContainer;
  265.         parent = _message.parent;
  266.         if (parent)
  267.             parent.removeChild(_message);
  268.     }
  269.     /**
  270.      *  empty task.
  271.      */
  272.     private function empty(...args):void
  273.     {
  274.         //  do nothing.
  275.     }
  276.     /**
  277.      *  finalize the object.
  278.      */
  279.     override protected function finalize():void
  280.     {
  281.         _message = null;
  282.     }
  283. }
  284. /**
  285.  *  load image from flickr.
  286.  */
  287. internal class LoadImageThread extends Thread
  288. {
  289.     private var _data:Vector.<String>;
  290.     private var _pool:ImagePool;
  291.     private var _loader:Loader;
  292.     /**
  293.      *  constructor.
  294.      */
  295.     public function LoadImageThread(data:Vector.<String>, pool:ImagePool)
  296.     {
  297.         _data = data;
  298.         _pool = pool;
  299.     }
  300.     /**
  301.      *  load image.
  302.      */
  303.     override protected function run():void
  304.     {
  305.         var req:URLRequest,
  306.             ctx:LoaderContext,
  307.             th:Thread;
  308.         if (!_data.length) return;
  309.         _loader = new Loader();
  310.         req = new URLRequest(_data.shift());
  311.         ctx = new LoaderContext(true);
  312.         th = new LoaderThread(req, ctx, _loader);
  313.         th.start();
  314.         th.join();
  315.         next(complete);
  316.         error(Error, failure);
  317.     }
  318.     /**
  319.      *  stack data to queue and rewind.
  320.      */
  321.     private function complete():void
  322.     {
  323.         var data:BitmapData;
  324.         data = new BitmapData(_loader.width, _loader.height, false0);
  325.         data.draw(_loader);
  326.         _pool.offer(data);
  327.         _loader.unload();
  328.         _loader = null;
  329.         next(run);
  330.     }
  331.     /**
  332.      *  error fallback.
  333.      */
  334.     private function failure(e:Error, t:Thread):void
  335.     {
  336.         _loader.unload();
  337.         _loader = null;
  338.         next(run);
  339.     }
  340.     /**
  341.      *  finalize the object.
  342.      */
  343.     override protected function finalize():void
  344.     {
  345.         _data = null;
  346.         _pool = null;
  347.     }
  348. }
  349. /**
  350.  *  show image.
  351.  */
  352. internal class DisplayImageThread extends Thread
  353. {
  354.     private var _layer:DisplayObjectContainer;
  355.     private var _container:Sprite;
  356.     private var _pool:ImagePool;
  357.     private var _map:Vector.<uint>;
  358.     private var _width:uint;
  359.     private var _height:uint;
  360.     private var _index:uint;
  361.     /**
  362.      *  constructor.
  363.      */
  364.     public function DisplayImageThread(layer:DisplayObjectContainer, pool:ImagePool)
  365.     {
  366.         _layer = layer;
  367.         _pool = pool;
  368.         _index = 0;
  369.     }
  370.     /**
  371.      *  create map.
  372.      */
  373.     override protected function run():void
  374.     {
  375.         var i:uint, j:uint,
  376.             l:uint, m:uint,
  377.             txt:TextField,
  378.             map:BitmapData,
  379.             stage:Stage;
  380.         stage = _layer.stage;
  381.         txt = new TextField();
  382.         txt.autoSize = TextFieldAutoSize.LEFT;
  383.         txt.defaultTextFormat = new TextFormat("Arial"18, 0x000000);//, true);
  384.         txt.text = "Happy\nBirthday\nAiko";
  385.         _width = txt.width >> 0;
  386.         _height = txt.height >> 0;
  387.         map = new BitmapData(_width, _height, true0);
  388.         map.draw(txt);
  389.         _map = new Vector.<uint>();
  390.         for (i=0; i<_height; i++)
  391.         {
  392.             for (j=0; j<_width; j++)
  393.             {
  394.                 if (map.getPixel32(j, i))
  395.                 {
  396.                     _map.push(i*_width+j);
  397.                 }
  398.             }
  399.         }
  400.         map.dispose();
  401.         _container = new Sprite();
  402.         _container.transform.matrix = new Matrix(.0800, .08,
  403.                                                  stage.stageWidth>>1,
  404.                                                  stage.stageHeight>>1);
  405.         _layer.addChild(_container);
  406.         next(update);
  407.     }
  408.     private function update():void
  409.     {
  410.         var i:uint,
  411.             data:BitmapData,
  412.             bitmap:Bitmap,
  413.             th:Thread,
  414.             tw:ITween,
  415.             angle:Number,
  416.             strength:Number,
  417.             tx:Number, ty:Number;
  418.         if (_pool.check())
  419.         {
  420.             bitmap = new Bitmap(_pool.pickup());
  421.             i = Math.random() * _map.length >> 0;
  422.             i = _map.splice(i, 1).pop();
  423.             tx = int(i % _width) * bitmap.width - _width * bitmap.width / 2;
  424.             ty = int(i / _width) * bitmap.height - _height * bitmap.height / 2;
  425.             angle = Math.random() * Math.PI * 2;
  426.             strength = Math.random() * 200 / _container.scaleX;
  427.             bitmap.alpha = 0;
  428.             bitmap.x = tx + Math.cos(angle) * strength;
  429.             bitmap.y = ty + Math.sin(angle) * strength;
  430.             bitmap.scaleX = bitmap.scaleY = 2 / _container.scaleX;
  431.             tw = BetweenAS3.serial(
  432.                 BetweenAS3.addChild(bitmap, _container),
  433.                 BetweenAS3.to(bitmap, {
  434.                     x: tx,
  435.                     y: ty,
  436.                     scaleX: 1,
  437.                     scaleY: 1,
  438.                     alpha: 1
  439.                 }, 1.5, Expo.easeIn)
  440.             );
  441.             tw.play();
  442.         }
  443.         next(_map.length ? update : complete);
  444.     }
  445.     private function complete():void
  446.     {
  447.         var tw:ITween;
  448.         tw = BetweenAS3.tween(_container, {
  449.             transform: {
  450.                 colorTransform: {
  451.                     redMultiplier: 5,
  452.                     greenMultiplier: 5,
  453.                     blueMultiplier: 5
  454.                 }
  455.             },
  456.             _glowFilter: {
  457.                 color: 0xFFFFFF,
  458.                 alpha: .5,
  459.                 blurX: 32,
  460.                 blurY: 32
  461.             }
  462.         }, {
  463.             _glowFilter: {
  464.                 color: 0xFFFFFF,
  465.                 alpha: 0,
  466.                 blurX: 0,
  467.                 blurY: 0
  468.             }
  469.         }, 1.6, Cubic.easeIn);
  470.         tw = BetweenAS3.serial(
  471.             BetweenAS3.delay(tw, 1.6),
  472.             BetweenAS3.reverse(tw)
  473.         );
  474.         tw.play();
  475.     }
  476.     /**
  477.      *
  478.      */
  479.     override protected function finalize():void
  480.     {
  481.         _layer = null;
  482.         _container = null;
  483.         _pool = null;
  484.     }
  485. }
  486. /**
  487.  *  fix background layer.
  488.  */
  489. internal class FixBackgroundThread extends Thread
  490. {
  491.     private var _layer:DisplayObjectContainer;
  492.     private var _background:Shape;
  493.     /**
  494.      *  constructor.
  495.      */
  496.     public function FixBackgroundThread(layer:DisplayObjectContainer)
  497.     {
  498.         _layer = layer;
  499.     }
  500.     /**
  501.      *
  502.      */
  503.     override protected function run():void
  504.     {
  505.         _background = new Shape();
  506.         _layer.addChild(_background);
  507.         update();
  508.     }
  509.     private function update():void
  510.     {
  511.         var stage:Stage,
  512.             gr:Graphics;
  513.         stage = _layer.stage;
  514.         if (!stage) return;
  515.         gr = _background.graphics;
  516.         gr.clear();
  517.         gr.beginFill(0);
  518.         gr.drawRect(00, stage.stageWidth, stage.stageHeight);
  519.         gr.endFill();
  520.         event(stage, Event.RESIZE, resizeHandler);
  521.         interrupted(empty);
  522.     }
  523.     private function resizeHandler(evt:Event):void
  524.     {
  525.         update();
  526.     }
  527.     private function empty(...args):void
  528.     {
  529.         //  nothing to do.
  530.     }
  531.     /**
  532.      *  finalize the object.
  533.      */
  534.     override protected function finalize():void
  535.     {
  536.         _layer.removeChild(_background);
  537.         _layer = null;
  538.         _background = null;
  539.     }
  540. }
  541. /**
  542.  *  image pool
  543.  */
  544. internal class ImagePool
  545. {
  546.     private var _pool:Vector.<BitmapData>;
  547.     private var _monitor:Monitor;
  548.     /**
  549.      *  check pool is empty.
  550.      */
  551.     public function get isEmpty():Boolean
  552.     {
  553.         return _pool.length == 0;
  554.     }
  555.     /**
  556.      *  constructor.
  557.      */
  558.     public function ImagePool()
  559.     {
  560.         _pool = new Vector.<BitmapData>();
  561.         _monitor = new Monitor();
  562.     }
  563.     /**
  564.      *  check data available.
  565.      */
  566.     public function check():Boolean
  567.     {
  568.         var f:Boolean = true;
  569.         if (isEmpty)
  570.         {
  571.             f = false;
  572.             _monitor.wait();
  573.         }
  574.         return f;
  575.     }
  576.     /**
  577.      *  pickup image.
  578.      */
  579.     public function pickup():BitmapData
  580.     {
  581.         return _pool[int(Math.random() * _pool.length)];
  582.     }
  583.     /**
  584.      *  stack new data.
  585.      */
  586.     public function offer(data:BitmapData):void
  587.     {
  588.         _pool.push(data);
  589.         _monitor.notifyAll();
  590.     }
  591. }
noswf
Get Adobe Flash Player