Forked from: nkheart4's forked from: forked from: Smoke of cigarette diff:15 forked from: forked from: forked from: Smoke of cigarette andrewcooper.. forked:0favorite:0lines:88license : MIT License modified : 2012-04-25 04:00:20 Embed Tweet // forked from nkheart4's forked from: forked from: Smoke of cigarette // forked from hacker_7z56ro6o's forked from: Smoke of cigarette // forked from Kay's Smoke of cigarette // forked from Kay's コレを煙にします package { import flash.display.*; import flash.events.*; import flash.geom.*; import flash.filters.*; [SWF(width=465,height=465,backgroundColor=0xFFFFFF ,frameRate=24)] public class Main extends Sprite { private const SW:Number = stage.stageWidth; private const SH:Number = stage.stageHeight; private var hNum:uint = 200; private var vNum:uint = 200; private var noise:Texture; public function Main():void { noise = new Texture(hNum, vNum); addEventListener(Event.ENTER_FRAME, xRun); var bm:Bitmap = new Bitmap(noise); addChild(bm); var smokeSp:Sprite = new Sprite(); addChild(smokeSp); // 煙を描画 // Filterをかけると激重になるため、Lineだけで描画するもAlphaのせいで重い for (var i:uint = 0; i < 32; i++) { var nX:uint = 0; var nY:uint = i; var smoke:Smoke = new Smoke(noise, new Point(nX,nY)); // smoke.x = SW/2; // smoke.y = SH; smoke.age = i*1; smokeSp.addChild(smoke); } var filter:BitmapFilter = new BlurFilter(2, 2, BitmapFilterQuality.HIGH); var myFilters:Array = new Array(); myFilters.push(filter); smokeSp.filters = myFilters; smokeSp.x=300; smokeSp.y=200; } private function xRun(e:Event):void { noise.xDraw(-2,-2); } } } import flash.display.*; import flash.geom.*; import flash.events.*; /* * 座標取得用のBitmapを生成 */ class Texture extends BitmapData { public var point:Point = new Point(0,0); private var seed:uint = Math.floor(Math.random() * 10); private var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.GREEN; public function Texture (w:uint=200, h:uint=200) { super(w, h, true, 0xffffffff); } public function xDraw(pX:Number, pY:Number):void { point.x += pX; point.y += pY; perlinNoise(50, 50, 4, seed, false, true, channels, false, [point]); } } /* * Bitmapから読み取った座標をもとにLineだけで煙を表現 */ class Smoke extends Shape { public var noise:BitmapData; public var bmPoint:Point; public var age:uint = 0; public function Smoke(bmd:BitmapData, p1:Point):void { noise = bmd; bmPoint = p1; addEventListener(Event.ENTER_FRAME, xDraw); } private function xDraw(e:Event):void { var nX:Number = 0; var nY:Number = 0; graphics.clear(); graphics.lineStyle(2, 0x333333 , 0.02); graphics.moveTo(nX,nY); // 長さを変えることで立ち上りを表現する var limit:uint = age*2+12; for (var i:uint = 0; i < limit; i++) { var nColor:uint = noise.getPixel(bmPoint.x+i,bmPoint.y+i); var colors:Array = toRGB(nColor); nX += (colors[0]-128)/16; nY += (colors[1]-48)/-8; graphics.lineTo(nX,nY); if (nY < -465) break; } age++; if (age > 32) age -= 32; } private function toRGB(nColor:uint):Array { var nB:uint = nColor & 0xff; var nG:uint = (nColor >> 8) & 0xff; var nR:uint = (nColor >> 16) & 0xff; return ([nR, nG, nB]); } } Code Fullscreen Preview Fullscreen noise channels colors filter BitmapFilterQuality.HIGH addEventListener BitmapDataChannel.GREEN BitmapDataChannel.RED filters perlinNoise Point clear getPixel Bitmap addChild Event.ENTER_FRAME BitmapData moveTo lineStyle lineTo