あしたから本気出す
利用価値のあるものを工作し、情報発信してみる。
工作
新・自作キーボード
Jw_cadの外部変形の作り方2
Jw_cadの外部変形の作り方
戦前のタイプライターをUSB化してみる。
工作記事をもっと見る
ブログ:最近やっていること
かっこいい電卓発見。
ノートPCのディスプレイが昇天ス
アルミのロウ付けに挑戦
ブログをもっと見る
ダウンロード
JW_WIN外部変形Kiefer
JW_WIN外部変形FastMeasure
お知らせ
2009/9/4 twitter始めました。
2009/7/14 サイトのタイトル変更しました
2008/4/30 サーバーダウンについて

管理者プロフィール (-)
GRAFZ.NET 27歳男
神奈川県生まれ
職業:GRAFZ.NETという屋号でプログラム制作してます。
一言:実用性を形にする。工作の日々。
コンタクトは以下までお願いします
suda@grafz.net
RSS
ブログをRSS配信してます。

最近やってること:
ŋ߂Ă邱
    follow me on Twitter

    © GRAFZ.NET 2008-2009
    10月16日
    スクリプトで超軽量飛行機雲を作る


    beginGradientFillとBlurFilterを使って、飛行機雲をプログラムしてみます。
    完成品はこんな感じです。
    flash player required. Get Adobe Flash player

    ファイル容量は1.48 KBと軽い。 以下ソースです。
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    10:
    11:
    12:
    13:
    14:
    15:
    16:
    17:
    18:
    19:
    20:
    21:
    22:
    23:
    24:
    25:
    26:
    27:
    28:
    29:
    30:
    31:
    32:
    33:
    34:
    35:
    36:
    37:
    38:
    39:
    40:
    41:
    42:
    43:
    44:
    45:
    46:
    47:
    48:
    49:
    50:
    51:
    52:
    53:
    54:
    55:
    56:
    57:
    58:
    59:
    60:
    61:
    62:
    63:
    import flash.geom.Matrix;
    import flash.filters.BlurFilter;

    class MyCloud{
      var mc,mcSrc:MovieClip;
      var arUnit,arFilter,arParamGradationColors,arParamGradationAlphas
        ,arParamGradationRatios:Array;
      var nTimerHide,nSegment,nSpanX,nStepGradation
         ,nAlphaMax,nPositionX:Number;
      var oMatrix:Matrix;
      function MyCloud(mcSrcIn:MovieClip){
        this.mcSrc = mcSrcIn;
        this.mc = _root.createEmptyMovieClip('mcCloud',_root.getNextHighestDepth());
        var owner:Object = this;
        this.mc.onEnterFrame = function(){owner.McOnEnterFrame();}
        
        this.nSpanX = 64;
        this.nSegment = Math.floor(Stage.width / this.nSpanX) + 2;
        this.nStepGradation = 20;
        this.nAlphaMax = 60;
        
        this.arUnit = new Array();
        for(var i=0;i<this.nSegment;i++)this.arUnit.push(new MyCloudUnit(this.arUnit));
        
        this.arParamGradationColors = new Array(0xFFFFFF,0xFFFFFF);
        this.arParamGradationAlphas = new Array(0x00,0x00);
        this.arParamGradationRatios = new Array(0x00,0xFF);
        this.arFilter = new Array(new BlurFilter(10,10,1));
        this.oMatrix = new Matrix();
      }
      function McOnEnterFrame(){
        for(var i=this.arUnit.length - 1;i>0;i--)this.arUnit[i].Update();
        this.arUnit[0].y = this.mcSrc._y;
        this.nPositionX = this.mcSrc._x + this.mcSrc._width;

        this.mc.clear();
        for(var i=0;i<this.arUnit.length - 1;i++){
          this.CalcGradation(i);
          this.DrawGradation(i);
        }
        this.mc.filters = this.arFilter;
      }
      function CalcGradation(i){
        this.arParamGradationAlphas[0] = i * this.nStepGradation;
        this.arParamGradationAlphas[1] = (i + 1) * this.nStepGradation;
        if(this.arParamGradationAlphas[0] > this.nAlphaMax)this.arParamGradationAlphas[0] = this.nAlphaMax;
        if(this.arParamGradationAlphas[1] > this.nAlphaMax)this.arParamGradationAlphas[1] = this.nAlphaMax;
        this.oMatrix.createGradientBox(this.nSpanX,0,0,this.nPositionX,this.arUnit[i].y);
      }
      function DrawGradation(i){
        this.mc.beginGradientFill("linear",this.arParamGradationColors,
            this.arParamGradationAlphas,this.arParamGradationRatios,this.oMatrix);
        this.mc.moveTo(this.nPositionX,this.arUnit[i].y);
        this.mc.lineTo(this.nPositionX,this.arUnit[i].y + this.mcSrc._height);
        this.nPositionX += this.nSpanX;
        this.mc.lineTo(this.nPositionX,this.arUnit[i + 1].y + this.mcSrc._height);
        this.mc.lineTo(this.nPositionX,this.arUnit[i + 1].y);
        this.mc.endFill();
      }
    }
    1行目:beginGradientFillで必要。
    2行目:同じく、BlurFilter。Flash Playerはver8以上対応。
    4行目:MyCloudという名前をつけました。命名はもちろん任意。
    5行目:mcは雲描画用。mcSrcは飛行機のMovieClipで、
    コンストラクタで参照を受け取ります(11行目)。
    6-10行目:変数もろもろ。ちょっと多くてすみません。
    11行目:ここからコンストラクタ。
    12行目:飛行機のMovieClipの参照を格納。
    13行目:空のMovieClip作成。この上に雲を描画します。
    15行目:そのonEnterFrameハンドラで雲を描画します。
    17-20行目:パラメータとかの設定。18行目はちょっと適当・・。
    22行目:飛行機雲を構成するセグメントは、それ自体をクラスに
    してしまいます。arUnitはそれを格納する配列。
    23行目:セグメントのクラスをインスタンス化。
    25-29行目:グラデーションとBlurFilterの設定。ここで色とか変えられます。
    31行目:ここから毎フレームの描画を記述。
    32,33行目:セグメントを変形。
    36行目:前フレームの描画を消す。
    37行目:セグメント毎に、
    38行目:グラデーションを計算して
    39行目:描画。
    40行目:それが終わったら、
    41行目:BlurFilterを適用。MovieClipのfiltersにフィルターの配列を代入
    してやると、フィルターがかかる。関数でもよかったかなと思う。
    43-51行目:各セグメントを塗りつぶすグラデーションを計算。
    変数名が長くてすみません。
    44行目:飛行機の付け根から、1セグメントごとに
    45行目:だんだん雲が濃くなるように、グラデーションのアルファを調整。
    46-49行目:雲が濃くなりすぎると綺麗でないので、適当に最大値設定。
    50行目:グラデーションの基準位置を指定。
    52-62行目:セグメントを描画。

    以下、セグメントのクラス。

    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    10:
    11:
    12:
    13:
    class MyCloudUnit{
      var nIndex,y:Number;
      var arUnit:Array;
      function MyCloudUnit(arUnitIn:Array){
        this.arUnit = arUnitIn;
        this.nIndex = this.arUnit.length;
      }
      function Update(){
        var nNoise:Number = Math.random() * 3;
        nNoise -= 0.5;
        if(this.nIndex)this.y = this.arUnit[this.nIndex - 1].y + nNoise;
      }
    }
    1行目:セグメントのクラス。
    2行目:nIndexは、自分が何番目のセグメントかを格納。
    3行目:セグメントの配列の参照。これはnIndex格納用。
    8行目:毎フレーム実行される関数。雲の変形。
    9,10行目:適当にノイズつけてやる。
    11行目:一つ前のセグメント(があれば、そ)の位置をコピーする。

    そして、以下flaファイルの1フレーム目に記述するソース。
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    10:
    var oCloud:Object = new MyCloud(this.mcSource);

    this.mcSource.onEnterFrame = function(){
      this._xscale = 100 * _root._xmouse / Stage.width;
      if(this._xscale < 5)this._xscale = 5;
      this._yscale = this._xscale;
      var nParam:Number = this._xscale * 0.05;
      this._x = _root._xmouse - this._width * 0.5 + nParam * Math.random();
      this._y = _root._ymouse - this._height * 0.5 + nParam * Math.random();
    }
    1行目:雲クラスをインスタンス化。飛行機のMovieClipを渡します。
    3-10行目:マウス位置に飛行機がくるように毎フレーム実行。
    4-6行目:マウス位置で飛行機の大きさが変わる。
    7行目:適当にノイズつけてやる。
    8,9行目:飛行機の位置を変更

    ダウンロード
    サンプルファイルはこちら

    ご参考になれば幸いです。m(_ _)m