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


forked from : checkmate's Checkmate vol4 Massmedian [diff(571)]

embed

ad

TALK
awww cant see my message :(
at 2009/10/23 04:49:35 by
Sorry. There are impossible word on your message "I <3 pixel tree". It's "<". Because "<" is start tag on htmlText.
at 2009/10/23 09:00:07 by
why not automatically replace to &lt; ?
at 2009/10/23 19:22:29 by
Sorry, I forget :'(
at 2009/10/24 01:30:15 by
i want to know how to do this with normal xml? because i tried but not successful. thanks
at 2009/12/01 14:14:38 by
FORKED
  1. // forked from clockmaker's Xmas Message with Twitter
  2. /**
  3.  * ネットで投稿されたメッセージが
  4.  * クリスマスの夜空を飾ります
  5.  * 
  6.  * クリスマスメッセージは
  7.  * 「Twitter」と「はてなブックマーク」で送ることができます
  8.  * ※追記:11/5(木)、Twitter仕様変更によりTwitter投稿はできなくなりました
  9.  * 
  10.  * ※投稿はFlash内のボタンを押して、
  11.  * Twitterの場合は[]内にコメントを
  12.  * はてなブックマークの場合は、ブックマークコメントを記入下さい
  13.  * 
  14.  * このFlashはwonderfl上の様々なテクニックを元に作られました
  15.  * 
  16.  * Twitter連動
  17.  * http://wonderfl.net/code/04d6d1ae7e943b7faab88623ed83404e7a40c5f7
  18.  * 
  19.  * キラキラ3D
  20.  * http://wonderfl.net/code/c0f513f31389ba07e375331256c2bfa3a8b9006c
  21.  * 
  22.  * 文字のパーティクル化
  23.  * http://wonderfl.net/code/08ec1c2c8da8e9e487867a8e2ab8cddeb75f8986
  24.  * 
  25.  * 木を作る再帰関数
  26.  * http://wonderfl.net/code/00cbe3ecbf0db2e865bc410a8ea54677c19ba4c6 
  27.  * 
  28.  * 配列のシャッフル
  29.  * http://wonderfl.net/code/8cfa39c9e91a268791142fe605c010dc30338588 
  30.  * 
  31.  * BetweenAS3の時間調整
  32.  * http://wonderfl.net/code/59af9d8a3cc45e4c2e6fcf12a9bc9ea55b1576e7
  33.  * 
  34.  */
  35. package {
  36.     import com.bit101.components.Label;
  37.     
  38.     import flash.display.*;
  39.     import flash.events.*;
  40.     import flash.geom.Matrix;
  41.     import flash.net.*;
  42.     import flash.system.*;
  43.     import flash.text.*;
  44.     import flash.utils.*;
  45.     
  46.     import jp.progression.casts.*;
  47.     import jp.progression.commands.lists.LoaderList;
  48.     import jp.progression.commands.lists.SerialList;
  49.     import jp.progression.commands.net.*;
  50.     import jp.progression.data.getResourceById;
  51.     
  52.     import org.libspark.betweenas3.BetweenAS3;
  53.     import org.libspark.betweenas3.easing.*;
  54.     import org.libspark.betweenas3.tweens.ITween;
  55.     import org.papervision3d.cameras.Camera3D;
  56.     import org.papervision3d.core.effects.*;
  57.     import org.papervision3d.core.geom.Pixels;
  58.     import org.papervision3d.core.geom.renderables.Pixel3D;
  59.     import org.papervision3d.core.math.Number3D;
  60.     import org.papervision3d.materials.*;
  61.     import org.papervision3d.objects.DisplayObject3D;
  62.     import org.papervision3d.objects.primitives.*;
  63.     import org.papervision3d.render.BasicRenderEngine;
  64.     import org.papervision3d.scenes.Scene3D;
  65.     import org.papervision3d.view.Viewport3D;
  66.     import org.papervision3d.view.layer.BitmapEffectLayer;
  67.     [SWF(width=465, height=465, frameRate=30, backgroundColor=0)]
  68.     public class Main extends CastDocument {
  69.         //static public const URL_HATENA:String = "http://pipes.yahooapis.com/pipes/pipe.run?_id=a9fa16f111d33689315b50bd196f691e&_render=rss";
  70.         //static public const URL_TWITTER:String = "http://search.twitter.com/search.atom?q=%23XmasMessage&rpp=50";
  71.         //static public const URL_TWITTER:String =  "http://clockmaker.jp/labs/091022_pv3d_xmas/search.atom";
  72.         //static public const URL_IMG_BG:String = "http://clockmaker.jp/labs/091021_checkmate/assets/bg.png";
  73.         //static public const URL_IMG_TITLE:String = "http://clockmaker.jp/labs/091021_checkmate/assets/title.png";
  74.         //static public const URL_IMG_BTN_HATENA:String = "http://clockmaker.jp/labs/091021_checkmate/assets/btn-hatena.png";
  75.         //static public const URL_IMG_BTN_TWITTER:String = "http://clockmaker.jp/labs/091021_checkmate/assets/btn-twitter.png";
  76.         //static private const MAX_PARTICLES:int = 2500;
  77.         // color
  78.         public static const WHITE:uint = 0xFFF0F0F0;
  79.         public static const GREEN:uint = 0xFF008800;
  80.         public static const RED:uint = 0xFFCC0000;
  81.         public static const GOLD:uint = 0xFFFFCC66;
  82.         public static const SILVER:uint = 0xFFCCCCCC;
  83.         public static const COLORS:Array = [WHITE, GREEN, RED, GOLD, SILVER];
  84.         // 3d
  85.         private var scene:Scene3D = new Scene3D();
  86.         private var renderer:BasicRenderEngine = new BasicRenderEngine();
  87.         private var viewport:Viewport3D = new Viewport3D(465465);
  88.         private var camera:Camera3D = new Camera3D()
  89.         // 3d objects
  90.         private const MAX_RADIUS:int = 10000;
  91.         private const PIXCEL_MARGIN:Number = 1.25;
  92.         private var textPixels:Pixels;
  93.         private var treePixels:Pixels;
  94.         private var pixelArr:Array = [];
  95.         private var bfx:BitmapEffectLayer;
  96.         private var dmyObjs:Array = [];
  97.         private var tweens:Array = [];
  98.         // 3d camera
  99.         public var cameraDistance:Number  = 1000;
  100.         public var cameraYaw:Number = 0;
  101.         public var cameraPitch:Number = 0;
  102.         // 2d 
  103.         private var canvas:BitmapData;
  104.         private var mtx:Matrix;
  105.         private var progress:ProgressBar;
  106.         private var loading:Label;
  107.         private var loadingTween:ITween;
  108.         // array of objs
  109.         private var data:Array = [];
  110.         // fractal
  111.         private var level:int = 0;
  112.         // data
  113.         private var index:int = 0;
  114.         private const RESET_TIMER:Timer = new Timer(11 * 1000);
  115.         
  116.         /**
  117.          * Progression 4 では atReady から処理が始まります
  118.          */        
  119.         override protected function atReady() : void{
  120.             stage.quality = StageQuality.MEDIUM;
  121.             
  122.             // 3D
  123.             addChild(viewport);
  124.             
  125.             // progress bar
  126.             progress = new ProgressBar();
  127.             progress.value = 0;
  128.             this.addChild(progress)
  129.             progress.x = int(stage.stageWidth / 2 - progress.width/2);
  130.             progress.y = int(stage.stageHeight / 2 + 10);
  131.             
  132.             // loading
  133.             loading = new Label(this, stage.stageWidth / 2 - 33, stage.stageHeight / 2 - 10"NOW LOADING");
  134.             loadingTween = BetweenAS3.tween(loading, { alpha:1 }, { alpha:0.25 }, 0.05);
  135.             loadingTween = BetweenAS3.serial(loadingTween, BetweenAS3.reverse(loadingTween));
  136.             loadingTween.stopOnComplete = false;
  137.             loadingTween.play();
  138.             
  139.             var context:LoaderContext = new LoaderContext(true);
  140.             var loaderList:LoaderList = new LoaderList(null,
  141.                 new LoadBitmapData(new URLRequest(URL_IMG_BG), {context:context}),
  142.                 new LoadBitmapData(new URLRequest(URL_IMG_TITLE), {context:context}),
  143.                 new LoadURL(new URLRequest(URL_TWITTER), {context:context}),
  144.                 new LoadURL(new URLRequest(URL_HATENA), {context:context}),
  145.                 new LoadBitmapData(new URLRequest(URL_IMG_BTN_HATENA), {context:context}),
  146.                 new LoadBitmapData(new URLRequest(URL_IMG_BTN_TWITTER), {context:context})
  147.                 );
  148.             loaderList.onProgress = function():void{
  149.                 progress.value = 0.5 * (loaderList.loaded / loaderList.numCommands)
  150.             }
  151.             
  152.             new SerialList(null,
  153.                 loaderList,
  154.                 function():void{
  155.                     
  156.                     // Twitter連携 by http://wonderfl.net/code/04d6d1ae7e943b7faab88623ed83404e7a40c5f7 (coppieee)
  157.                     default xml namespace = new Namespace("http://www.w3.org/2005/Atom");
  158.                     var xml:XML = XML(getResourceById(URL_TWITTER).data);
  159.                     for (var i:int = 0; i < xml.entry.length(); i++) {
  160.                         // コメントを抽出
  161.                         var comment:String = scan(xml.entry[i].title,/\[(.+)\]/);
  162.                         // RT は除外
  163.                         if(xml.entry[i].title.indexOf("RT") > -1continue;
  164.                         // コメントなしは除外
  165.                         if(comment == ""continue;
  166.                         // データに追加
  167.                         data.push({
  168.                             img : xml.entry[i].link.(@type == "image/png").@href,
  169.                             name : xml.entry[i].author.name.split(" (")[0],
  170.                             comment : comment
  171.                         });
  172.                     }
  173.                     
  174.                     xml = XML(getResourceById(URL_HATENA).data);
  175.                     
  176.                     for (i = 0; i < xml.channel.item.length(); i++) {
  177.                         if(xml.channel.item[i].description != undefined){
  178.                             comment = xml.channel.item[i].description;
  179.                             var name:String = xml.channel.item[i].title;
  180.                             var imgurl:String = "http://www.st-hatena.com/users/" + name.substr(0,2) + "/" + name + "/profile.gif";
  181.                             data.push({
  182.                                 img : imgurl,
  183.                                 name : name,
  184.                                 comment : comment
  185.                             });
  186.                         }
  187.                     }
  188.                     
  189.                     data = shuffle(data);
  190.                     data = data.slice(08)
  191.                 },
  192.                 init3d
  193.             ).execute();
  194.         }
  195.         /**
  196.          * Papervision3D関係のごにょごにょ 
  197.          */        
  198.         private function init3d():void {
  199.             // カメラの設定
  200.             camera.target = DisplayObject3D.ZERO;
  201.             // ビットマップエフェクトレイヤー
  202.             bfx = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight);
  203.             bfx.addEffect(new BitmapColorEffect(1110.75));
  204.             viewport.containerSprite.addLayer(bfx);
  205.             // ピクセル3D
  206.             textPixels = new Pixels(bfx);
  207.             scene.addChild(textPixels);
  208.             treePixels = new Pixels(bfx);
  209.             scene.addChild(treePixels);
  210.             
  211.             var i:int;
  212.             var arr:Array = [];
  213.             // snow
  214.             var star:Array = [0xFFFFFFFF, 0xFFcccccc, 0xFF666666, 0xFF333333]
  215.             for (i = 0; i < 1500; i++) {
  216.                 treePixels.addPixel3D(new Pixel3D(star[star.length * Math.random() | 0],
  217.                     10000 * (Math.random() - 0.5),
  218.                     10000 * (Math.random()) - 1000,
  219.                     10000 * (Math.random() - 0.5)));
  220.             }
  221.             for (i = 0; i < 255; i++) {
  222.                 treePixels.addPixel3D(new Pixel3D(0xFF0066CC,
  223.                     100 * (Math.floor(i / 15) - 7),
  224.                     -1000,
  225.                     100 * (i % 15 - 7)));
  226.             }
  227.             // ダミーオブジェクトを作成
  228.             for (var k:int = 0; k < data.length; k++) {
  229.                 dmyObjs[k] = new DisplayObject3D();
  230.                 while (true) {
  231.                     var angle:Number = 360 * Math.random();
  232.                     dmyObjs[k].x = 2000 * Math.sin(angle * Number3D.toRADIANS);
  233.                     dmyObjs[k].y = 2000 * (Math.random() - 0.5);
  234.                     dmyObjs[k].z = 2000 * Math.cos(angle * Number3D.toRADIANS);
  235.                     if (k == 0)
  236.                         break;
  237.                     else {
  238.                         if (DisplayObject3D(dmyObjs[k]).distanceTo(dmyObjs[k - 1]) >= 500)
  239.                             break;
  240.                     }
  241.                 }
  242.                 dmyObjs[k].lookAt(DisplayObject3D.ZERO);
  243.                 scene.addChild(dmyObjs[k]);
  244.             }
  245.             for (i = 0; i < MAX_PARTICLES; i++) {
  246.                 var p:Pixel3D = new Pixel3D(COLORS[COLORS.length * Math.random() | 0]);
  247.                 textPixels.addPixel3D(p);
  248.             }
  249.             drawTree(0, -10000100090, GOLD);
  250.             
  251.             loading.text = "NOW RENDERING"
  252.             loading.x = stage.stageWidth / 2 - 39
  253.             var cmd:SerialList = new SerialList();
  254.             var renderIndex:int=0;
  255.             for (i = 0; i < data.length; i++) {
  256.                 cmd.addCommand(
  257.                     function():void{
  258.                         preRenderText(renderIndex);
  259.                         createText(renderIndex);
  260.                         renderIndex ++;
  261.                         
  262.                         progress.value = 0.5 + 0.5 * (renderIndex / data.length);
  263.                     },
  264.                     0.05
  265.                 );
  266.             }
  267.             cmd.addCommand(
  268.                 function():void{
  269.                     // remove loading
  270.                     removeChild(loading);
  271.                     removeChild(progress);
  272.                     loadingTween.stop();
  273.                     loadingTween = null;
  274.                     
  275.                     // ui
  276.                     addChildAt(new CastBitmap(getResourceById(URL_IMG_BG).data), 0);
  277.                     addChild(new CastBitmap(getResourceById(URL_IMG_TITLE).data, "auto"false, {x:20, y:376}));
  278.                     
  279.                     var hatenaBtn:CastButton = new CastButton({x:20, y:433});
  280.                     hatenaBtn.addChild(new Bitmap(getResourceById(URL_IMG_BTN_HATENA).data));
  281.                     hatenaBtn.onCastMouseUp = function():void{
  282.                         navigateToURL(new URLRequest("http://b.hatena.ne.jp/append?http://wonderfl.net/code/d5de28ad1f65364ee33b964101222be41a7320af"));
  283.                     }
  284.                     hatenaBtn.buttonMode = true;
  285.                     addChild(hatenaBtn);
  286.                     
  287.                     var tweetBtn:CastButton = new CastButton({x:240, y:433});
  288.                     tweetBtn.addChild(new Bitmap(getResourceById(URL_IMG_BTN_TWITTER).data));
  289.                     tweetBtn.onCastMouseUp = function():void{
  290.                         navigateToURL(new URLRequest("http://twitter.com/home/?status=" + escapeMultiByte("#XmasMessage [] http://j.mp/xmaswon")));
  291.                     };
  292.                     tweetBtn.buttonMode = true;
  293.                     addChild(tweetBtn);
  294.                     
  295.                     // キラキラロジック by http://wonderfl.net/code/c0f513f31389ba07e375331256c2bfa3a8b9006c (sake)
  296.                     canvas = new BitmapData(720 / 4485 / 4false, 0x000000);
  297.                     var bmp:Bitmap = new Bitmap(canvas, PixelSnapping.NEVER, false);
  298.                     bmp.scaleX = bmp.scaleY = 4;
  299.                     bmp.smoothing = true;
  300.                     bmp.blendMode = BlendMode.ADD;
  301.                     addChildAt(bmp,2);
  302.                     mtx = new Matrix();
  303.                     mtx.scale(0.250.25);
  304.                     // tree
  305.                     drawTree(0, -10000100090, GOLD);
  306.                     // タイマーを作る
  307.                     RESET_TIMER.addEventListener(TimerEvent.TIMER, timerHandler);
  308.                     RESET_TIMER.start();
  309.                     // エンターフレーム
  310.                     addEventListener(Event.ENTER_FRAME, loop);
  311.                 },
  312.                 timerHandler
  313.             );
  314.             cmd.execute();
  315.         }
  316.         private function timerHandler(e:TimerEvent = null):void {
  317.             var i:int;
  318.             var arr:Array = [];
  319.             for (i = 0; i < textPixels.pixels.length; i++) {
  320.                 arr[i] = BetweenAS3.serial(
  321.                     BetweenAS3.delay(
  322.                         BetweenAS3.to(textPixels.pixels[i], getRandomPos(), 3, Expo.easeInOut),
  323.                         Math.random()));
  324.             }
  325.             BetweenAS3.serial(
  326.                 BetweenAS3.parallelTweens(arr),
  327.                 BetweenAS3.func(function():void {
  328.                     setTimeout(motionText, 2 * 1000);
  329.                 })
  330.                 ).play();
  331.             //
  332.             index++;
  333.             if (index == data.length - 1)
  334.                 index = 0;
  335.             //
  336.             var cameraTarget:DisplayObject3D = new DisplayObject3D();
  337.             cameraTarget.copyTransform(dmyObjs[index]);
  338.             cameraTarget.moveBackward(250);
  339.             var dis:Number = cameraTarget.distanceTo(DisplayObject3D.ZERO);
  340.             var rot:Number = Math.atan2(cameraTarget.x, cameraTarget.z);
  341.             
  342.             BetweenAS3.parallel(
  343.                 BetweenAS3.delay(
  344.                     BetweenAS3.bezier(this, {
  345.                         cameraYaw: rot,
  346.                         cameraDistance: dis,
  347.                         cameraPitch: cameraTarget.y
  348.                     }, null, getRandomPos(), 10.5, Expo.easeInOut),
  349.                 1.0) ,
  350.                 BetweenAS3.serial(
  351.                     BetweenAS3.to(camera, {
  352.                         fov: 60
  353.                     }, 4, Sine.easeInOut),
  354.                     BetweenAS3.to(camera, {
  355.                         fov: 50
  356.                     }, 8, Sine.easeInOut)
  357.                     )
  358.                 ).play();
  359.         }
  360.         private var preRenderedTests:Array = [];
  361.         private function preRenderText(itemIndex:int):void {
  362.             preRenderedTests[itemIndex] = [];
  363.             var text:TextField = new TextField();
  364.             text.multiline = true;
  365.             text.autoSize = "left";
  366.             text.htmlText = "<font face='Arial' size='24'>WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW</font>";
  367.             trace(data[itemIndex].comment);
  368.             
  369.             var size:int = 24;
  370.             while(text.textWidth * text.textHeight > MAX_PARTICLES){
  371.                 text.htmlText = "<font face='Arial' size='" + size +"'>" + data[itemIndex].comment + "</font>"
  372. //                                +"<br><font face='Arial' size='" + size / 2 + "'>" + String(data[itemIndex].name).toUpperCase() + "</font>";
  373.                 size--;
  374.             }
  375.             
  376.             var cap:BitmapData = new BitmapData(text.textWidth + 10, text.textHeight, true, 0xFFFFFFFF);
  377.             cap.lock();
  378.             cap.draw(text);
  379.             // particle motion
  380.             var cnt:int = 0;
  381.             for (var i:int = 0; i < text.textWidth + 10; i++) {
  382.                 for (var j:int = 0; j < text.textHeight; j++) {
  383.                     if (cap.getPixel(i, j) == 0xFFFFFF)
  384.                         continue;
  385.                     if(preRenderedTests[itemIndex].length >= MAX_PARTICLES) break
  386.                     preRenderedTests[itemIndex].push({x: i, y: j, textWidth: text.textWidth, textHeight: text.textHeight});
  387.                 }
  388.             }
  389.             cap.unlock();
  390.             cap.dispose();
  391.         }
  392.         /**
  393.          * テキストをBitmapData化してトゥイーンとして作成 
  394.          * @param itemIndex
  395.          */        
  396.         private function createText(itemIndex:int):void {
  397.             var t:DisplayObject3D = dmyObjs[itemIndex];
  398.             // particle motion
  399.             var cnt:int = 0;
  400.             var arr:Array = [];
  401.             for (var i:int = 0; i < preRenderedTests[itemIndex].length; i++) {
  402.                 var pix:Object = preRenderedTests[itemIndex][i];
  403.                 var p:Pixel3D = textPixels.pixels[i];
  404.                 var vec:DisplayObject3D = new DisplayObject3D();
  405.                 vec.x = (pix.x - pix.textWidth / 2) * PIXCEL_MARGIN;
  406.                 vec.y = (pix.textHeight / 2 - pix.y) * PIXCEL_MARGIN;
  407.                 vec.z = 0;
  408.                 vec.transform.calculateMultiply(t.transform, vec.transform);
  409.                 arr[i] = BetweenAS3.bezier(p, {
  410.                         x: vec.x,
  411.                         y: vec.y,
  412.                         z: vec.z
  413.                     }, null, getRandomPos(), 1.2 + Math.random() * 0.25 + i * 0.002, Expo.easeOut);
  414.             }
  415.             tweens.push(arr);
  416.         }
  417.         private function motionText():void {
  418.             var tw:ITween = BetweenAS3.parallelTweens(tweens[index]);
  419.             // トゥイーンのデュレーションを調整
  420.             tw = BetweenAS3.scale(tw, 3.5 / tw.duration);
  421.             tw.play();
  422.         }
  423.         /**
  424.          * エンターフレームイベント 
  425.          */        
  426.         private function loop(e:Event = null):void {
  427.             // カメラ
  428.             camera.x = cameraDistance * Math.sin(cameraYaw);
  429.             camera.y = cameraPitch;
  430.             camera.z = cameraDistance * Math.cos(cameraYaw);
  431.             
  432.             // レンダリング
  433.             renderer.renderScene(scene, camera, viewport);
  434.             
  435.             // キラキラ
  436.             canvas.fillRect(canvas.rect, 0x000000);
  437.             canvas.draw(viewport, mtx);
  438.         }
  439.         private function getRandomPos():Object {
  440.             return {
  441.                     x: MAX_RADIUS * (Math.random() - 0.5),
  442.                     y: MAX_RADIUS * (Math.random() - 0.5),
  443.                     z: MAX_RADIUS * (Math.random() - 0.5)
  444.                 };
  445.         }
  446.         /**
  447.          * 木を作る再帰関数
  448.          * http://wonderfl.net/code/00cbe3ecbf0db2e865bc410a8ea54677c19ba4c6 
  449.          * @param x
  450.          * @param y
  451.          * @param z
  452.          * @param length
  453.          * @param angle
  454.          * @param cf
  455.          * 
  456.          */
  457.         private function drawTree(x:Number, y:Number, z:Number, length:Number, angle:Number, cf:int):void {
  458.             level += 1;
  459.             var destx:Number = x + length * Math.cos(angle * (Math.PI / 180));
  460.             var desty:Number = y + length * Math.sin(angle * (Math.PI / 180));
  461.             var destz:Number = z + length * (Math.random() - 0.5) * 2;
  462.             if (Math.random() < 0.5)
  463.                 cf = COLORS[COLORS.length * Math.random() | 0];
  464.             var max:int = 10 - level / 1.5;
  465.             for (var i:int = 0; i < max; i++) {
  466.                 treePixels.addPixel3D(new Pixel3D(cf,
  467.                     destx * i / max + x * (max - i) / max,
  468.                     desty * i / max + y * (max - i) / max,
  469.                     destz * i / max + z * (max - i) / max
  470.                     ));
  471.             }
  472.             if (level < 6) {
  473.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  474.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  475.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  476.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  477.             }
  478.             level -= 1;
  479.         }
  480.         
  481.         /**
  482.          * 1行でArrayをシャッフルする by nemu90kWw
  483.          * http://wonderfl.net/code/8cfa39c9e91a268791142fe605c010dc30338588 
  484.          */        
  485.         public function shuffle(array:Array):Array{
  486.             return array.sort(function():int{return int(Math.random()*3)-1});
  487.         }
  488.         
  489.         /**
  490.          * @see http://takumakei.blogspot.com/2009/05/actionscriptrubystringscan.html
  491.          */ 
  492.         //package com.blogspot.takumakei.utils
  493.         //{
  494.         //public
  495.         public function scan(str:String, re:RegExp):Array
  496.         {
  497.             if(!re.global){
  498.                 var flags:String = 'g';
  499.                 
  500.                 if(re.dotall)
  501.                     flags += 's';
  502.                 if(re.multiline)
  503.                     flags += 'm';
  504.                 if(re.ignoreCase)
  505.                     flags += 'i';
  506.                 if(re.extended)
  507.                     flags += 'x';
  508.                 re = new RegExp(re.source, flags);                    
  509.             }
  510.             var r:Array = [];
  511.             var m:Array = re.exec(str);
  512.             while(null != m){
  513.                 if(1 == m.length)
  514.                     r.push(m[0]);
  515.                 else
  516.                     r.push(m.slice(1, m.length));
  517.                 m = re.exec(str);
  518.             }
  519.             return r;
  520.         }
  521.         //}
  522.     }
  523. }
  524. import flash.display.*;
  525. class ProgressBar extends Sprite {
  526.     private var edge:Sprite = new Sprite;
  527.     private var cont:Sprite = new Sprite;
  528.     
  529.     private var _value:Number = 0;
  530.     
  531.     public function set value(v:Number):void {
  532.         _value = v;
  533.         cont.scaleX = _value;
  534.     }
  535.     
  536.     public function get value():Number {
  537.         return _value;
  538.     }
  539.     
  540.     public function ProgressBar() {
  541.         edge.graphics.lineStyle(1, 0xFFFFFF);
  542.         edge.graphics.drawRect(0.50.510010);
  543.         
  544.         cont.graphics.beginFill(0x555555);
  545.         cont.graphics.drawRect(0010010);
  546.         
  547.         addChild(cont);
  548.         addChild(edge);
  549.         
  550.         value = 0;
  551.     }
  552. }
noswf

Xmas Message with Twitter [PV3D] Xmas Tree [diff(517)]

  1. package {
  2.     import flash.display.*;
  3.     import flash.events.*;
  4.     import flash.geom.*;
  5.     import flash.utils.getTimer;
  6.     
  7.     import org.papervision3d.core.effects.BitmapColorEffect;
  8.     import org.papervision3d.core.geom.Pixels;
  9.     import org.papervision3d.core.geom.renderables.Pixel3D;
  10.     import org.papervision3d.materials.WireframeMaterial;
  11.     import org.papervision3d.objects.primitives.Plane;
  12.     import org.papervision3d.view.BasicView;
  13.     import org.papervision3d.view.layer.BitmapEffectLayer;
  14.     [SWF(width=465, height=465, frameRate=60)]
  15.     public class Tree extends BasicView {
  16.         private var level:int = 0;
  17.         private var rot:Number = 0;
  18.         private var treePixels:Pixels;
  19.         private var canvas:BitmapData;
  20.         private var mtx:Matrix;
  21.         
  22.         public static const WHITE:uint = 0xFFF0F0F0;
  23.         public static const GREEN:uint = 0xFF008800;
  24.         public static const RED:uint = 0xFFCC0000;
  25.         public static const GOLD:uint = 0xFFFFCC66;
  26.         public static const SILVER:uint = 0xFFCCCCCC;
  27.         public static const COLORS:Array = [WHITE, GREEN, RED, GOLD, SILVER];
  28.         
  29.         /**
  30.         * コンストラクタ
  31.         */ 
  32.         public function Tree() {
  33.             stage.quality = StageQuality.MEDIUM;
  34.             opaqueBackground = 0;
  35.             
  36.             var bfx:BitmapEffectLayer = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight);
  37.             bfx.addEffect(new BitmapColorEffect(1110.75));
  38.             viewport.containerSprite.addLayer(bfx);
  39.             treePixels = new Pixels(bfx);
  40.             scene.addChild(treePixels);
  41.             // tree
  42.             drawTree(0, -1000050090, GOLD);
  43.             // snow
  44.             for(var i:int=0; i< 300; i++){
  45.                 var pix:Pixel3D = new Pixel3D(0xFFFFFFFF,
  46.                     10000 * (Math.random() - 0.5),
  47.                     10000 * (Math.random() - 0.5),
  48.                     10000 * (Math.random() - 0.5));
  49.                 treePixels.addPixel3D(pix);
  50.             }
  51.             
  52.             // earth
  53.             var p:Plane = new Plane(new WireframeMaterial(0x222222), 5000500088);
  54.             p.rotationX = 90;
  55.             p.y = -1000;
  56.             scene.addChild(p);
  57.             
  58.             // kira kira
  59.             canvas = new BitmapData(465 / 4465 / 4false, 0x000000);
  60.             var bmp:Bitmap = new Bitmap(canvas, PixelSnapping.NEVER, false);
  61.             bmp.scaleX = bmp.scaleY = 4;
  62.             bmp.smoothing = true;
  63.             bmp.blendMode = BlendMode.ADD;
  64.             addChild(bmp);
  65.             
  66.             mtx = new Matrix();
  67.             mtx.scale(0.250.25);
  68.             // render
  69.             startRendering();
  70.             addEventListener(Event.ENTER_FRAME, loop);
  71.         }
  72.         
  73.         /**
  74.         * 再帰関数で木の枝を作っていく
  75.         */
  76.         private function drawTree(x:Number, y:Number, z:Number, length:Number, angle:Number, cf:int):void {
  77.             level += 1;
  78.             var destx:Number = x + length * Math.cos(angle * (Math.PI / 180));
  79.             var desty:Number = y + length * Math.sin(angle * (Math.PI / 180));
  80.             var destz:Number = z + length * (Math.random() - 0.5) * 2;
  81.             if (Math.random() < 0.5)
  82.                 cf = COLORS[COLORS.length * Math.random() | 0];
  83.             var max:int = 8 - level / 2;
  84.             for (var i:int = 0; i < max; i++) {
  85.                 treePixels.addPixel3D(new Pixel3D(cf,
  86.                     destx * i / max + x * (max - i) / max,
  87.                     desty * i / max + y * (max - i) / max,
  88.                     destz * i / max + z * (max - i) / max
  89.                     ));
  90.             }
  91.             if (level < 7) {
  92.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  93.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  94.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  95.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  96.             }
  97.             level -= 1;
  98.         }
  99.         
  100.         /**
  101.         * エンターフレーム
  102.         */ 
  103.         private function loop(e:Event):void {
  104.             // camera motion
  105.             rot += (mouseX / stage.stageWidth * 3 * Math.PI - rot) * .1
  106.             camera.x = Math.sin(rot) * 1500;
  107.             camera.z = Math.cos(rot) * 1500;
  108.             camera.y += (mouseY / stage.stageHeight * 3000 - 500 - camera.y) * .05;
  109.             camera.fov = Math.sin(getTimer() / 2000) * 10 + 60;
  110.             
  111.             // kira kira
  112.             canvas.fillRect(canvas.rect, 0x000000);
  113.             canvas.draw(viewport, mtx);
  114.         }
  115.     }
  116. }
noswf
  1. // forked from clockmaker's Xmas Message with Twitter
  2. /**
  3.  * ネットで投稿されたメッセージが
  4.  * クリスマスの夜空を飾ります
  5.  * 
  6.  * クリスマスメッセージは
  7.  * 「Twitter」と「はてなブックマーク」で送ることができます
  8.  * ※追記:11/5(木)、Twitter仕様変更によりTwitter投稿はできなくなりました
  9.  * 
  10.  * ※投稿はFlash内のボタンを押して、
  11.  * Twitterの場合は[]内にコメントを
  12.  * はてなブックマークの場合は、ブックマークコメントを記入下さい
  13.  * 
  14.  * このFlashはwonderfl上の様々なテクニックを元に作られました
  15.  * 
  16.  * Twitter連動
  17.  * http://wonderfl.net/code/04d6d1ae7e943b7faab88623ed83404e7a40c5f7
  18.  * 
  19.  * キラキラ3D
  20.  * http://wonderfl.net/code/c0f513f31389ba07e375331256c2bfa3a8b9006c
  21.  * 
  22.  * 文字のパーティクル化
  23.  * http://wonderfl.net/code/08ec1c2c8da8e9e487867a8e2ab8cddeb75f8986
  24.  * 
  25.  * 木を作る再帰関数
  26.  * http://wonderfl.net/code/00cbe3ecbf0db2e865bc410a8ea54677c19ba4c6 
  27.  * 
  28.  * 配列のシャッフル
  29.  * http://wonderfl.net/code/8cfa39c9e91a268791142fe605c010dc30338588 
  30.  * 
  31.  * BetweenAS3の時間調整
  32.  * http://wonderfl.net/code/59af9d8a3cc45e4c2e6fcf12a9bc9ea55b1576e7
  33.  * 
  34.  */
  35. package {
  36.     import com.bit101.components.Label;
  37.     
  38.     import flash.display.*;
  39.     import flash.events.*;
  40.     import flash.geom.Matrix;
  41.     import flash.net.*;
  42.     import flash.system.*;
  43.     import flash.text.*;
  44.     import flash.utils.*;
  45.     
  46.     import jp.progression.casts.*;
  47.     import jp.progression.commands.lists.LoaderList;
  48.     import jp.progression.commands.lists.SerialList;
  49.     import jp.progression.commands.net.*;
  50.     import jp.progression.data.getResourceById;
  51.     
  52.     import org.libspark.betweenas3.BetweenAS3;
  53.     import org.libspark.betweenas3.easing.*;
  54.     import org.libspark.betweenas3.tweens.ITween;
  55.     import org.papervision3d.cameras.Camera3D;
  56.     import org.papervision3d.core.effects.*;
  57.     import org.papervision3d.core.geom.Pixels;
  58.     import org.papervision3d.core.geom.renderables.Pixel3D;
  59.     import org.papervision3d.core.math.Number3D;
  60.     import org.papervision3d.materials.*;
  61.     import org.papervision3d.objects.DisplayObject3D;
  62.     import org.papervision3d.objects.primitives.*;
  63.     import org.papervision3d.render.BasicRenderEngine;
  64.     import org.papervision3d.scenes.Scene3D;
  65.     import org.papervision3d.view.Viewport3D;
  66.     import org.papervision3d.view.layer.BitmapEffectLayer;
  67.     [SWF(width=465, height=465, frameRate=30, backgroundColor=0)]
  68.     public class Main extends CastDocument {
  69.         static public const URL_HATENA:String = "http://pipes.yahooapis.com/pipes/pipe.run?_id=a9fa16f111d33689315b50bd196f691e&_render=rss";
  70.         //static public const URL_TWITTER:String = "http://search.twitter.com/search.atom?q=%23XmasMessage&rpp=50";
  71.         static public const URL_TWITTER:String =  "http://clockmaker.jp/labs/091022_pv3d_xmas/search.atom";
  72.         static public const URL_IMG_BG:String = "http://clockmaker.jp/labs/091021_checkmate/assets/bg.png";
  73.         static public const URL_IMG_TITLE:String = "http://clockmaker.jp/labs/091021_checkmate/assets/title.png";
  74.         static public const URL_IMG_BTN_HATENA:String = "http://clockmaker.jp/labs/091021_checkmate/assets/btn-hatena.png";
  75.         static public const URL_IMG_BTN_TWITTER:String = "http://clockmaker.jp/labs/091021_checkmate/assets/btn-twitter.png";
  76.         static private const MAX_PARTICLES:int = 2500;
  77.         // color
  78.         public static const WHITE:uint = 0xFFF0F0F0;
  79.         public static const GREEN:uint = 0xFF008800;
  80.         public static const RED:uint = 0xFFCC0000;
  81.         public static const GOLD:uint = 0xFFFFCC66;
  82.         public static const SILVER:uint = 0xFFCCCCCC;
  83.         public static const COLORS:Array = [WHITE, GREEN, RED, GOLD, SILVER];
  84.         // 3d
  85.         private var scene:Scene3D = new Scene3D();
  86.         private var renderer:BasicRenderEngine = new BasicRenderEngine();
  87.         private var viewport:Viewport3D = new Viewport3D(465465);
  88.         private var camera:Camera3D = new Camera3D()
  89.         // 3d objects
  90.         private const MAX_RADIUS:int = 10000;
  91.         private const PIXCEL_MARGIN:Number = 1.25;
  92.         private var textPixels:Pixels;
  93.         private var treePixels:Pixels;
  94.         private var pixelArr:Array = [];
  95.         private var bfx:BitmapEffectLayer;
  96.         private var dmyObjs:Array = [];
  97.         private var tweens:Array = [];
  98.         // 3d camera
  99.         public var cameraDistance:Number  = 1000;
  100.         public var cameraYaw:Number = 0;
  101.         public var cameraPitch:Number = 0;
  102.         // 2d 
  103.         private var canvas:BitmapData;
  104.         private var mtx:Matrix;
  105.         private var progress:ProgressBar;
  106.         private var loading:Label;
  107.         private var loadingTween:ITween;
  108.         // array of objs
  109.         private var data:Array = [];
  110.         // fractal
  111.         private var level:int = 0;
  112.         // data
  113.         private var index:int = 0;
  114.         private const RESET_TIMER:Timer = new Timer(11 * 1000);
  115.         
  116.         /**
  117.          * Progression 4 では atReady から処理が始まります
  118.          */        
  119.         override protected function atReady() : void{
  120.             stage.quality = StageQuality.MEDIUM;
  121.             
  122.             // 3D
  123.             addChild(viewport);
  124.             
  125.             // progress bar
  126.             progress = new ProgressBar();
  127.             progress.value = 0;
  128.             this.addChild(progress)
  129.             progress.x = int(stage.stageWidth / 2 - progress.width/2);
  130.             progress.y = int(stage.stageHeight / 2 + 10);
  131.             
  132.             // loading
  133.             loading = new Label(this, stage.stageWidth / 2 - 33, stage.stageHeight / 2 - 10"NOW LOADING");
  134.             loadingTween = BetweenAS3.tween(loading, { alpha:1 }, { alpha:0.25 }, 0.05);
  135.             loadingTween = BetweenAS3.serial(loadingTween, BetweenAS3.reverse(loadingTween));
  136.             loadingTween.stopOnComplete = false;
  137.             loadingTween.play();
  138.             
  139.             var context:LoaderContext = new LoaderContext(true);
  140.             var loaderList:LoaderList = new LoaderList(null,
  141.                 new LoadBitmapData(new URLRequest(URL_IMG_BG), {context:context}),
  142.                 new LoadBitmapData(new URLRequest(URL_IMG_TITLE), {context:context}),
  143.                 new LoadURL(new URLRequest(URL_TWITTER), {context:context}),
  144.                 new LoadURL(new URLRequest(URL_HATENA), {context:context}),
  145.                 new LoadBitmapData(new URLRequest(URL_IMG_BTN_HATENA), {context:context}),
  146.                 new LoadBitmapData(new URLRequest(URL_IMG_BTN_TWITTER), {context:context})
  147.                 );
  148.             loaderList.onProgress = function():void{
  149.                 progress.value = 0.5 * (loaderList.loaded / loaderList.numCommands)
  150.             }
  151.             
  152.             new SerialList(null,
  153.                 loaderList,
  154.                 function():void{
  155.                     
  156.                     // Twitter連携 by http://wonderfl.net/code/04d6d1ae7e943b7faab88623ed83404e7a40c5f7 (coppieee)
  157.                     default xml namespace = new Namespace("http://www.w3.org/2005/Atom");
  158.                     var xml:XML = XML(getResourceById(URL_TWITTER).data);
  159.                     for (var i:int = 0; i < xml.entry.length(); i++) {
  160.                         // コメントを抽出
  161.                         var comment:String = scan(xml.entry[i].title,/\[(.+)\]/);
  162.                         // RT は除外
  163.                         if(xml.entry[i].title.indexOf("RT") > -1continue;
  164.                         // コメントなしは除外
  165.                         if(comment == ""continue;
  166.                         // データに追加
  167.                         data.push({
  168.                             img : xml.entry[i].link.(@type == "image/png").@href,
  169.                             name : xml.entry[i].author.name.split(" (")[0],
  170.                             comment : comment
  171.                         });
  172.                     }
  173.                     
  174.                     xml = XML(getResourceById(URL_HATENA).data);
  175.                     
  176.                     for (i = 0; i < xml.channel.item.length(); i++) {
  177.                         if(xml.channel.item[i].description != undefined){
  178.                             comment = xml.channel.item[i].description;
  179.                             var name:String = xml.channel.item[i].title;
  180.                             var imgurl:String = "http://www.st-hatena.com/users/" + name.substr(0,2) + "/" + name + "/profile.gif";
  181.                             data.push({
  182.                                 img : imgurl,
  183.                                 name : name,
  184.                                 comment : comment
  185.                             });
  186.                         }
  187.                     }
  188.                     
  189.                     data = shuffle(data);
  190.                     data = data.slice(08)
  191.                 },
  192.                 init3d
  193.             ).execute();
  194.         }
  195.         /**
  196.          * Papervision3D関係のごにょごにょ 
  197.          */        
  198.         private function init3d():void {
  199.             // カメラの設定
  200.             camera.target = DisplayObject3D.ZERO;
  201.             // ビットマップエフェクトレイヤー
  202.             bfx = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight);
  203.             bfx.addEffect(new BitmapColorEffect(1110.75));
  204.             viewport.containerSprite.addLayer(bfx);
  205.             // ピクセル3D
  206.             textPixels = new Pixels(bfx);
  207.             scene.addChild(textPixels);
  208.             treePixels = new Pixels(bfx);
  209.             scene.addChild(treePixels);
  210.             
  211.             var i:int;
  212.             var arr:Array = [];
  213.             // snow
  214.             var star:Array = [0xFFFFFFFF, 0xFFcccccc, 0xFF666666, 0xFF333333]
  215.             for (i = 0; i < 1500; i++) {
  216.                 treePixels.addPixel3D(new Pixel3D(star[star.length * Math.random() | 0],
  217.                     10000 * (Math.random() - 0.5),
  218.                     10000 * (Math.random()) - 1000,
  219.                     10000 * (Math.random() - 0.5)));
  220.             }
  221.             for (i = 0; i < 255; i++) {
  222.                 treePixels.addPixel3D(new Pixel3D(0xFF0066CC,
  223.                     100 * (Math.floor(i / 15) - 7),
  224.                     -1000,
  225.                     100 * (i % 15 - 7)));
  226.             }
  227.             // ダミーオブジェクトを作成
  228.             for (var k:int = 0; k < data.length; k++) {
  229.                 dmyObjs[k] = new DisplayObject3D();
  230.                 while (true) {
  231.                     var angle:Number = 360 * Math.random();
  232.                     dmyObjs[k].x = 2000 * Math.sin(angle * Number3D.toRADIANS);
  233.                     dmyObjs[k].y = 2000 * (Math.random() - 0.5);
  234.                     dmyObjs[k].z = 2000 * Math.cos(angle * Number3D.toRADIANS);
  235.                     if (k == 0)
  236.                         break;
  237.                     else {
  238.                         if (DisplayObject3D(dmyObjs[k]).distanceTo(dmyObjs[k - 1]) >= 500)
  239.                             break;
  240.                     }
  241.                 }
  242.                 dmyObjs[k].lookAt(DisplayObject3D.ZERO);
  243.                 scene.addChild(dmyObjs[k]);
  244.             }
  245.             for (i = 0; i < MAX_PARTICLES; i++) {
  246.                 var p:Pixel3D = new Pixel3D(COLORS[COLORS.length * Math.random() | 0]);
  247.                 textPixels.addPixel3D(p);
  248.             }
  249.             drawTree(0, -10000100090, GOLD);
  250.             
  251.             loading.text = "NOW RENDERING"
  252.             loading.x = stage.stageWidth / 2 - 39
  253.             var cmd:SerialList = new SerialList();
  254.             var renderIndex:int=0;
  255.             for (i = 0; i < data.length; i++) {
  256.                 cmd.addCommand(
  257.                     function():void{
  258.                         preRenderText(renderIndex);
  259.                         createText(renderIndex);
  260.                         renderIndex ++;
  261.                         
  262.                         progress.value = 0.5 + 0.5 * (renderIndex / data.length);
  263.                     },
  264.                     0.05
  265.                 );
  266.             }
  267.             cmd.addCommand(
  268.                 function():void{
  269.                     // remove loading
  270.                     removeChild(loading);
  271.                     removeChild(progress);
  272.                     loadingTween.stop();
  273.                     loadingTween = null;
  274.                     
  275.                     // ui
  276.                     addChildAt(new CastBitmap(getResourceById(URL_IMG_BG).data), 0);
  277.                     addChild(new CastBitmap(getResourceById(URL_IMG_TITLE).data, "auto"false, {x:20, y:376}));
  278.                     
  279.                     var hatenaBtn:CastButton = new CastButton({x:20, y:433});
  280.                     hatenaBtn.addChild(new Bitmap(getResourceById(URL_IMG_BTN_HATENA).data));
  281.                     hatenaBtn.onCastMouseUp = function():void{
  282.                         navigateToURL(new URLRequest("http://b.hatena.ne.jp/append?http://wonderfl.net/code/d5de28ad1f65364ee33b964101222be41a7320af"));
  283.                     }
  284.                     hatenaBtn.buttonMode = true;
  285.                     addChild(hatenaBtn);
  286.                     
  287.                     var tweetBtn:CastButton = new CastButton({x:240, y:433});
  288.                     tweetBtn.addChild(new Bitmap(getResourceById(URL_IMG_BTN_TWITTER).data));
  289.                     tweetBtn.onCastMouseUp = function():void{
  290.                         navigateToURL(new URLRequest("http://twitter.com/home/?status=" + escapeMultiByte("#XmasMessage [] http://j.mp/xmaswon")));
  291.                     };
  292.                     tweetBtn.buttonMode = true;
  293.                     addChild(tweetBtn);
  294.                     
  295.                     // キラキラロジック by http://wonderfl.net/code/c0f513f31389ba07e375331256c2bfa3a8b9006c (sake)
  296.                     canvas = new BitmapData(720 / 4485 / 4false, 0x000000);
  297.                     var bmp:Bitmap = new Bitmap(canvas, PixelSnapping.NEVER, false);
  298.                     bmp.scaleX = bmp.scaleY = 4;
  299.                     bmp.smoothing = true;
  300.                     bmp.blendMode = BlendMode.ADD;
  301.                     addChildAt(bmp,2);
  302.                     mtx = new Matrix();
  303.                     mtx.scale(0.250.25);
  304.                     // tree
  305.                     drawTree(0, -10000100090, GOLD);
  306.                     // タイマーを作る
  307.                     RESET_TIMER.addEventListener(TimerEvent.TIMER, timerHandler);
  308.                     RESET_TIMER.start();
  309.                     // エンターフレーム
  310.                     addEventListener(Event.ENTER_FRAME, loop);
  311.                 },
  312.                 timerHandler
  313.             );
  314.             cmd.execute();
  315.         }
  316.         private function timerHandler(e:TimerEvent = null):void {
  317.             var i:int;
  318.             var arr:Array = [];
  319.             for (i = 0; i < textPixels.pixels.length; i++) {
  320.                 arr[i] = BetweenAS3.serial(
  321.                     BetweenAS3.delay(
  322.                         BetweenAS3.to(textPixels.pixels[i], getRandomPos(), 3, Expo.easeInOut),
  323.                         Math.random()));
  324.             }
  325.             BetweenAS3.serial(
  326.                 BetweenAS3.parallelTweens(arr),
  327.                 BetweenAS3.func(function():void {
  328.                     setTimeout(motionText, 2 * 1000);
  329.                 })
  330.                 ).play();
  331.             //
  332.             index++;
  333.             if (index == data.length - 1)
  334.                 index = 0;
  335.             //
  336.             var cameraTarget:DisplayObject3D = new DisplayObject3D();
  337.             cameraTarget.copyTransform(dmyObjs[index]);
  338.             cameraTarget.moveBackward(250);
  339.             var dis:Number = cameraTarget.distanceTo(DisplayObject3D.ZERO);
  340.             var rot:Number = Math.atan2(cameraTarget.x, cameraTarget.z);
  341.             
  342.             BetweenAS3.parallel(
  343.                 BetweenAS3.delay(
  344.                     BetweenAS3.bezier(this, {
  345.                         cameraYaw: rot,
  346.                         cameraDistance: dis,
  347.                         cameraPitch: cameraTarget.y
  348.                     }, null, getRandomPos(), 10.5, Expo.easeInOut),
  349.                 1.0) ,
  350.                 BetweenAS3.serial(
  351.                     BetweenAS3.to(camera, {
  352.                         fov: 60
  353.                     }, 4, Sine.easeInOut),
  354.                     BetweenAS3.to(camera, {
  355.                         fov: 50
  356.                     }, 8, Sine.easeInOut)
  357.                     )
  358.                 ).play();
  359.         }
  360.         private var preRenderedTests:Array = [];
  361.         private function preRenderText(itemIndex:int):void {
  362.             preRenderedTests[itemIndex] = [];
  363.             var text:TextField = new TextField();
  364.             text.multiline = true;
  365.             text.autoSize = "left";
  366.             text.htmlText = "<font face='Arial' size='24'>WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW</font>";
  367.             trace(data[itemIndex].comment);
  368.             
  369.             var size:int = 24;
  370.             while(text.textWidth * text.textHeight > MAX_PARTICLES){
  371.                 text.htmlText = "<font face='Arial' size='" + size +"'>" + data[itemIndex].comment + "</font>"
  372. //                                +"<br><font face='Arial' size='" + size / 2 + "'>" + String(data[itemIndex].name).toUpperCase() + "</font>";
  373.                 size--;
  374.             }
  375.             
  376.             var cap:BitmapData = new BitmapData(text.textWidth + 10, text.textHeight, true, 0xFFFFFFFF);
  377.             cap.lock();
  378.             cap.draw(text);
  379.             // particle motion
  380.             var cnt:int = 0;
  381.             for (var i:int = 0; i < text.textWidth + 10; i++) {
  382.                 for (var j:int = 0; j < text.textHeight; j++) {
  383.                     if (cap.getPixel(i, j) == 0xFFFFFF)
  384.                         continue;
  385.                     if(preRenderedTests[itemIndex].length >= MAX_PARTICLES) break
  386.                     preRenderedTests[itemIndex].push({x: i, y: j, textWidth: text.textWidth, textHeight: text.textHeight});
  387.                 }
  388.             }
  389.             cap.unlock();
  390.             cap.dispose();
  391.         }
  392.         /**
  393.          * テキストをBitmapData化してトゥイーンとして作成 
  394.          * @param itemIndex
  395.          */        
  396.         private function createText(itemIndex:int):void {
  397.             var t:DisplayObject3D = dmyObjs[itemIndex];
  398.             // particle motion
  399.             var cnt:int = 0;
  400.             var arr:Array = [];
  401.             for (var i:int = 0; i < preRenderedTests[itemIndex].length; i++) {
  402.                 var pix:Object = preRenderedTests[itemIndex][i];
  403.                 var p:Pixel3D = textPixels.pixels[i];
  404.                 var vec:DisplayObject3D = new DisplayObject3D();
  405.                 vec.x = (pix.x - pix.textWidth / 2) * PIXCEL_MARGIN;
  406.                 vec.y = (pix.textHeight / 2 - pix.y) * PIXCEL_MARGIN;
  407.                 vec.z = 0;
  408.                 vec.transform.calculateMultiply(t.transform, vec.transform);
  409.                 arr[i] = BetweenAS3.bezier(p, {
  410.                         x: vec.x,
  411.                         y: vec.y,
  412.                         z: vec.z
  413.                     }, null, getRandomPos(), 1.2 + Math.random() * 0.25 + i * 0.002, Expo.easeOut);
  414.             }
  415.             tweens.push(arr);
  416.         }
  417.         private function motionText():void {
  418.             var tw:ITween = BetweenAS3.parallelTweens(tweens[index]);
  419.             // トゥイーンのデュレーションを調整
  420.             tw = BetweenAS3.scale(tw, 3.5 / tw.duration);
  421.             tw.play();
  422.         }
  423.         /**
  424.          * エンターフレームイベント 
  425.          */        
  426.         private function loop(e:Event = null):void {
  427.             // カメラ
  428.             camera.x = cameraDistance * Math.sin(cameraYaw);
  429.             camera.y = cameraPitch;
  430.             camera.z = cameraDistance * Math.cos(cameraYaw);
  431.             
  432.             // レンダリング
  433.             renderer.renderScene(scene, camera, viewport);
  434.             
  435.             // キラキラ
  436.             canvas.fillRect(canvas.rect, 0x000000);
  437.             canvas.draw(viewport, mtx);
  438.         }
  439.         private function getRandomPos():Object {
  440.             return {
  441.                     x: MAX_RADIUS * (Math.random() - 0.5),
  442.                     y: MAX_RADIUS * (Math.random() - 0.5),
  443.                     z: MAX_RADIUS * (Math.random() - 0.5)
  444.                 };
  445.         }
  446.         /**
  447.          * 木を作る再帰関数
  448.          * http://wonderfl.net/code/00cbe3ecbf0db2e865bc410a8ea54677c19ba4c6 
  449.          * @param x
  450.          * @param y
  451.          * @param z
  452.          * @param length
  453.          * @param angle
  454.          * @param cf
  455.          * 
  456.          */
  457.         private function drawTree(x:Number, y:Number, z:Number, length:Number, angle:Number, cf:int):void {
  458.             level += 1;
  459.             var destx:Number = x + length * Math.cos(angle * (Math.PI / 180));
  460.             var desty:Number = y + length * Math.sin(angle * (Math.PI / 180));
  461.             var destz:Number = z + length * (Math.random() - 0.5) * 2;
  462.             if (Math.random() < 0.5)
  463.                 cf = COLORS[COLORS.length * Math.random() | 0];
  464.             var max:int = 10 - level / 1.5;
  465.             for (var i:int = 0; i < max; i++) {
  466.                 treePixels.addPixel3D(new Pixel3D(cf,
  467.                     destx * i / max + x * (max - i) / max,
  468.                     desty * i / max + y * (max - i) / max,
  469.                     destz * i / max + z * (max - i) / max
  470.                     ));
  471.             }
  472.             if (level < 6) {
  473.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  474.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  475.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  476.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  477.             }
  478.             level -= 1;
  479.         }
  480.         
  481.         /**
  482.          * 1行でArrayをシャッフルする by nemu90kWw
  483.          * http://wonderfl.net/code/8cfa39c9e91a268791142fe605c010dc30338588 
  484.          */        
  485.         public function shuffle(array:Array):Array{
  486.             return array.sort(function():int{return int(Math.random()*3)-1});
  487.         }
  488.         
  489.         /**
  490.          * @see http://takumakei.blogspot.com/2009/05/actionscriptrubystringscan.html
  491.          */ 
  492.         //package com.blogspot.takumakei.utils
  493.         //{
  494.         //public
  495.         public function scan(str:String, re:RegExp):Array
  496.         {
  497.             if(!re.global){
  498.                 var flags:String = 'g';
  499.                 
  500.                 if(re.dotall)
  501.                     flags += 's';
  502.                 if(re.multiline)
  503.                     flags += 'm';
  504.                 if(re.ignoreCase)
  505.                     flags += 'i';
  506.                 if(re.extended)
  507.                     flags += 'x';
  508.                 re = new RegExp(re.source, flags);                    
  509.             }
  510.             var r:Array = [];
  511.             var m:Array = re.exec(str);
  512.             while(null != m){
  513.                 if(1 == m.length)
  514.                     r.push(m[0]);
  515.                 else
  516.                     r.push(m.slice(1, m.length));
  517.                 m = re.exec(str);
  518.             }
  519.             return r;
  520.         }
  521.         //}
  522.     }
  523. }
  524. import flash.display.*;
  525. class ProgressBar extends Sprite {
  526.     private var edge:Sprite = new Sprite;
  527.     private var cont:Sprite = new Sprite;
  528.     
  529.     private var _value:Number = 0;
  530.     
  531.     public function set value(v:Number):void {
  532.         _value = v;
  533.         cont.scaleX = _value;
  534.     }
  535.     
  536.     public function get value():Number {
  537.         return _value;
  538.     }
  539.     
  540.     public function ProgressBar() {
  541.         edge.graphics.lineStyle(1, 0xFFFFFF);
  542.         edge.graphics.drawRect(0.50.510010);
  543.         
  544.         cont.graphics.beginFill(0x555555);
  545.         cont.graphics.drawRect(0010010);
  546.         
  547.         addChild(cont);
  548.         addChild(edge);
  549.         
  550.         value = 0;
  551.     }
  552. }
noswf
  1. // forked from clockmaker's Xmas Message with Twitter
  2. /**
  3.  * ネットで投稿されたメッセージが
  4.  * クリスマスの夜空を飾ります
  5.  * 
  6.  * クリスマスメッセージは
  7.  * 「Twitter」と「はてなブックマーク」で送ることができます
  8.  * 
  9.  * ※投稿はFlash内のボタンを押して、
  10.  * Twitterの場合は[]内にコメントを
  11.  * はてなブックマークの場合は、ブックマークコメントを記入下さい
  12.  * 
  13.  * このFlashはwonderfl上の様々なテクニックを元に作られました
  14.  * 
  15.  * Twitter連動
  16.  * http://wonderfl.net/code/04d6d1ae7e943b7faab88623ed83404e7a40c5f7
  17.  * 
  18.  * キラキラ3D
  19.  * http://wonderfl.net/code/c0f513f31389ba07e375331256c2bfa3a8b9006c
  20.  * 
  21.  * 文字のパーティクル化
  22.  * http://wonderfl.net/code/08ec1c2c8da8e9e487867a8e2ab8cddeb75f8986
  23.  * 
  24.  * 木を作る再帰関数
  25.  * http://wonderfl.net/code/00cbe3ecbf0db2e865bc410a8ea54677c19ba4c6 
  26.  * 
  27.  * 配列のシャッフル
  28.  * http://wonderfl.net/code/8cfa39c9e91a268791142fe605c010dc30338588 
  29.  * 
  30.  * BetweenAS3の時間調整
  31.  * http://wonderfl.net/code/59af9d8a3cc45e4c2e6fcf12a9bc9ea55b1576e7
  32.  * 
  33.  */
  34. package {
  35.     import com.bit101.components.Label;
  36.     
  37.     import flash.display.*;
  38.     import flash.events.*;
  39.     import flash.geom.Matrix;
  40.     import flash.net.*;
  41.     import flash.system.*;
  42.     import flash.text.*;
  43.     import flash.utils.*;
  44.     
  45.     import jp.progression.casts.*;
  46.     import jp.progression.commands.lists.LoaderList;
  47.     import jp.progression.commands.lists.SerialList;
  48.     import jp.progression.commands.net.*;
  49.     import jp.progression.data.getResourceById;
  50.     
  51.     import org.libspark.betweenas3.BetweenAS3;
  52.     import org.libspark.betweenas3.easing.*;
  53.     import org.libspark.betweenas3.tweens.ITween;
  54.     import org.papervision3d.cameras.Camera3D;
  55.     import org.papervision3d.core.effects.*;
  56.     import org.papervision3d.core.geom.Pixels;
  57.     import org.papervision3d.core.geom.renderables.Pixel3D;
  58.     import org.papervision3d.core.math.Number3D;
  59.     import org.papervision3d.materials.*;
  60.     import org.papervision3d.objects.DisplayObject3D;
  61.     import org.papervision3d.objects.primitives.*;
  62.     import org.papervision3d.render.BasicRenderEngine;
  63.     import org.papervision3d.scenes.Scene3D;
  64.     import org.papervision3d.view.Viewport3D;
  65.     import org.papervision3d.view.layer.BitmapEffectLayer;
  66.     [SWF(width=465, height=465, frameRate=30, backgroundColor=0)]
  67.     public class Main extends CastDocument {
  68.         static public const URL_HATENA:String = "http://pipes.yahooapis.com/pipes/pipe.run?_id=a9fa16f111d33689315b50bd196f691e&_render=rss";
  69.         static public const URL_TWITTER:String = "http://search.twitter.com/search.atom?q=%23XmasMessage&rpp=50";
  70.         static public const URL_IMG_BG:String = "http://clockmaker.jp/labs/091021_checkmate/assets/bg.png";
  71.         static public const URL_IMG_TITLE:String = "http://clockmaker.jp/labs/091021_checkmate/assets/title.png";
  72.         static public const URL_IMG_BTN_HATENA:String = "http://clockmaker.jp/labs/091021_checkmate/assets/btn-hatena.png";
  73.         static public const URL_IMG_BTN_TWITTER:String = "http://clockmaker.jp/labs/091021_checkmate/assets/btn-twitter.png";
  74.         static private const MAX_PARTICLES:int = 2500;
  75.         // color
  76.         public static const WHITE:uint = 0xFFF0F0F0;
  77.         public static const GREEN:uint = 0xFF008800;
  78.         public static const RED:uint = 0xFFCC0000;
  79.         public static const GOLD:uint = 0xFFFFCC66;
  80.         public static const SILVER:uint = 0xFFCCCCCC;
  81.         public static const COLORS:Array = [WHITE, GREEN, RED, GOLD, SILVER];
  82.         // 3d
  83.         private var scene:Scene3D = new Scene3D();
  84.         private var renderer:BasicRenderEngine = new BasicRenderEngine();
  85.         private var viewport:Viewport3D = new Viewport3D(465465);
  86.         private var camera:Camera3D = new Camera3D()
  87.         // 3d objects
  88.         private const MAX_RADIUS:int = 10000;
  89.         private const PIXCEL_MARGIN:Number = 1.25;
  90.         private var textPixels:Pixels;
  91.         private var treePixels:Pixels;
  92.         private var pixelArr:Array = [];
  93.         private var bfx:BitmapEffectLayer;
  94.         private var dmyObjs:Array = [];
  95.         private var tweens:Array = [];
  96.         // 3d camera
  97.         public var cameraDistance:Number  = 1000;
  98.         public var cameraYaw:Number = 0;
  99.         public var cameraPitch:Number = 0;
  100.         // 2d 
  101.         private var canvas:BitmapData;
  102.         private var mtx:Matrix;
  103.         private var progress:ProgressBar;
  104.         private var loading:Label;
  105.         private var loadingTween:ITween;
  106.         // array of objs
  107.         private var data:Array = [];
  108.         // fractal
  109.         private var level:int = 0;
  110.         // data
  111.         private var index:int = 0;
  112.         private const RESET_TIMER:Timer = new Timer(11 * 1000);
  113.         
  114.         /**
  115.          * Progression 4 では atReady から処理が始まります
  116.          */        
  117.         override protected function atReady() : void{
  118.             stage.quality = StageQuality.MEDIUM;
  119.             
  120.             // 3D
  121.             addChild(viewport);
  122.             
  123.             // progress bar
  124.             progress = new ProgressBar();
  125.             progress.value = 0;
  126.             this.addChild(progress)
  127.             progress.x = int(stage.stageWidth / 2 - progress.width/2);
  128.             progress.y = int(stage.stageHeight / 2 + 10);
  129.             
  130.             // loading
  131.             loading = new Label(this, stage.stageWidth / 2 - 33, stage.stageHeight / 2 - 10"NOW LOADING");
  132.             loadingTween = BetweenAS3.tween(loading, { alpha:1 }, { alpha:0.25 }, 0.05);
  133.             loadingTween = BetweenAS3.serial(loadingTween, BetweenAS3.reverse(loadingTween));
  134.             loadingTween.stopOnComplete = false;
  135.             loadingTween.play();
  136.             
  137.             var context:LoaderContext = new LoaderContext(true);
  138.             var loaderList:LoaderList = new LoaderList(null,
  139.                 new LoadBitmapData(new URLRequest(URL_IMG_BG), {context:context}),
  140.                 new LoadBitmapData(new URLRequest(URL_IMG_TITLE), {context:context}),
  141.                 new LoadURL(new URLRequest(URL_TWITTER), {context:context}),
  142.                 new LoadURL(new URLRequest(URL_HATENA), {context:context}),
  143.                 new LoadBitmapData(new URLRequest(URL_IMG_BTN_HATENA), {context:context}),
  144.                 new LoadBitmapData(new URLRequest(URL_IMG_BTN_TWITTER), {context:context})
  145.                 );
  146.             loaderList.onProgress = function():void{
  147.                 progress.value = 0.5 * (loaderList.loaded / loaderList.numCommands)
  148.             }
  149.             
  150.             new SerialList(null,
  151.                 loaderList,
  152.                 function():void{
  153.                     
  154.                     // Twitter連携 by http://wonderfl.net/code/04d6d1ae7e943b7faab88623ed83404e7a40c5f7 (coppieee)
  155.                     default xml namespace = new Namespace("http://www.w3.org/2005/Atom");
  156.                     var xml:XML = XML(getResourceById(URL_TWITTER).data);
  157.                     for (var i:int = 0; i < xml.entry.length(); i++) {
  158.                         // コメントを抽出
  159.                         var comment:String = scan(xml.entry[i].title,/\[(.+)\]/);
  160.                         // RT は除外
  161.                         if(xml.entry[i].title.indexOf("RT") > -1continue;
  162.                         // コメントなしは除外
  163.                         if(comment == ""continue;
  164.                         // データに追加
  165.                         data.push({
  166.                             img : xml.entry[i].link.(@type == "image/png").@href,
  167.                             name : xml.entry[i].author.name.split(" (")[0],
  168.                             comment : comment
  169.                         });
  170.                     }
  171.                     
  172.                     xml = XML(getResourceById(URL_HATENA).data);
  173.                     
  174.                     for (i = 0; i < xml.channel.item.length(); i++) {
  175.                         if(xml.channel.item[i].description != undefined){
  176.                             comment = xml.channel.item[i].description;
  177.                             var name:String = xml.channel.item[i].title;
  178.                             var imgurl:String = "http://www.st-hatena.com/users/" + name.substr(0,2) + "/" + name + "/profile.gif";
  179.                             data.push({
  180.                                 img : imgurl,
  181.                                 name : name,
  182.                                 comment : comment
  183.                             });
  184.                         }
  185.                     }
  186.                     
  187.                     data = shuffle(data);
  188.                     data = data.slice(08)
  189.                 },
  190.                 init3d
  191.             ).execute();
  192.         }
  193.         /**
  194.          * Papervision3D関係のごにょごにょ 
  195.          */        
  196.         private function init3d():void {
  197.             // カメラの設定
  198.             camera.target = DisplayObject3D.ZERO;
  199.             // ビットマップエフェクトレイヤー
  200.             bfx = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight);
  201.             bfx.addEffect(new BitmapColorEffect(1110.75));
  202.             viewport.containerSprite.addLayer(bfx);
  203.             // ピクセル3D
  204.             textPixels = new Pixels(bfx);
  205.             scene.addChild(textPixels);
  206.             treePixels = new Pixels(bfx);
  207.             scene.addChild(treePixels);
  208.             
  209.             var i:int;
  210.             var arr:Array = [];
  211.             // snow
  212.             var star:Array = [0xFFFFFFFF, 0xFFcccccc, 0xFF666666, 0xFF333333]
  213.             for (i = 0; i < 1500; i++) {
  214.                 treePixels.addPixel3D(new Pixel3D(star[star.length * Math.random() | 0],
  215.                     10000 * (Math.random() - 0.5),
  216.                     10000 * (Math.random()) - 1000,
  217.                     10000 * (Math.random() - 0.5)));
  218.             }
  219.             for (i = 0; i < 255; i++) {
  220.                 treePixels.addPixel3D(new Pixel3D(0xFF0066CC,
  221.                     100 * (Math.floor(i / 15) - 7),
  222.                     -1000,
  223.                     100 * (i % 15 - 7)));
  224.             }
  225.             // ダミーオブジェクトを作成
  226.             for (var k:int = 0; k < data.length; k++) {
  227.                 dmyObjs[k] = new DisplayObject3D();
  228.                 while (true) {
  229.                     var angle:Number = 360 * Math.random();
  230.                     dmyObjs[k].x = 2000 * Math.sin(angle * Number3D.toRADIANS);
  231.                     dmyObjs[k].y = 2000 * (Math.random() - 0.5);
  232.                     dmyObjs[k].z = 2000 * Math.cos(angle * Number3D.toRADIANS);
  233.                     if (k == 0)
  234.                         break;
  235.                     else {
  236.                         if (DisplayObject3D(dmyObjs[k]).distanceTo(dmyObjs[k - 1]) >= 500)
  237.                             break;
  238.                     }
  239.                 }
  240.                 dmyObjs[k].lookAt(DisplayObject3D.ZERO);
  241.                 scene.addChild(dmyObjs[k]);
  242.             }
  243.             for (i = 0; i < MAX_PARTICLES; i++) {
  244.                 var p:Pixel3D = new Pixel3D(COLORS[COLORS.length * Math.random() | 0]);
  245.                 textPixels.addPixel3D(p);
  246.             }
  247.             drawTree(0, -10000100090, GOLD);
  248.             
  249.             loading.text = "NOW RENDERING"
  250.             loading.x = stage.stageWidth / 2 - 39
  251.             var cmd:SerialList = new SerialList();
  252.             var renderIndex:int=0;
  253.             for (i = 0; i < data.length; i++) {
  254.                 cmd.addCommand(
  255.                     function():void{
  256.                         preRenderText(renderIndex);
  257.                         createText(renderIndex);
  258.                         renderIndex ++;
  259.                         
  260.                         progress.value = 0.5 + 0.5 * (renderIndex / data.length);
  261.                     },
  262.                     0.05
  263.                 );
  264.             }
  265.             cmd.addCommand(
  266.                 function():void{
  267.                     // remove loading
  268.                     removeChild(loading);
  269.                     removeChild(progress);
  270.                     loadingTween.stop();
  271.                     loadingTween = null;
  272.                     
  273.                     // ui
  274.                     addChildAt(new CastBitmap(getResourceById(URL_IMG_BG).data), 0);
  275.                     addChild(new CastBitmap(getResourceById(URL_IMG_TITLE).data, "auto"false, {x:20, y:376}));
  276.                     
  277.                     var hatenaBtn:CastButton = new CastButton({x:20, y:433});
  278.                     hatenaBtn.addChild(new Bitmap(getResourceById(URL_IMG_BTN_HATENA).data));
  279.                     hatenaBtn.onCastMouseUp = function():void{
  280.                         navigateToURL(new URLRequest("http://b.hatena.ne.jp/append?http://wonderfl.net/code/d5de28ad1f65364ee33b964101222be41a7320af"));
  281.                     }
  282.                     hatenaBtn.buttonMode = true;
  283.                     addChild(hatenaBtn);
  284.                     
  285.                     var tweetBtn:CastButton = new CastButton({x:240, y:433});
  286.                     tweetBtn.addChild(new Bitmap(getResourceById(URL_IMG_BTN_TWITTER).data));
  287.                     tweetBtn.onCastMouseUp = function():void{
  288.                         navigateToURL(new URLRequest("http://twitter.com/home/?status=" + escapeMultiByte("#XmasMessage [] http://j.mp/xmaswon")));
  289.                     };
  290.                     tweetBtn.buttonMode = true;
  291.                     addChild(tweetBtn);
  292.                     
  293.                     // キラキラロジック by http://wonderfl.net/code/c0f513f31389ba07e375331256c2bfa3a8b9006c (sake)
  294.                     canvas = new BitmapData(720 / 4485 / 4false, 0x000000);
  295.                     var bmp:Bitmap = new Bitmap(canvas, PixelSnapping.NEVER, false);
  296.                     bmp.scaleX = bmp.scaleY = 4;
  297.                     bmp.smoothing = true;
  298.                     bmp.blendMode = BlendMode.ADD;
  299.                     addChildAt(bmp,2);
  300.                     mtx = new Matrix();
  301.                     mtx.scale(0.250.25);
  302.                     // tree
  303.                     drawTree(0, -10000100090, GOLD);
  304.                     // タイマーを作る
  305.                     RESET_TIMER.addEventListener(TimerEvent.TIMER, timerHandler);
  306.                     RESET_TIMER.start();
  307.                     // エンターフレーム
  308.                     addEventListener(Event.ENTER_FRAME, loop);
  309.                 },
  310.                 timerHandler
  311.             );
  312.             cmd.execute();
  313.         }
  314.         private function timerHandler(e:TimerEvent = null):void {
  315.             var i:int;
  316.             var arr:Array = [];
  317.             for (i = 0; i < textPixels.pixels.length; i++) {
  318.                 arr[i] = BetweenAS3.serial(
  319.                     BetweenAS3.delay(
  320.                         BetweenAS3.to(textPixels.pixels[i], getRandomPos(), 3, Expo.easeInOut),
  321.                         Math.random()));
  322.             }
  323.             BetweenAS3.serial(
  324.                 BetweenAS3.parallelTweens(arr),
  325.                 BetweenAS3.func(function():void {
  326.                     setTimeout(motionText, 2 * 1000);
  327.                 })
  328.                 ).play();
  329.             //
  330.             index++;
  331.             if (index == data.length - 1)
  332.                 index = 0;
  333.             //
  334.             var cameraTarget:DisplayObject3D = new DisplayObject3D();
  335.             cameraTarget.copyTransform(dmyObjs[index]);
  336.             cameraTarget.moveBackward(250);
  337.             var dis:Number = cameraTarget.distanceTo(DisplayObject3D.ZERO);
  338.             var rot:Number = Math.atan2(cameraTarget.x, cameraTarget.z);
  339.             
  340.             BetweenAS3.parallel(
  341.                 BetweenAS3.delay(
  342.                     BetweenAS3.bezier(this, {
  343.                         cameraYaw: rot,
  344.                         cameraDistance: dis,
  345.                         cameraPitch: cameraTarget.y
  346.                     }, null, getRandomPos(), 10.5, Expo.easeInOut),
  347.                 1.0) ,
  348.                 BetweenAS3.serial(
  349.                     BetweenAS3.to(camera, {
  350.                         fov: 60
  351.                     }, 4, Sine.easeInOut),
  352.                     BetweenAS3.to(camera, {
  353.                         fov: 50
  354.                     }, 8, Sine.easeInOut)
  355.                     )
  356.                 ).play();
  357.         }
  358.         private var preRenderedTests:Array = [];
  359.         private function preRenderText(itemIndex:int):void {
  360.             preRenderedTests[itemIndex] = [];
  361.             var text:TextField = new TextField();
  362.             text.multiline = true;
  363.             text.autoSize = "left";
  364.             text.htmlText = "<font face='Arial' size='24'>WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW</font>";
  365.             trace(data[itemIndex].comment);
  366.             
  367.             var size:int = 24;
  368.             while(text.textWidth * text.textHeight > MAX_PARTICLES){
  369.                 text.htmlText = "<font face='Arial' size='" + size +"'>" + data[itemIndex].comment + "</font>"
  370. //                                +"<br><font face='Arial' size='" + size / 2 + "'>" + String(data[itemIndex].name).toUpperCase() + "</font>";
  371.                 size--;
  372.             }
  373.             
  374.             var cap:BitmapData = new BitmapData(text.textWidth + 10, text.textHeight, true, 0xFFFFFFFF);
  375.             cap.lock();
  376.             cap.draw(text);
  377.             // particle motion
  378.             var cnt:int = 0;
  379.             for (var i:int = 0; i < text.textWidth + 10; i++) {
  380.                 for (var j:int = 0; j < text.textHeight; j++) {
  381.                     if (cap.getPixel(i, j) == 0xFFFFFF)
  382.                         continue;
  383.                     if(preRenderedTests[itemIndex].length >= MAX_PARTICLES) break
  384.                     preRenderedTests[itemIndex].push({x: i, y: j, textWidth: text.textWidth, textHeight: text.textHeight});
  385.                 }
  386.             }
  387.             cap.unlock();
  388.             cap.dispose();
  389.         }
  390.         /**
  391.          * テキストをBitmapData化してトゥイーンとして作成 
  392.          * @param itemIndex
  393.          */        
  394.         private function createText(itemIndex:int):void {
  395.             var t:DisplayObject3D = dmyObjs[itemIndex];
  396.             // particle motion
  397.             var cnt:int = 0;
  398.             var arr:Array = [];
  399.             for (var i:int = 0; i < preRenderedTests[itemIndex].length; i++) {
  400.                 var pix:Object = preRenderedTests[itemIndex][i];
  401.                 var p:Pixel3D = textPixels.pixels[i];
  402.                 var vec:DisplayObject3D = new DisplayObject3D();
  403.                 vec.x = (pix.x - pix.textWidth / 2) * PIXCEL_MARGIN;
  404.                 vec.y = (pix.textHeight / 2 - pix.y) * PIXCEL_MARGIN;
  405.                 vec.z = 0;
  406.                 vec.transform.calculateMultiply(t.transform, vec.transform);
  407.                 arr[i] = BetweenAS3.bezier(p, {
  408.                         x: vec.x,
  409.                         y: vec.y,
  410.                         z: vec.z
  411.                     }, null, getRandomPos(), 1.2 + Math.random() * 0.25 + i * 0.002, Expo.easeOut);
  412.             }
  413.             tweens.push(arr);
  414.         }
  415.         private function motionText():void {
  416.             var tw:ITween = BetweenAS3.parallelTweens(tweens[index]);
  417.             // トゥイーンのデュレーションを調整
  418.             tw = BetweenAS3.scale(tw, 3.5 / tw.duration);
  419.             tw.play();
  420.         }
  421.         /**
  422.          * エンターフレームイベント 
  423.          */        
  424.         private function loop(e:Event = null):void {
  425.             // カメラ
  426.             camera.x = cameraDistance * Math.sin(cameraYaw);
  427.             camera.y = cameraPitch;
  428.             camera.z = cameraDistance * Math.cos(cameraYaw);
  429.             
  430.             // レンダリング
  431.             renderer.renderScene(scene, camera, viewport);
  432.             
  433.             // キラキラ
  434.             canvas.fillRect(canvas.rect, 0x000000);
  435.             canvas.draw(viewport, mtx);
  436.         }
  437.         private function getRandomPos():Object {
  438.             return {
  439.                     x: MAX_RADIUS * (Math.random() - 0.5),
  440.                     y: MAX_RADIUS * (Math.random() - 0.5),
  441.                     z: MAX_RADIUS * (Math.random() - 0.5)
  442.                 };
  443.         }
  444.         /**
  445.          * 木を作る再帰関数
  446.          * http://wonderfl.net/code/00cbe3ecbf0db2e865bc410a8ea54677c19ba4c6 
  447.          * @param x
  448.          * @param y
  449.          * @param z
  450.          * @param length
  451.          * @param angle
  452.          * @param cf
  453.          * 
  454.          */
  455.         private function drawTree(x:Number, y:Number, z:Number, length:Number, angle:Number, cf:int):void {
  456.             level += 1;
  457.             var destx:Number = x + length * Math.cos(angle * (Math.PI / 180));
  458.             var desty:Number = y + length * Math.sin(angle * (Math.PI / 180));
  459.             var destz:Number = z + length * (Math.random() - 0.5) * 2;
  460.             if (Math.random() < 0.5)
  461.                 cf = COLORS[COLORS.length * Math.random() | 0];
  462.             var max:int = 10 - level / 1.5;
  463.             for (var i:int = 0; i < max; i++) {
  464.                 treePixels.addPixel3D(new Pixel3D(cf,
  465.                     destx * i / max + x * (max - i) / max,
  466.                     desty * i / max + y * (max - i) / max,
  467.                     destz * i / max + z * (max - i) / max
  468.                     ));
  469.             }
  470.             if (level < 6) {
  471.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  472.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  473.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  474.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  475.             }
  476.             level -= 1;
  477.         }
  478.         
  479.         /**
  480.          * 1行でArrayをシャッフルする by nemu90kWw
  481.          * http://wonderfl.net/code/8cfa39c9e91a268791142fe605c010dc30338588 
  482.          */        
  483.         public function shuffle(array:Array):Array{
  484.             return array.sort(function():int{return int(Math.random()*3)-1});
  485.         }
  486.         
  487.         /**
  488.          * @see http://takumakei.blogspot.com/2009/05/actionscriptrubystringscan.html
  489.          */ 
  490.         //package com.blogspot.takumakei.utils
  491.         //{
  492.         //public
  493.         public function scan(str:String, re:RegExp):Array
  494.         {
  495.             if(!re.global){
  496.                 var flags:String = 'g';
  497.                 
  498.                 if(re.dotall)
  499.                     flags += 's';
  500.                 if(re.multiline)
  501.                     flags += 'm';
  502.                 if(re.ignoreCase)
  503.                     flags += 'i';
  504.                 if(re.extended)
  505.                     flags += 'x';
  506.                 re = new RegExp(re.source, flags);                    
  507.             }
  508.             var r:Array = [];
  509.             var m:Array = re.exec(str);
  510.             while(null != m){
  511.                 if(1 == m.length)
  512.                     r.push(m[0]);
  513.                 else
  514.                     r.push(m.slice(1, m.length));
  515.                 m = re.exec(str);
  516.             }
  517.             return r;
  518.         }
  519.         //}
  520.     }
  521. }
  522. import flash.display.*;
  523. class ProgressBar extends Sprite {
  524.     private var edge:Sprite = new Sprite;
  525.     private var cont:Sprite = new Sprite;
  526.     
  527.     private var _value:Number = 0;
  528.     
  529.     public function set value(v:Number):void {
  530.         _value = v;
  531.         cont.scaleX = _value;
  532.     }
  533.     
  534.     public function get value():Number {
  535.         return _value;
  536.     }
  537.     
  538.     public function ProgressBar() {
  539.         edge.graphics.lineStyle(1, 0xFFFFFF);
  540.         edge.graphics.drawRect(0.50.510010);
  541.         
  542.         cont.graphics.beginFill(0x555555);
  543.         cont.graphics.drawRect(0010010);
  544.         
  545.         addChild(cont);
  546.         addChild(edge);
  547.         
  548.         value = 0;
  549.     }
  550. }
noswf
  1. // forked from clockmaker's Xmas Message with Twitter
  2. /**
  3.  * ネットで投稿されたメッセージが
  4.  * クリスマスの夜空を飾ります
  5.  * 
  6.  * クリスマスメッセージは
  7.  * 「Twitter」と「はてなブックマーク」で送ることができます
  8.  * 
  9.  * ※投稿はFlash内のボタンを押して、
  10.  * Twitterの場合は[]内にコメントを
  11.  * はてなブックマークの場合は、ブックマークコメントを記入下さい
  12.  * 
  13.  * このFlashはwonderfl上の様々なテクニックを元に作られました
  14.  * 
  15.  * Twitter連動
  16.  * http://wonderfl.net/code/04d6d1ae7e943b7faab88623ed83404e7a40c5f7
  17.  * 
  18.  * キラキラ3D
  19.  * http://wonderfl.net/code/c0f513f31389ba07e375331256c2bfa3a8b9006c
  20.  * 
  21.  * 文字のパーティクル化
  22.  * http://wonderfl.net/code/08ec1c2c8da8e9e487867a8e2ab8cddeb75f8986
  23.  * 
  24.  * 木を作る再帰関数
  25.  * http://wonderfl.net/code/00cbe3ecbf0db2e865bc410a8ea54677c19ba4c6 
  26.  * 
  27.  * 配列のシャッフル
  28.  * http://wonderfl.net/code/8cfa39c9e91a268791142fe605c010dc30338588 
  29.  * 
  30.  * BetweenAS3の時間調整
  31.  * http://wonderfl.net/code/59af9d8a3cc45e4c2e6fcf12a9bc9ea55b1576e7
  32.  * 
  33.  */
  34. package {
  35.     import com.bit101.components.Label;
  36.     
  37.     import flash.display.*;
  38.     import flash.events.*;
  39.     import flash.geom.Matrix;
  40.     import flash.media.Camera;
  41.     import flash.net.*;
  42.     import flash.system.*;
  43.     import flash.text.*;
  44.     import flash.utils.*;
  45.     
  46.     import jp.progression.casts.*;
  47.     import jp.progression.commands.lists.SerialList;
  48.     import jp.progression.commands.net.*;
  49.     import jp.progression.data.getResourceById;
  50.     
  51.     import org.libspark.betweenas3.BetweenAS3;
  52.     import org.libspark.betweenas3.easing.*;
  53.     import org.libspark.betweenas3.tweens.ITween;
  54.     import org.papervision3d.cameras.Camera3D;
  55.     import org.papervision3d.core.effects.*;
  56.     import org.papervision3d.core.geom.Pixels;
  57.     import org.papervision3d.core.geom.renderables.Pixel3D;
  58.     import org.papervision3d.core.math.Number3D;
  59.     import org.papervision3d.materials.*;
  60.     import org.papervision3d.objects.DisplayObject3D;
  61.     import org.papervision3d.objects.primitives.*;
  62.     import org.papervision3d.render.BasicRenderEngine;
  63.     import org.papervision3d.scenes.Scene3D;
  64.     import org.papervision3d.view.Viewport3D;
  65.     import org.papervision3d.view.layer.BitmapEffectLayer;
  66.     [SWF(width=465, height=465, frameRate=60, backgroundColor=0)]
  67.     public class Main extends CastDocument {
  68.         static public const URL_HATENA:String = "http://pipes.yahooapis.com/pipes/pipe.run?_id=a9fa16f111d33689315b50bd196f691e&_render=rss";
  69.         static public const URL_TWITTER:String = "http://search.twitter.com/search.atom?q=%23XmasMessage&rpp=100";
  70.         static private const MAX_PARTICLES:int = 3500;
  71.         // color
  72.         public static const WHITE:uint = 0xFFF0F0F0;
  73.         public static const GREEN:uint = 0xFF008800;
  74.         public static const RED:uint = 0xFFCC0000;
  75.         public static const GOLD:uint = 0xFFFFCC66;
  76.         public static const SILVER:uint = 0xFFCCCCCC;
  77.         public static const COLORS:Array = [WHITE, GREEN, RED, GOLD, SILVER];
  78.         // 3d
  79.         private var scene:Scene3D = new Scene3D();
  80.         private var renderer:BasicRenderEngine = new BasicRenderEngine();
  81.         private var viewport:Viewport3D = new Viewport3D(465465);
  82.         private var camera:Camera3D = new Camera3D()
  83.         // 3d objects
  84.         private const MAX_RADIUS:int = 10000;
  85.         private const PIXCEL_MARGIN:Number = 1;
  86.         private var textPixels:Pixels;
  87.         private var treePixels:Pixels;
  88.         private var pixelArr:Array = [];
  89.         private var bfx:BitmapEffectLayer;
  90.         private var dmyObjs:Array = [];
  91.         private var tweens:Array = [];
  92.         // 3d camera
  93.         public var cameraDistance:Number  = 1000;
  94.         public var cameraYaw:Number = 0;
  95.         public var cameraPitch:Number = 0;
  96.         // 2d 
  97.         private var canvas:BitmapData;
  98.         private var mtx:Matrix;
  99.         // array of objs
  100.         private var data:Array = [];
  101.         // fractal
  102.         private var level:int = 0;
  103.         // data
  104.         private var index:int = 0;
  105.         private const RESET_TIMER:Timer = new Timer(11 * 1000);
  106.         
  107.         /**
  108.          * Progression 4 では atReady から処理が始まります
  109.          */        
  110.         override protected function atReady() : void{
  111.             stage.quality = StageQuality.MEDIUM;
  112.             
  113.             // 3D
  114.             addChild(viewport);
  115.             
  116.             var loading:Label = new Label(this, stage.stageWidth / 2 - 40, stage.stageHeight / 2"NOW LOADING");
  117.             var loadingTween:ITween = BetweenAS3.tween(loading, { alpha:1 }, { alpha:0.25 }, 0.05);
  118.             loadingTween = BetweenAS3.serial(loadingTween, BetweenAS3.reverse(loadingTween));
  119.             loadingTween.stopOnComplete = false;
  120.             loadingTween.play();
  121.             
  122.             var context:LoaderContext = new LoaderContext(true);
  123.             
  124.             const URL_IMG_BG:String = "http://clockmaker.jp/labs/091021_checkmate/assets/bg.png";
  125.             const URL_IMG_TITLE:String = "http://clockmaker.jp/labs/091021_checkmate/assets/title.png";
  126.             const URL_IMG_BTN_HATENA:String = "http://clockmaker.jp/labs/091021_checkmate/assets/btn-hatena.png";
  127.             const URL_IMG_BTN_TWITTER:String = "http://clockmaker.jp/labs/091021_checkmate/assets/btn-twitter.png";
  128.             
  129.             new SerialList(null,
  130.                 new LoadURL(new URLRequest(URL_TWITTER), {context:context}),
  131.                 new LoadURL(new URLRequest(URL_HATENA), {context:context}),
  132.                 new LoadBitmapData(new URLRequest(URL_IMG_BG), {context:context}),
  133.                 new LoadBitmapData(new URLRequest(URL_IMG_TITLE), {context:context}),
  134.                 new LoadBitmapData(new URLRequest(URL_IMG_BTN_HATENA), {context:context}),
  135.                 new LoadBitmapData(new URLRequest(URL_IMG_BTN_TWITTER), {context:context}),
  136.                 function():void{
  137.                     
  138.                     // Twitter連携 by http://wonderfl.net/code/04d6d1ae7e943b7faab88623ed83404e7a40c5f7 (coppieee)
  139.                     default xml namespace = new Namespace("http://www.w3.org/2005/Atom");
  140.                     var xml:XML = XML(getResourceById(URL_TWITTER).data);
  141.                     for (var i:int = 0; i < xml.entry.length(); i++) {
  142.                         // コメントを抽出
  143.                         var comment:String = scan(xml.entry[i].title,/\[(.+)\]/);
  144.                         // RT は除外
  145.                         if(xml.entry[i].title.indexOf("RT") > -1continue;
  146.                         // コメントなしは除外
  147.                         if(comment == ""continue;
  148.                         // データに追加
  149.                         data.push({
  150.                             img : xml.entry[i].link.(@type == "image/png").@href,
  151.                             name : xml.entry[i].author.name.split(" (")[0],
  152.                             comment : comment
  153.                         });
  154.                     }
  155.                     
  156.                     xml = XML(getResourceById(URL_HATENA).data);
  157.                     
  158.                     for (i = 0; i < xml.channel.item.length(); i++) {
  159.                         if(xml.channel.item[i].description != undefined){
  160.                             comment = xml.channel.item[i].description;
  161.                             var name:String = xml.channel.item[i].title;
  162.                             var imgurl:String = "http://www.st-hatena.com/users/" + name.substr(0,2) + "/" + name + "/profile.gif";
  163.                             data.push({
  164.                                 img : imgurl,
  165.                                 name : name,
  166.                                 comment : comment
  167.                             });
  168.                         }
  169.                     }
  170.                     
  171.                     data = shuffle(data);
  172.                     
  173.                     // ui
  174.                     addChildAt(new CastBitmap(getResourceById(URL_IMG_BG).data), 0);
  175.                     addChild(new CastBitmap(getResourceById(URL_IMG_TITLE).data, "auto"false, {x:20, y:376}));
  176.                     
  177.                     var hatenaBtn:CastButton = new CastButton({x:20, y:433});
  178.                     hatenaBtn.addChild(new Bitmap(getResourceById(URL_IMG_BTN_HATENA).data));
  179.                     hatenaBtn.onCastMouseUp = function():void{
  180.                         navigateToURL(new URLRequest("http://b.hatena.ne.jp/append?http://wonderfl.net/code/d5de28ad1f65364ee33b964101222be41a7320af"));
  181.                     }
  182.                     hatenaBtn.buttonMode = true;
  183.                     addChild(hatenaBtn);
  184.                     
  185.                     var tweetBtn:CastButton = new CastButton({x:240, y:433});
  186.                     tweetBtn.addChild(new Bitmap(getResourceById(URL_IMG_BTN_TWITTER).data));
  187.                     tweetBtn.onCastMouseUp = function():void{
  188.                         navigateToURL(new URLRequest("http://twitter.com/home/?status=" + escapeMultiByte("#XmasMessage [] http://j.mp/xmaswon")));
  189.                     };
  190.                     tweetBtn.buttonMode = true;
  191.                     addChild(tweetBtn);
  192.                     
  193.                     // remove loading
  194.                     removeChild(loading);
  195.                     loadingTween.stop();
  196.                     loadingTween = null;
  197.                 },
  198.                 init3d
  199.             ).execute();
  200.         }
  201.         /**
  202.          * Papervision3D関係のごにょごにょ 
  203.          */        
  204.         private function init3d():void {
  205.             // カメラの設定
  206.             camera.target = DisplayObject3D.ZERO;
  207.             // ビットマップエフェクトレイヤー
  208.             bfx = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight);
  209.             bfx.addEffect(new BitmapColorEffect(1110.75));
  210.             viewport.containerSprite.addLayer(bfx);
  211.             // ピクセル3D
  212.             textPixels = new Pixels(bfx);
  213.             scene.addChild(textPixels);
  214.             treePixels = new Pixels(bfx);
  215.             scene.addChild(treePixels);
  216.             
  217.             var i:int;
  218.             var arr:Array = [];
  219.             // snow
  220.             var star:Array = [0xFFFFFFFF, 0xFFcccccc, 0xFF666666, 0xFF333333]
  221.             for (i = 0; i < 1500; i++) {
  222.                 treePixels.addPixel3D(new Pixel3D(star[star.length * Math.random() | 0],
  223.                     10000 * (Math.random() - 0.5),
  224.                     10000 * (Math.random()) - 1000,
  225.                     10000 * (Math.random() - 0.5)));
  226.             }
  227.             for (i = 0; i < 255; i++) {
  228.                 treePixels.addPixel3D(new Pixel3D(0xFF0066CC,
  229.                     100 * (Math.floor(i / 15) - 7),
  230.                     -1000,
  231.                     100 * (i % 15 - 7)));
  232.             }
  233.             // ダミーオブジェクトを作成
  234.             for (var k:int = 0; k < data.length; k++) {
  235.                 dmyObjs[k] = new DisplayObject3D();
  236.                 while (true) {
  237.                     var angle:Number = 360 * Math.random();
  238.                     dmyObjs[k].x = 2000 * Math.sin(angle * Number3D.toRADIANS);
  239.                     dmyObjs[k].y = 2000 * (Math.random() - 0.5);
  240.                     dmyObjs[k].z = 2000 * Math.cos(angle * Number3D.toRADIANS);
  241.                     if (k == 0)
  242.                         break;
  243.                     else {
  244.                         if (DisplayObject3D(dmyObjs[k]).distanceTo(dmyObjs[k - 1]) >= 500)
  245.                             break;
  246.                     }
  247.                 }
  248.                 dmyObjs[k].lookAt(DisplayObject3D.ZERO);
  249.                 scene.addChild(dmyObjs[k]);
  250.             }
  251.             for (i = 0; i < MAX_PARTICLES; i++) {
  252.                 var p:Pixel3D = new Pixel3D(COLORS[COLORS.length * Math.random() | 0]);
  253.                 textPixels.addPixel3D(p);
  254.             }
  255.             for (i = 0; i < data.length; i++) {
  256.                 preRenderText(i);
  257.                 createText(i);
  258.             }
  259.             
  260.             // キラキラロジック by http://wonderfl.net/code/c0f513f31389ba07e375331256c2bfa3a8b9006c (sake)
  261.             canvas = new BitmapData(465 / 4465 / 4false, 0x000000);
  262.             var bmp:Bitmap = new Bitmap(canvas, PixelSnapping.NEVER, false);
  263.             bmp.scaleX = bmp.scaleY = 4;
  264.             bmp.smoothing = true;
  265.             bmp.blendMode = BlendMode.ADD;
  266.             addChildAt(bmp,2);
  267.             mtx = new Matrix();
  268.             mtx.scale(0.250.25);
  269.             // tree
  270.             drawTree(0, -10000100090, GOLD);
  271.             // タイマーを作る
  272.             RESET_TIMER.addEventListener(TimerEvent.TIMER, timerHandler);
  273.             RESET_TIMER.start();
  274.             // エンターフレーム
  275.             addEventListener(Event.ENTER_FRAME, loop);
  276.             // 初期タイマー
  277.             timerHandler();
  278.         }
  279.         private function timerHandler(e:TimerEvent = null):void {
  280.             var i:int;
  281.             var arr:Array = [];
  282.             for (i = 0; i < textPixels.pixels.length; i++) {
  283.                 arr[i] = BetweenAS3.serial(
  284.                     BetweenAS3.delay(
  285.                         BetweenAS3.to(textPixels.pixels[i], getRandomPos(), 3, Expo.easeInOut),
  286.                         Math.random()));
  287.             }
  288.             BetweenAS3.serial(
  289.                 BetweenAS3.parallelTweens(arr),
  290.                 BetweenAS3.func(function():void {
  291.                     setTimeout(motionText, 2 * 1000);
  292.                 })
  293.                 ).play();
  294.             //
  295.             index++;
  296.             if (index == data.length - 1)
  297.                 index = 0;
  298.             //
  299.             var cameraTarget:DisplayObject3D = new DisplayObject3D();
  300.             cameraTarget.copyTransform(dmyObjs[index]);
  301.             cameraTarget.moveBackward(250);
  302.             var dis:Number = cameraTarget.distanceTo(DisplayObject3D.ZERO);
  303.             var rot:Number = Math.atan2(cameraTarget.x, cameraTarget.z);
  304.             
  305.             BetweenAS3.parallel(
  306.                 BetweenAS3.delay(
  307.                     BetweenAS3.bezier(this, {
  308.                         cameraYaw: rot,
  309.                         cameraDistance: dis,
  310.                         cameraPitch: cameraTarget.y
  311.                     }, null, getRandomPos(), 10.5, Expo.easeInOut),
  312.                 1.0) ,
  313.                 BetweenAS3.serial(
  314.                     BetweenAS3.to(camera, {
  315.                         fov: 60
  316.                     }, 4, Sine.easeInOut),
  317.                     BetweenAS3.to(camera, {
  318.                         fov: 50
  319.                     }, 8, Sine.easeInOut)
  320.                     )
  321.                 ).play();
  322.         }
  323.         private var preRenderedTests:Array = [];
  324.         private function preRenderText(itemIndex:int):void {
  325.             preRenderedTests[itemIndex] = [];
  326.             var text:TextField = new TextField();
  327.             text.multiline = true;
  328.             text.htmlText = "<font face='Arial' size='24'>" + data[itemIndex].comment + "</font><br><font face='Arial' size='14'>" + String(data[itemIndex].name).toUpperCase() + "</font>";
  329.             text.autoSize = "left";
  330.             var cap:BitmapData = new BitmapData(text.textWidth, text.textHeight, true, 0xFFFFFFFF);
  331.             cap.draw(text);
  332.             // particle motion
  333.             var cnt:int = 0;
  334.             for (var i:int = 0; i < text.textWidth; i++) {
  335.                 for (var j:int = 0; j < text.textHeight; j++) {
  336.                     if (cap.getPixel(i, j) == 0xFFFFFF)
  337.                         continue;
  338.                     if(preRenderedTests[itemIndex].length >= MAX_PARTICLES) break
  339.                     preRenderedTests[itemIndex].push({x: i, y: j, textWidth: text.textWidth, textHeight: text.textHeight});
  340.                 }
  341.             }
  342.             cap.dispose();
  343.         }
  344.         
  345.         /**
  346.          * テキストをBitmapData化してトゥイーンとして作成 
  347.          * @param itemIndex
  348.          */        
  349.         private function createText(itemIndex:int):void {
  350.             var t:DisplayObject3D = dmyObjs[itemIndex];
  351.             // particle motion
  352.             var cnt:int = 0;
  353.             var arr:Array = [];
  354.             for (var i:int = 0; i < preRenderedTests[itemIndex].length; i++) {
  355.                 var pix:Object = preRenderedTests[itemIndex][i];
  356.                 var p:Pixel3D = textPixels.pixels[i];
  357.                 var vec:DisplayObject3D = new DisplayObject3D();
  358.                 vec.x = (pix.x - pix.textWidth / 2) * PIXCEL_MARGIN;
  359.                 vec.y = (pix.textHeight / 2 - pix.y) * PIXCEL_MARGIN;
  360.                 vec.z = 0;
  361.                 vec.transform.calculateMultiply(t.transform, vec.transform);
  362.                 arr[i] = BetweenAS3.bezier(p, {
  363.                         x: vec.x,
  364.                         y: vec.y,
  365.                         z: vec.z
  366.                     }, null, getRandomPos(), 1.2 + Math.random() * 0.25 + i * 0.002, Expo.easeOut);
  367.             }
  368.             tweens.push(arr);
  369.         }
  370.         private function motionText():void {
  371.             var tw:ITween = BetweenAS3.parallelTweens(tweens[index]);
  372.             // トゥイーンのデュレーションを調整
  373.             tw = BetweenAS3.scale(tw, 3.5 / tw.duration);
  374.             tw.play();
  375.         }
  376.         /**
  377.          * エンターフレームイベント 
  378.          */        
  379.         private function loop(e:Event = null):void {
  380.             // カメラ
  381.             camera.x = cameraDistance * Math.sin(cameraYaw);
  382.             camera.y = cameraPitch;
  383.             camera.z = cameraDistance * Math.cos(cameraYaw);
  384.             
  385.             // レンダリング
  386.             renderer.renderScene(scene, camera, viewport);
  387.             
  388.             // キラキラ
  389.             canvas.fillRect(canvas.rect, 0x000000);
  390.             canvas.draw(viewport, mtx);
  391.         }
  392.         private function getRandomPos():Object {
  393.             return {
  394.                     x: MAX_RADIUS * (Math.random() - 0.5),
  395.                     y: MAX_RADIUS * (Math.random() - 0.5),
  396.                     z: MAX_RADIUS * (Math.random() - 0.5)
  397.                 };
  398.         }
  399.         /**
  400.          * 木を作る再帰関数
  401.          * http://wonderfl.net/code/00cbe3ecbf0db2e865bc410a8ea54677c19ba4c6 
  402.          * @param x
  403.          * @param y
  404.          * @param z
  405.          * @param length
  406.          * @param angle
  407.          * @param cf
  408.          * 
  409.          */
  410.         private function drawTree(x:Number, y:Number, z:Number, length:Number, angle:Number, cf:int):void {
  411.             level += 1;
  412.             var destx:Number = x + length * Math.cos(angle * (Math.PI / 180));
  413.             var desty:Number = y + length * Math.sin(angle * (Math.PI / 180));
  414.             var destz:Number = z + length * (Math.random() - 0.5) * 2;
  415.             if (Math.random() < 0.5)
  416.                 cf = COLORS[COLORS.length * Math.random() | 0];
  417.             var max:int = 10 - level / 1.5;
  418.             for (var i:int = 0; i < max; i++) {
  419.                 treePixels.addPixel3D(new Pixel3D(cf,
  420.                     destx * i / max + x * (max - i) / max,
  421.                     desty * i / max + y * (max - i) / max,
  422.                     destz * i / max + z * (max - i) / max
  423.                     ));
  424.             }
  425.             if (level < 6) {
  426.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  427.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  428.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  429.                 drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
  430.             }
  431.             level -= 1;
  432.         }
  433.         
  434.         /**
  435.          * 1行でArrayをシャッフルする by nemu90kWw
  436.          * http://wonderfl.net/code/8cfa39c9e91a268791142fe605c010dc30338588 
  437.          */        
  438.         public function shuffle(array:Array):Array{
  439.             return array.sort(function():int{return int(Math.random()*3)-1});
  440.         }
  441.         
  442.         /**
  443.          * @see http://takumakei.blogspot.com/2009/05/actionscriptrubystringscan.html
  444.          */ 
  445.         //package com.blogspot.takumakei.utils
  446.         //{
  447.         //public
  448.         public function scan(str:String, re:RegExp):Array
  449.         {
  450.             if(!re.global){
  451.                 var flags:String = 'g';
  452.                 
  453.                 if(re.dotall)
  454.                     flags += 's';
  455.                 if(re.multiline)
  456.                     flags += 'm';
  457.                 if(re.ignoreCase)
  458.                     flags += 'i';
  459.                 if(re.extended)
  460.                     flags += 'x';
  461.                 re = new RegExp(re.source, flags);                    
  462.             }
  463.             var r:Array = [];
  464.             var m:Array = re.exec(str);
  465.             while(null != m){
  466.                 if(1 == m.length)
  467.                     r.push(m[0]);
  468.                 else
  469.                     r.push(m.slice(1, m.length));
  470.                 m = re.exec(str);
  471.             }
  472.             return r;
  473.         }
  474.         //}
  475.     }
  476. }
noswf

ad

Get Adobe Flash Player