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


embed

FORKED
  1. // forked from tail_y's Marimo
  2. package {
  3.     import flash.display.Bitmap;
  4.     import flash.display.BitmapData;
  5.     import flash.display.GradientType;
  6.     import flash.display.Graphics;
  7.     import flash.display.Sprite;
  8.     import flash.geom.Matrix;
  9.     public class Marimo extends Sprite {
  10.         // 空飛ぶマリモ的な物を作る。
  11.         // 実際の構造は、マリモというか、やわらかいウニ。
  12.         // 球形の表面からパーティクルを飛ばして、それを線で繋ぐ。
  13.         // 問題点:線のつなぎ目が汚い 毛の長さが重力によって伸びてしまう ちょっと重い
  14.         // できそうなこと:ビットマップにピクセルで描いて縮小するようにすれば、軽くなるかも。
  15.         // パーティクルを制御すれば、地面と毛が接する表現になるかも
  16.         
  17.         public static const STAGE_W:uint = 465;
  18.         public static const STAGE_H:uint = 465;
  19.         
  20.         public static const SPHERE_R:Number =40;        // マリモの体の(毛以外の部分の)半径。
  21.     
  22.         public static const PARTICLE_NUM_RATE:uint = 600;    // 球体の半円を分割する数。
  23.         public static const PARTICLE_STEP:uint = 4;    // 線の描画回数。大きいほど長くなる。
  24.         public static const PARTICLE_V:uint = 5;    // 線の勢い。大きいほど長く、粗くなる。
  25.         public static const GRAVITY:Number = 0;    // 重力。毛の長さ補正をしていないので、重力が強すぎると毛が伸びる    
  26.         public static const RANDOM_RATE:Number = 1;    // バラつき具合        
  27.         public static const COLOR_RANDOM_RATE:Number = 0;    // 色のバラつき具合        
  28.         
  29.         public static const GROUND_Y:Number = 400;    // 地面位置    
  30.         public static const SHADOW_W:Number = 150;    // 影サイズ
  31.         public static const GROUND_H:Number = 30;    // 影サイズ
  32.         
  33.         private var _marimoX:Number = STAGE_W/2;    // マリモの位置
  34.         private var _marimoY:Number = STAGE_H/2;
  35.         private var _display:BitmapData;
  36.         private var _display2:Sprite;
  37.         
  38.         public static const COLOR_TIP_TOP:Number     = 0x77cc44;        // 毛先上部
  39.         public static const COLOR_TIP_BOTTOM:Number  = 0x339900;        // 毛先下部
  40.         public static const COLOR_BACE_TOP:Number    = 0x337711;        // 本体上部
  41.         public static const COLOR_BACE_BOTTOM:Number = 0x000000;        // 本体下部
  42.         
  43.         public function Marimo() {
  44.             // 準備
  45.             _display = new BitmapData(STAGE_W, STAGE_H, false, 0xffffff);
  46.             addChild(new Bitmap(_display)); // (できればこっちに描画して軽量化したい)
  47.             _display2 = new Sprite();
  48.             //addChild(_display2);
  49.             
  50.             // 描画
  51.             var g:Graphics = _display2.graphics;
  52.             
  53.             // 本体
  54.             g.beginFill(COLOR_BACE_BOTTOM);
  55.             g.drawCircle(_marimoX, _marimoY, SPHERE_R);
  56.             g.endFill();
  57.             // 毛
  58.             for (var xri:uint = 0; xri < PARTICLE_NUM_RATE; xri++){    // zを先に計算して、奥から手前へ描画
  59.                 var xAngle:Number = Math.PI*xri / PARTICLE_NUM_RATE;    // マリモ中心点から、マリモ表面へのx方向に対する角度
  60.                 var z:Number = Math.cos(xAngle) * SPHERE_R;                // パーティクルを飛ばす原点Z
  61.                 var r:Number = Math.sin(xAngle) * SPHERE_R;                // その時の、断面の半径
  62.                 
  63.                 // z方向に向いた面の円周上にある点の数。円周の比(=半径の比)で割り出すが、整数に丸めるので、正確ではない。
  64.                 // (右側でそろっちゃうのが気持ち悪い。ランダムでz回転させてもいいかも。)
  65.                 var particleRateZ:int = PARTICLE_NUM_RATE * 2 * r / SPHERE_R;
  66.                 
  67.                 for (var zri:uint = 0; zri < particleRateZ; zri++){    // z方向面に対して、時計回りに描画
  68.                     var zAngle:Number = Math.PI*zri*2 / particleRateZ;    // マリモ中心点から、マリモ表面へのz方向に対する角度
  69.                     var x:Number = Math.cos(zAngle) * r;    // パーティクルを飛ばす原点X
  70.                     var y:Number = Math.sin(zAngle) * r;    // パーティクルを飛ばす原点Y
  71.                     var vx:Number = PARTICLE_V * x / SPHERE_R;    // パーティクルの速度X
  72.                     var vy:Number = PARTICLE_V * y / SPHERE_R;    // パーティクルの速度Y
  73.                     // 方向をランダムでバラす。(本来は、円形方向へランダムにしなきゃいけないのだけど、面倒なのでこれで)
  74.                     vx += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  75.                     vy += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  76.                     
  77.                     // 色を決める。上下の位置と、根本までの割合で色を決定する。ランダムもちょっと入れておく。
  78.                     var yColorRate:Number = ((SPHERE_R + y)/ 2 / SPHERE_R) + COLOR_RANDOM_RATE * (0.5 - Math.random());
  79.                     var color0:Number = mixColor(COLOR_BACE_TOP, COLOR_BACE_BOTTOM, yColorRate);
  80.                     var color1:Number = mixColor(COLOR_TIP_TOP, COLOR_TIP_BOTTOM, yColorRate);
  81.                     
  82.                     // 毛
  83.                     drawFur(_marimoX + x, _marimoY + y, vx, vy, color0, color1);
  84.                 }
  85.                 
  86.             }
  87.             // 影
  88.             var gradientMatrix:Matrix = new Matrix();
  89.             gradientMatrix.createGradientBox(SHADOW_W, GROUND_H, 0, _marimoX - SHADOW_W/2, GROUND_Y-GROUND_H/2);
  90.             g.beginGradientFill(GradientType.RADIAL, [0x000000, 0x000000], [0.30.0], [60255], gradientMatrix);    // グラデーションわけわからん・・・
  91.             g.drawRect(00, STAGE_W, STAGE_H);
  92.             g.endFill();
  93.                         // user:uwiのアドバイスに従い、bitmapにして固定化(表示中にブラウザが重くなるのを防ぐ効果)
  94.                         _display.draw(_display2);
  95.         }
  96.         
  97.         // 毛を描く
  98.         private function drawFur(x:Number, y:Number, vx:Number, vy:Number, color0:Number, color1:Number):void{
  99.             var lastX:Number;
  100.             var lastY:Number;
  101.             for (var i:uint=0; i<PARTICLE_STEP; i++){
  102.                 lastX = x;
  103.                 lastY = y;
  104.                 vy += GRAVITY;
  105.                 x += vx;
  106.                 y += vy;
  107.                 drawLine(lastX, lastY, x, y, mixColor(color0, color1, i/PARTICLE_STEP), 1 - i/PARTICLE_STEP);
  108.             }
  109.         }
  110.         
  111.         // 線を引く(ピクセルを打つ方法と、どっちが軽いかな)
  112.         private function drawLine(x0:Number, y0:Number, x1:Number, y1:Number, color:uint, alpha:Number):void{
  113.             var g:Graphics = _display2.graphics;
  114.             g.lineStyle(1, color, alpha);
  115.             g.moveTo(x0, y0);
  116.             g.lineTo(x1, y1);
  117.         }
  118.         
  119.         // 2つの色を指定した割合で混ぜた色を返す(rate=0ならcolor0)。(ここもかなり軽量化できるはず。グラデーションをキャッシュとして使うとか)
  120.         private function mixColor(color0:uint, color1:uint, rate:Number):uint{
  121.             if (rate <= 0return color0;
  122.             if (rate >= 1return color1;
  123.             var r:uint = (color0>>16) * (1-rate) 
  124.                             + (color1>>16) * rate;
  125.             var g:uint = ((color0 & 0x00ff00 ) >>8) * (1-rate) 
  126.                             + ((color1 & 0x00ff00 ) >>8) * rate;
  127.             var b:uint = (color0 & 0xff) * (1-rate) 
  128.                             + (color1 & 0xff) * rate;
  129.              return (r << 16) | (g << 8) | (b);
  130.         }
  131.         
  132.     }
  133. }
noswf
  1. // forked from tail_y's Marimo
  2. package {
  3.     import flash.display.Bitmap;
  4.     import flash.display.BitmapData;
  5.     import flash.display.GradientType;
  6.     import flash.display.Graphics;
  7.     import flash.display.Sprite;
  8.     import flash.geom.Matrix;
  9.     public class Marimo extends Sprite {
  10.         // 空飛ぶマリモ的な物を作る。
  11.         // 実際の構造は、マリモというか、やわらかいウニ。
  12.         // 球形の表面からパーティクルを飛ばして、それを線で繋ぐ。
  13.         // 問題点:線のつなぎ目が汚い 毛の長さが重力によって伸びてしまう ちょっと重い
  14.         // できそうなこと:ビットマップにピクセルで描いて縮小するようにすれば、軽くなるかも。パーティクルを制御すれば、地面と毛が接する表現になるかも
  15.         
  16.         public static const STAGE_W:uint = 465;
  17.         public static const STAGE_H:uint = 465;
  18.         
  19.         public static const SPHERE_R:Number = 40;        // マリモの体の(毛以外の部分の)半径。
  20.     
  21.         public static const PARTICLE_NUM_RATE:uint = 60;    // 球体の半円を分割する数。
  22.         public static const PARTICLE_STEP:uint = 5;    // 線の描画回数。大きいほど長くなる。
  23.         public static const PARTICLE_V:uint = 10;    // 線の勢い。大きいほど長く、粗くなる。
  24.         public static const GRAVITY:Number = 1.2;    // 重力。毛の長さ補正をしていないので、重力が強すぎると毛が伸びる    
  25.         public static const RANDOM_RATE:Number = 0.4;    // バラつき具合        
  26.         public static const COLOR_RANDOM_RATE:Number = 0.3;    // 色のバラつき具合        
  27.         
  28.         public static const GROUND_Y:Number = 400;    // 地面位置    
  29.         public static const SHADOW_W:Number = 150;    // 影サイズ
  30.         public static const GROUND_H:Number = 30;    // 影サイズ
  31.         
  32.         private var _marimoX:Number = STAGE_W/2;    // マリモの位置
  33.         private var _marimoY:Number = STAGE_H/2;
  34.         private var _display:BitmapData;
  35.         private var _display2:Sprite;
  36.         
  37.         public static const COLOR_TIP_TOP:Number     = 0x77cc44;        // 毛先上部
  38.         public static const COLOR_TIP_BOTTOM:Number  = 0x339900;        // 毛先下部
  39.         public static const COLOR_BACE_TOP:Number    = 0x337711;        // 本体上部
  40.         public static const COLOR_BACE_BOTTOM:Number = 0x000000;        // 本体下部
  41.         
  42.         public function Marimo() {
  43.             // 準備
  44.             _display = new BitmapData(STAGE_W, STAGE_H, false, 0xffffff);
  45.             addChild(new Bitmap(_display)); // (できればこっちに描画して軽量化したい)
  46.             _display2 = new Sprite();
  47.             //addChild(_display2);
  48.             
  49.             // 描画
  50.             var g:Graphics = _display2.graphics;
  51.             
  52.             // 本体
  53.             g.beginFill(COLOR_BACE_BOTTOM);
  54.             g.drawCircle(_marimoX, _marimoY, SPHERE_R);
  55.             g.endFill();
  56.             // 毛
  57.             for (var xri:uint = 0; xri < PARTICLE_NUM_RATE; xri++){    // zを先に計算して、奥から手前へ描画
  58.                 var xAngle:Number = Math.PI*xri / PARTICLE_NUM_RATE;    // マリモ中心点から、マリモ表面へのx方向に対する角度
  59.                 var z:Number = Math.cos(xAngle) * SPHERE_R;                // パーティクルを飛ばす原点Z
  60.                 var r:Number = Math.sin(xAngle) * SPHERE_R;                // その時の、断面の半径
  61.                 
  62.                 // z方向に向いた面の円周上にある点の数。円周の比(=半径の比)で割り出すが、整数に丸めるので、正確ではない。
  63.                 // (右側でそろっちゃうのが気持ち悪い。ランダムでz回転させてもいいかも。)
  64.                 var particleRateZ:int = PARTICLE_NUM_RATE * 2 * r / SPHERE_R;
  65.                 
  66.                 for (var zri:uint = 0; zri < particleRateZ; zri++){    // z方向面に対して、時計回りに描画
  67.                     var zAngle:Number = Math.PI*zri*2 / particleRateZ;    // マリモ中心点から、マリモ表面へのz方向に対する角度
  68.                     var x:Number = Math.cos(zAngle) * r;    // パーティクルを飛ばす原点X
  69.                     var y:Number = Math.sin(zAngle) * r;    // パーティクルを飛ばす原点Y
  70.                     var vx:Number = PARTICLE_V * x / SPHERE_R;    // パーティクルの速度X
  71.                     var vy:Number = PARTICLE_V * y / SPHERE_R;    // パーティクルの速度Y
  72.                     // 方向をランダムでバラす。(本来は、円形方向へランダムにしなきゃいけないのだけど、面倒なのでこれで)
  73.                     vx += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  74.                     vy += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  75.                     
  76.                     // 色を決める。上下の位置と、根本までの割合で色を決定する。ランダムもちょっと入れておく。
  77.                     var yColorRate:Number = ((SPHERE_R + y)/ 2 / SPHERE_R) + COLOR_RANDOM_RATE * (0.5 - Math.random());
  78.                     var color0:Number = mixColor(COLOR_BACE_TOP, COLOR_BACE_BOTTOM, yColorRate);
  79.                     var color1:Number = mixColor(COLOR_TIP_TOP, COLOR_TIP_BOTTOM, yColorRate);
  80.                     
  81.                     // 毛
  82.                     drawFur(_marimoX + x, _marimoY + y, vx, vy, color0, color1);
  83.                 }
  84.                 
  85.             }
  86.             // 影
  87.             var gradientMatrix:Matrix = new Matrix();
  88.             gradientMatrix.createGradientBox(SHADOW_W, GROUND_H, 0, _marimoX - SHADOW_W/2, GROUND_Y-GROUND_H/2);
  89.             g.beginGradientFill(GradientType.RADIAL, [0x000000, 0x000000], [0.30.0], [60255], gradientMatrix);    // グラデーションわけわからん・・・
  90.             g.drawRect(00, STAGE_W, STAGE_H);
  91.             g.endFill();
  92.                         // user:uwiのアドバイスに従い、bitmapにして固定化(表示中にブラウザが重くなるのを防ぐ効果)
  93.                         _display.draw(_display2);
  94.         }
  95.         
  96.         // 毛を描く
  97.         private function drawFur(x:Number, y:Number, vx:Number, vy:Number, color0:Number, color1:Number):void{
  98.             var lastX:Number;
  99.             var lastY:Number;
  100.             for (var i:uint=0; i<PARTICLE_STEP; i++){
  101.                 lastX = x;
  102.                 lastY = y;
  103.                 vy += GRAVITY;
  104.                 x += vx;
  105.                 y += vy;
  106.                 drawLine(lastX, lastY, x, y, mixColor(color0, color1, i/PARTICLE_STEP), 1 - i/PARTICLE_STEP);
  107.             }
  108.         }
  109.         
  110.         // 線を引く(ピクセルを打つ方法と、どっちが軽いかな)
  111.         private function drawLine(x0:Number, y0:Number, x1:Number, y1:Number, color:uint, alpha:Number):void{
  112.             var g:Graphics = _display2.graphics;
  113.             g.lineStyle(1, color, alpha);
  114.             g.moveTo(x0, y0);
  115.             g.lineTo(x1, y1);
  116.         }
  117.         
  118.         // 2つの色を指定した割合で混ぜた色を返す(rate=0ならcolor0)。(ここもかなり軽量化できるはず。グラデーションをキャッシュとして使うとか)
  119.         private function mixColor(color0:uint, color1:uint, rate:Number):uint{
  120.             if (rate <= 0return color0;
  121.             if (rate >= 1return color1;
  122.             var r:uint = (color0>>16) * (1-rate) 
  123.                             + (color1>>16) * rate;
  124.             var g:uint = ((color0 & 0x00ff00 ) >>8) * (1-rate) 
  125.                             + ((color1 & 0x00ff00 ) >>8) * rate;
  126.             var b:uint = (color0 & 0xff) * (1-rate) 
  127.                             + (color1 & 0xff) * rate;
  128.              return (r << 16) | (g << 8) | (b);
  129.         }
  130.         
  131.     }
  132. }
noswf
  1. // forked from tail_y's Marimo
  2. package {
  3.     import flash.display.Bitmap;
  4.     import flash.display.BitmapData;
  5.     import flash.display.GradientType;
  6.     import flash.display.Graphics;
  7.     import flash.display.Sprite;
  8.     import flash.events.Event;
  9.     import flash.events.MouseEvent;
  10.     import flash.filters.DisplacementMapFilter;
  11.     import flash.geom.Matrix;
  12.     import flash.geom.Rectangle;
  13.     import flash.utils.getTimer;
  14.     import flash.display.BitmapDataChannel;
  15.     public class Marimo extends Sprite {
  16.         // 空飛ぶマリモ的な物を作る。
  17.         // 実際の構造は、マリモというか、やわらかいウニ。
  18.         // 球形の表面からパーティクルを飛ばして、それを線で繋ぐ。
  19.         // 問題点:線のつなぎ目が汚い 毛の長さが重力によって伸びてしまう ちょっと重い
  20.         // できそうなこと:ビットマップにピクセルで描いて縮小するようにすれば、軽くなるかも。パーティクルを制御すれば、地面と毛が接する表現になるかも
  21.         
  22.         public static const STAGE_W:uint = 465;
  23.         public static const STAGE_H:uint = 465;
  24.         
  25.         public static const SPHERE_R:Number = 40;        // マリモの体の(毛以外の部分の)半径。
  26.     
  27.         public static const PARTICLE_NUM_RATE:uint = 40;    // 球体の半円を分割する数。
  28.         public static const PARTICLE_STEP:uint = 5;    // 線の描画回数。大きいほど長くなる。
  29.         public static const PARTICLE_V:uint = 10;    // 線の勢い。大きいほど長く、粗くなる。
  30.         public static const GRAVITY:Number = 1;    // 重力。毛の長さ補正をしていないので、重力が強すぎると毛が伸びる    
  31.         public static const RANDOM_RATE:Number = 0.4;    // バラつき具合        
  32.         public static const COLOR_RANDOM_RATE:Number = 0.3;    // 色のバラつき具合        
  33.         
  34.         public static const GROUND_Y:Number = 400;    // 地面位置    
  35.         public static const SHADOW_W:Number = 150;    // 影サイズ
  36.         public static const GROUND_H:Number = 30;    // 影サイズ
  37.         
  38.         private var _marimoX:Number = STAGE_W/2;    // マリモの位置
  39.         private var _marimoY:Number = STAGE_H/2;
  40.         private var _display:Bitmap;
  41.         private var _shadow:Bitmap;
  42.         
  43.         private var dispFilter:DisplacementMapFilter;
  44.         private var _buffer:BitmapData;
  45.         
  46.         public static const COLOR_TIP_TOP:Number     = 0x77cc44;        // 毛先上部
  47.         public static const COLOR_TIP_BOTTOM:Number  = 0x339900;        // 毛先下部
  48.         public static const COLOR_BACE_TOP:Number    = 0x337711;        // 本体上部
  49.         public static const COLOR_BACE_BOTTOM:Number = 0x000000;        // 本体下部
  50.         
  51.         public function Marimo() {
  52.             // 準備
  53.             var _display2:Sprite = new Sprite();
  54.             
  55.             // 描画
  56.             var g:Graphics = _display2.graphics;
  57.             
  58.             // 影
  59.             g.clear();
  60.             var gradientMatrix:Matrix = new Matrix();
  61.             gradientMatrix.createGradientBox(SHADOW_W, GROUND_H, 000);
  62.             g.beginGradientFill(GradientType.RADIAL, [0x000000, 0x000000], [0.30.0], [60255], gradientMatrix);    // グラデーションわけわからん・・・
  63.             g.drawRect(00, STAGE_W, STAGE_H);
  64.             g.endFill();
  65.             b = _display2.getBounds(_display2.parent);
  66.             _shadow = new Bitmap(new BitmapData(b.width, b.height));
  67.             _shadow.bitmapData.draw(_display2, new Matrix(10010,0));
  68.             addChild(_shadow);
  69.             // 本体
  70.             g.clear();
  71.             g.beginFill(COLOR_BACE_BOTTOM);
  72.             g.drawCircle(00, SPHERE_R);
  73.             g.endFill();
  74.             // 毛
  75.             for (var xri:uint = 0; xri < PARTICLE_NUM_RATE; xri++){    // zを先に計算して、奥から手前へ描画
  76.                 var xAngle:Number = Math.PI*xri / PARTICLE_NUM_RATE;    // マリモ中心点から、マリモ表面へのx方向に対する角度
  77.                 var z:Number = Math.cos(xAngle) * SPHERE_R;                // パーティクルを飛ばす原点Z
  78.                 var r:Number = Math.sin(xAngle) * SPHERE_R;                // その時の、断面の半径
  79.                 
  80.                 // z方向に向いた面の円周上にある点の数。円周の比(=半径の比)で割り出すが、整数に丸めるので、正確ではない。
  81.                 // (右側でそろっちゃうのが気持ち悪い。ランダムでz回転させてもいいかも。)
  82.                 var particleRateZ:int = PARTICLE_NUM_RATE * 2 * r / SPHERE_R;
  83.                 
  84.                 for (var zri:uint = 0; zri < particleRateZ; zri++){    // z方向面に対して、時計回りに描画
  85.                     var zAngle:Number = Math.PI*zri*2 / particleRateZ;    // マリモ中心点から、マリモ表面へのz方向に対する角度
  86.                     var x:Number = Math.cos(zAngle) * r;    // パーティクルを飛ばす原点X
  87.                     var y:Number = Math.sin(zAngle) * r;    // パーティクルを飛ばす原点Y
  88.                     var vx:Number = PARTICLE_V * x / SPHERE_R;    // パーティクルの速度X
  89.                     var vy:Number = PARTICLE_V * y / SPHERE_R;    // パーティクルの速度Y
  90.                     // 方向をランダムでバラす。(本来は、円形方向へランダムにしなきゃいけないのだけど、面倒なのでこれで)
  91.                     vx += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  92.                     vy += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  93.                     
  94.                     // 色を決める。上下の位置と、根本までの割合で色を決定する。ランダムもちょっと入れておく。
  95.                     var yColorRate:Number = ((SPHERE_R + y)/ 2 / SPHERE_R) + COLOR_RANDOM_RATE * (0.5 - Math.random());
  96.                     var color0:Number = mixColor(COLOR_BACE_TOP, COLOR_BACE_BOTTOM, yColorRate);
  97.                     var color1:Number = mixColor(COLOR_TIP_TOP, COLOR_TIP_BOTTOM, yColorRate);
  98.                     
  99.                     // 毛
  100.                     drawFur(_display2.graphics, x, y, vx, vy, color0, color1);
  101.                 }
  102.                 
  103.             }
  104.             var b:Rectangle = _display2.getBounds(_display2.parent);
  105.             _display = new Bitmap(new BitmapData(b.width, b.height, true, 0x0));
  106.             _display.bitmapData.draw(_display2, new Matrix(1,0,0,1, -b.x, -b.y));
  107.             addChild(_display);
  108.             
  109.             var bd:BitmapData = new BitmapData(_display.width, _display.height);
  110.             _buffer = bd.clone();
  111.             bd.perlinNoise(40406, Math.floor(Math.random() * 10) , truetrue, BitmapDataChannel.RED, true);
  112.             dispFilter = new DisplacementMapFilter(bd, null, BitmapDataChannel.RED, BitmapDataChannel.RED, 0,0 );
  113.             _display.filters = [dispFilter];
  114.             
  115.             stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  116.         }
  117.         
  118.         private function enterFrameHandler(e:Event):void 
  119.         {
  120.             scrollFilter();
  121.             _display.x = mouseX - _display.width * 0.5;
  122.             _display.y = mouseY - _display.height * 0.5;
  123.             _shadow.x = _display.x;
  124.             _shadow.y = GROUND_Y;
  125.             var scale:Number = 4*Math.sin(getTimer() * 0.005);
  126.             dispFilter.scaleX = scale;
  127.             dispFilter.scaleY = scale;
  128.             _display.filters = [dispFilter];
  129.         }
  130.         private function scrollFilter():void {
  131.             var bd:BitmapData = dispFilter.mapBitmap;
  132.             _buffer.draw(bd, new Matrix(100102));
  133.             _buffer.draw(bd, new Matrix(10010, -(bd.rect.height - 2)));
  134.             bd.draw(_buffer);
  135.         }
  136.                 
  137.         // 毛を描く
  138.         private function drawFur(g:Graphics, x:Number, y:Number, vx:Number, vy:Number, color0:Number, color1:Number):void{
  139.             var lastX:Number;
  140.             var lastY:Number;
  141.             for (var i:uint=0; i<PARTICLE_STEP; i++){
  142.                 lastX = x;
  143.                 lastY = y;
  144.                 vy += GRAVITY;
  145.                 x += vx;
  146.                 y += vy;
  147.                 drawLine(g, lastX, lastY, x, y, mixColor(color0, color1, i/PARTICLE_STEP), 1 - i/PARTICLE_STEP);
  148.             }
  149.         }
  150.         
  151.         // 線を引く(ピクセルを打つ方法と、どっちが軽いかな)
  152.         private function drawLine(g:Graphics, x0:Number, y0:Number, x1:Number, y1:Number, color:uint, alpha:Number):void{
  153.             //var g:Graphics = _display2.graphics;
  154.             g.lineStyle(2, color, alpha);
  155.             g.moveTo(x0, y0);
  156.             g.lineTo(x1, y1);
  157.         }
  158.         
  159.         // 2つの色を指定した割合で混ぜた色を返す(rate=0ならcolor0)。(ここもかなり軽量化できるはず。グラデーションをキャッシュとして使うとか)
  160.         private function mixColor(color0:uint, color1:uint, rate:Number):uint{
  161.             if (rate <= 0return color0;
  162.             if (rate >= 1return color1;
  163.             var r:uint = (color0>>16) * (1-rate) 
  164.                             + (color1>>16) * rate;
  165.             var g:uint = ((color0 & 0x00ff00 ) >>8) * (1-rate) 
  166.                             + ((color1 & 0x00ff00 ) >>8) * rate;
  167.             var b:uint = (color0 & 0xff) * (1-rate) 
  168.                             + (color1 & 0xff) * rate;
  169.              return (r << 16) | (g << 8) | (b);
  170.         }
  171.         
  172.     }
  173. }
noswf
  1. // forked from tail_y's Marimo
  2. package {
  3.     import flash.display.Bitmap;
  4.     import flash.display.BitmapData;
  5.     import flash.display.GradientType;
  6.     import flash.display.Graphics;
  7.     import flash.display.Sprite;
  8.     import flash.geom.Matrix;
  9.     public class Marimo extends Sprite {
  10.         // 空飛ぶマリモ的な物を作る。
  11.         // 実際の構造は、マリモというか、やわらかいウニ。
  12.         // 球形の表面からパーティクルを飛ばして、それを線で繋ぐ。
  13.         // 問題点:線のつなぎ目が汚い 毛の長さが重力によって伸びてしまう ちょっと重い
  14.         // できそうなこと:ビットマップにピクセルで描いて縮小するようにすれば、軽くなるかも。パーティクルを制御すれば、地面と毛が接する表現になるかも
  15.         
  16.         public static const STAGE_W:uint = 465;
  17.         public static const STAGE_H:uint = 465;
  18.         
  19.         public static const SPHERE_R:Number = 40;        // マリモの体の(毛以外の部分の)半径。
  20.     
  21.         public static const PARTICLE_NUM_RATE:uint = 60;    // 球体の半円を分割する数。
  22.         public static const PARTICLE_STEP:uint = 6;    // 線の描画回数。大きいほど長くなる。
  23.         public static const PARTICLE_V:uint = 10;    // 線の勢い。大きいほど長く、粗くなる。
  24.         public static const GRAVITY:Number = 0;    // 重力。毛の長さ補正をしていないので、重力が強すぎると毛が伸びる    
  25.         public static const RANDOM_RATE:Number = 0.4;    // バラつき具合        
  26.         public static const COLOR_RANDOM_RATE:Number = 1;    // 色のバラつき具合        
  27.         
  28.         public static const GROUND_Y:Number = 400;    // 地面位置    
  29.         public static const SHADOW_W:Number = 150;    // 影サイズ
  30.         public static const GROUND_H:Number = 30;    // 影サイズ
  31.         
  32.         private var _marimoX:Number = STAGE_W/2;    // マリモの位置
  33.         private var _marimoY:Number = STAGE_H/2;
  34.         private var _display:BitmapData;
  35.         private var _display2:Sprite;
  36.         
  37.         public static const COLOR_TIP_TOP:Number     = 0x77cc44;        // 毛先上部
  38.         public static const COLOR_TIP_BOTTOM:Number  = 0x339900;        // 毛先下部
  39.         public static const COLOR_BACE_TOP:Number    = 0x337711;        // 本体上部
  40.         public static const COLOR_BACE_BOTTOM:Number = 0x000000;        // 本体下部
  41.         
  42.         public function Marimo() {
  43.             // 準備
  44.             _display = new BitmapData(STAGE_W, STAGE_H, false, 0xffffff);
  45.             addChild(new Bitmap(_display)); // (できればこっちに描画して軽量化したい)
  46.             _display2 = new Sprite();
  47.             //addChild(_display2);
  48.             
  49.             // 描画
  50.             var g:Graphics = _display2.graphics;
  51.             
  52.             // 本体
  53.             g.beginFill(COLOR_BACE_BOTTOM);
  54.             g.drawCircle(_marimoX, _marimoY, SPHERE_R);
  55.             g.endFill();
  56.             // 毛
  57.             for (var xri:uint = 0; xri < PARTICLE_NUM_RATE; xri++){    // zを先に計算して、奥から手前へ描画
  58.                 var xAngle:Number = Math.PI*xri / PARTICLE_NUM_RATE;    // マリモ中心点から、マリモ表面へのx方向に対する角度
  59.                 var z:Number = Math.cos(xAngle) * SPHERE_R;                // パーティクルを飛ばす原点Z
  60.                 var r:Number = Math.sin(xAngle) * SPHERE_R;                // その時の、断面の半径
  61.                 
  62.                 // z方向に向いた面の円周上にある点の数。円周の比(=半径の比)で割り出すが、整数に丸めるので、正確ではない。
  63.                 // (右側でそろっちゃうのが気持ち悪い。ランダムでz回転させてもいいかも。)
  64.                 var particleRateZ:int = PARTICLE_NUM_RATE * 2 * r / SPHERE_R;
  65.                 
  66.                 for (var zri:uint = 0; zri < particleRateZ; zri++){    // z方向面に対して、時計回りに描画
  67.                     var zAngle:Number = Math.PI*zri*2 / particleRateZ;    // マリモ中心点から、マリモ表面へのz方向に対する角度
  68.                     var x:Number = Math.cos(zAngle) * r;    // パーティクルを飛ばす原点X
  69.                     var y:Number = Math.sin(zAngle) * r;    // パーティクルを飛ばす原点Y
  70.                     var vx:Number = PARTICLE_V * x / SPHERE_R;    // パーティクルの速度X
  71.                     var vy:Number = PARTICLE_V * y / SPHERE_R;    // パーティクルの速度Y
  72.                     // 方向をランダムでバラす。(本来は、円形方向へランダムにしなきゃいけないのだけど、面倒なのでこれで)
  73.                     vx += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  74.                     vy += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  75.                     
  76.                     // 色を決める。上下の位置と、根本までの割合で色を決定する。ランダムもちょっと入れておく。
  77.                     var yColorRate:Number = ((SPHERE_R + y)/ 2 / SPHERE_R) + COLOR_RANDOM_RATE * (0.5 - Math.random());
  78.                     var color0:Number = mixColor(COLOR_BACE_TOP, COLOR_BACE_BOTTOM, yColorRate);
  79.                     var color1:Number = mixColor(COLOR_TIP_TOP, COLOR_TIP_BOTTOM, yColorRate);
  80.                     
  81.                     // 毛
  82.                     drawFur(_marimoX + x, _marimoY + y, vx, vy, color0, color1);
  83.                 }
  84.                 
  85.             }
  86.             // 影
  87.             var gradientMatrix:Matrix = new Matrix();
  88.             gradientMatrix.createGradientBox(SHADOW_W, GROUND_H, 0, _marimoX - SHADOW_W/2, GROUND_Y-GROUND_H/2);
  89.             g.beginGradientFill(GradientType.RADIAL, [0x000000, 0x000000], [0.30.0], [60255], gradientMatrix);    // グラデーションわけわからん・・・
  90.             g.drawRect(00, STAGE_W, STAGE_H);
  91.             g.endFill();
  92.                         // user:uwiのアドバイスに従い、bitmapにして固定化(表示中にブラウザが重くなるのを防ぐ効果)
  93.                         _display.draw(_display2);
  94.         }
  95.         
  96.         // 毛を描く
  97.         private function drawFur(x:Number, y:Number, vx:Number, vy:Number, color0:Number, color1:Number):void{
  98.             var lastX:Number;
  99.             var lastY:Number;
  100.             for (var i:uint=0; i<PARTICLE_STEP; i++){
  101.                 lastX = x;
  102.                 lastY = y;
  103.                 vy += GRAVITY;
  104.                 x += vx;
  105.                 y += vy;
  106.                 drawLine(lastX, lastY, x, y, mixColor(color0, color1, i/PARTICLE_STEP), 1 - i/PARTICLE_STEP);
  107.             }
  108.         }
  109.         
  110.         // 線を引く(ピクセルを打つ方法と、どっちが軽いかな)
  111.         private function drawLine(x0:Number, y0:Number, x1:Number, y1:Number, color:uint, alpha:Number):void{
  112.             var g:Graphics = _display2.graphics;
  113.             g.lineStyle(1, color, alpha);
  114.             g.moveTo(x0, y0);
  115.             g.lineTo(x1, y1);
  116.         }
  117.         
  118.         // 2つの色を指定した割合で混ぜた色を返す(rate=0ならcolor0)。(ここもかなり軽量化できるはず。グラデーションをキャッシュとして使うとか)
  119.         private function mixColor(color0:uint, color1:uint, rate:Number):uint{
  120.             if (rate <= 0return color0;
  121.             if (rate >= 1return color1;
  122.             var r:uint = (color0>>16) * (1-rate) 
  123.                             + (color1>>16) * rate;
  124.             var g:uint = ((color0 & 0x00ff00 ) >>8) * (1-rate) 
  125.                             + ((color1 & 0x00ff00 ) >>8) * rate;
  126.             var b:uint = (color0 & 0xff) * (1-rate) 
  127.                             + (color1 & 0xff) * rate;
  128.              return (r << 16) | (g << 8) | (b);
  129.         }
  130.         
  131.     }
  132. }
noswf
  1. // forked from tail_y's Marimo
  2. package {
  3.     import flash.display.Bitmap;
  4.     import flash.display.BitmapData;
  5.     import flash.display.GradientType;
  6.     import flash.display.Graphics;
  7.     import flash.display.Sprite;
  8.     import flash.geom.Matrix;
  9.     public class Marimo extends Sprite {
  10.         // 空飛ぶマリモ的な物を作る。
  11.         // 実際の構造は、マリモというか、やわらかいウニ。
  12.         // 球形の表面からパーティクルを飛ばして、それを線で繋ぐ。
  13.         // 問題点:線のつなぎ目が汚い 毛の長さが重力によって伸びてしまう ちょっと重い
  14.         // できそうなこと:ビットマップにピクセルで描いて縮小するようにすれば、軽くなるかも。パーティクルを制御すれば、地面と毛が接する表現になるかも
  15.         
  16.         public static const STAGE_W:uint = 465;
  17.         public static const STAGE_H:uint = 465;
  18.         
  19.         public static const SPHERE_R:Number = 90;        // マリモの体の(毛以外の部分の)半径。
  20.     
  21.         public static const PARTICLE_NUM_RATE:uint = 100;    // 球体の半円を分割する数。
  22.         public static const PARTICLE_STEP:uint = 5;    // 線の描画回数。大きいほど長くなる。
  23.         public static const PARTICLE_V:uint = 10;    // 線の勢い。大きいほど長く、粗くなる。
  24.         public static const GRAVITY:Number = 1.2;    // 重力。毛の長さ補正をしていないので、重力が強すぎると毛が伸びる    
  25.         public static const RANDOM_RATE:Number = 0.4;    // バラつき具合        
  26.         public static const COLOR_RANDOM_RATE:Number = 0.3;    // 色のバラつき具合        
  27.         
  28.         public static const GROUND_Y:Number = 400;    // 地面位置    
  29.         public static const SHADOW_W:Number = 150;    // 影サイズ
  30.         public static const GROUND_H:Number = 30;    // 影サイズ
  31.         
  32.         private var _marimoX:Number = STAGE_W/2;    // マリモの位置
  33.         private var _marimoY:Number = STAGE_H/2;
  34.         private var _display:BitmapData;
  35.         private var _display2:Sprite;
  36.         
  37.         public static const COLOR_TIP_TOP:Number     = 0x77cc44;        // 毛先上部
  38.         public static const COLOR_TIP_BOTTOM:Number  = 0x339900;        // 毛先下部
  39.         public static const COLOR_BACE_TOP:Number    = 0x337711;        // 本体上部
  40.         public static const COLOR_BACE_BOTTOM:Number = 0x000000;        // 本体下部
  41.         
  42.         public function Marimo() {
  43.             // 準備
  44.             _display = new BitmapData(STAGE_W, STAGE_H, false, 0xffffff);
  45.             addChild(new Bitmap(_display)); // (できればこっちに描画して軽量化したい)
  46.             _display2 = new Sprite();
  47.             //addChild(_display2);
  48.             
  49.             // 描画
  50.             var g:Graphics = _display2.graphics;
  51.             
  52.             // 本体
  53.             g.beginFill(COLOR_BACE_BOTTOM);
  54.             g.drawCircle(_marimoX, _marimoY, SPHERE_R);
  55.             g.endFill();
  56.             // 毛
  57.             for (var xri:uint = 0; xri < PARTICLE_NUM_RATE; xri++){    // zを先に計算して、奥から手前へ描画
  58.                 var xAngle:Number = Math.PI*xri / PARTICLE_NUM_RATE;    // マリモ中心点から、マリモ表面へのx方向に対する角度
  59.                 var z:Number = Math.cos(xAngle) * SPHERE_R;                // パーティクルを飛ばす原点Z
  60.                 var r:Number = Math.sin(xAngle) * SPHERE_R;                // その時の、断面の半径
  61.                 
  62.                 // z方向に向いた面の円周上にある点の数。円周の比(=半径の比)で割り出すが、整数に丸めるので、正確ではない。
  63.                 // (右側でそろっちゃうのが気持ち悪い。ランダムでz回転させてもいいかも。)
  64.                 var particleRateZ:int = PARTICLE_NUM_RATE * 2 * r / SPHERE_R;
  65.                 
  66.                 for (var zri:uint = 0; zri < particleRateZ; zri++){    // z方向面に対して、時計回りに描画
  67.                     var zAngle:Number = Math.PI*zri*2 / particleRateZ;    // マリモ中心点から、マリモ表面へのz方向に対する角度
  68.                     var x:Number = Math.cos(zAngle) * r;    // パーティクルを飛ばす原点X
  69.                     var y:Number = Math.sin(zAngle) * r;    // パーティクルを飛ばす原点Y
  70.                     var vx:Number = PARTICLE_V * x / SPHERE_R;    // パーティクルの速度X
  71.                     var vy:Number = PARTICLE_V * y / SPHERE_R;    // パーティクルの速度Y
  72.                     // 方向をランダムでバラす。(本来は、円形方向へランダムにしなきゃいけないのだけど、面倒なのでこれで)
  73.                     vx += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  74.                     vy += (PARTICLE_V * RANDOM_RATE) * (0.5 - Math.random());
  75.                     
  76.                     // 色を決める。上下の位置と、根本までの割合で色を決定する。ランダムもちょっと入れておく。
  77.                     var yColorRate:Number = ((SPHERE_R + y)/ 2 / SPHERE_R) + COLOR_RANDOM_RATE * (0.5 - Math.random());
  78.                     var color0:Number = mixColor(COLOR_BACE_TOP, COLOR_BACE_BOTTOM, yColorRate);
  79.                     var color1:Number = mixColor(COLOR_TIP_TOP, COLOR_TIP_BOTTOM, yColorRate);
  80.                     
  81.                     // 毛
  82.                     drawFur(_marimoX + x, _marimoY + y, vx, vy, color0, color1);
  83.                 }
  84.                 
  85.             }
  86.             // 影
  87.             //var gradientMatrix:Matrix = new Matrix();
  88.             //gradientMatrix.createGradientBox(SHADOW_W, GROUND_H, 0, _marimoX - SHADOW_W/2, GROUND_Y-GROUND_H/2);
  89.             //g.beginGradientFill(GradientType.RADIAL, [0x000000, 0x000000], [0.3, 0.0], [60, 255], gradientMatrix);    // グラデーションわけわからん・・・
  90.             //g.drawRect(0, 0, STAGE_W, STAGE_H);
  91.             //g.endFill();
  92.                         // user:uwiのアドバイスに従い、bitmapにして固定化(表示中にブラウザが重くなるのを防ぐ効果)
  93.                         _display.draw(_display2);
  94.         }
  95.         
  96.         // 毛を描く
  97.         private function drawFur(x:Number, y:Number, vx:Number, vy:Number, color0:Number, color1:Number):void{
  98.             var lastX:Number;
  99.             var lastY:Number;
  100.             for (var i:uint=0; i<PARTICLE_STEP; i++){
  101.                 lastX = x;
  102.                 lastY = y;
  103.                 vy += GRAVITY;
  104.                 x += vx;
  105.                 y += vy;
  106.                 drawLine(lastX, lastY, x, y, mixColor(color0, color1, i/PARTICLE_STEP), 1 - i/PARTICLE_STEP);
  107.             }
  108.         }
  109.         
  110.         // 線を引く(ピクセルを打つ方法と、どっちが軽いかな)
  111.         private function drawLine(x0:Number, y0:Number, x1:Number, y1:Number, color:uint, alpha:Number):void{
  112.             var g:Graphics = _display2.graphics;
  113.             g.lineStyle(1, color, alpha);
  114.             g.moveTo(x0, y0);
  115.             g.lineTo(x1, y1);
  116.         }
  117.         
  118.         // 2つの色を指定した割合で混ぜた色を返す(rate=0ならcolor0)。(ここもかなり軽量化できるはず。グラデーションをキャッシュとして使うとか)
  119.         private function mixColor(color0:uint, color1:uint, rate:Number):uint{
  120.             if (rate <= 0return color0;
  121.             if (rate >= 1return color1;
  122.             var r:uint = (color0>>16) * (1-rate) 
  123.                             + (color1>>16) * rate;
  124.             var g:uint = ((color0 & 0x00ff00 ) >>8) * (1-rate) 
  125.                             + ((color1 & 0x00ff00 ) >>8) * rate;
  126.             var b:uint = (color0 & 0xff) * (1-rate) 
  127.                             + (color1 & 0xff) * rate;
  128.              return (r << 16) | (g << 8) | (b);
  129.         }
  130.         
  131.     }
  132. }
noswf
Get Adobe Flash Player