/* 各点がそれぞれの一つ前の点を万有引力もどきの法則で追いかける。 MAX_SPEEDの値を大きく(10以上)するとライン系のスクリーンセーバーっぽく見えなくもない。 83行目あたりの colorTransform のアルファのオフセットを0にしても楽しい。 */ package { import flash.display.MovieClip; import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.Event; import flash.geom.Point; import flash.geom.ColorTransform; [SWF(width="400", height="400", backgroundColor="0x000000", frameRate="30")] public class Index extends MovieClip { private const PI:Number = Math.PI; private const NUM:uint=100; private const MAX_SPEED:uint=4; private var ptArray:Array=[]; //各点 private var tgtArray:Array=[]; //各ターゲット private var radArray:Array=[]; //各点のターゲットとの角度 private var spArray:Array=[]; //各点の速度、2次元配列 private var org_mc:MovieClip = new MovieClip(); private var bmpDat:BitmapData = new BitmapData(400, 400, false, 0x000000); private var bmp:Bitmap = new Bitmap(bmpDat); public function Index():void { //最初の点 ptArray.push( new Point(200, 0) ); mcInit( new Point(200, 200) ); //以降の点 for(var i:uint=1; i<NUM; i++){ ptArray.push( new Point(200, 0) ); mcInit( ptArray[i-1] ); } addChild(bmp); addEventListener(Event.ENTER_FRAME, mv); } private function mcInit(tgt:Object):void { tgtArray.push( tgt ); radArray.push(0); spArray.push( [0, 0] ); } private function mv(evt:Event):void { org_mc.graphics.clear(); org_mc.graphics.lineStyle(1, 0xFFFFFF, 0.2); org_mc.graphics.moveTo(ptArray[0].x, ptArray[0].y); for(var i:uint=0; i<NUM; i++){ radArray[i] = Math.atan2( tgtArray[i].y-ptArray[i].y, tgtArray[i].x-ptArray[i].x ); var dd:Number = (tgtArray[i].y-ptArray[i].y)*(tgtArray[i].y-ptArray[i].y) + (tgtArray[i].x-ptArray[i].x)*(tgtArray[i].x-ptArray[i].x); if(dd<1){ dd = 1; } else if(dd > 2){ dd = 2; } spArray[i][0] += Math.cos( radArray[i] ) / dd; spArray[i][1] += Math.sin( radArray[i] ) / dd; if(spArray[i][0] > MAX_SPEED){ spArray[i][0] = MAX_SPEED; } else if(spArray[i][0] < -MAX_SPEED){ spArray[i][0] = -MAX_SPEED; } if(spArray[i][1] > MAX_SPEED){ spArray[i][1] = MAX_SPEED; } else if(spArray[i][1] < -MAX_SPEED){ spArray[i][1] = -MAX_SPEED; } ptArray[i].x += spArray[i][0]; ptArray[i].y += spArray[i][1]; org_mc.graphics.lineTo(ptArray[i].x, ptArray[i].y); } bmpDat.colorTransform( bmpDat.rect, new ColorTransform(1, 1, 1, 1, -5, -1, 0, -1) ); bmpDat.draw(org_mc); } } } ライン