forked from: Old Plasma

by jmbyh521 forked from Old Plasma (diff: 1)
♥0 | Line 90 | Modified 2015-11-27 12:25:26 | MIT License
play

ActionScript3 source code

/**
 * Copyright jmbyh521 ( http://wonderfl.net/user/jmbyh521 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/gOPh
 */

// forked from shakespit's Old Plasma
package {
    import flash.events.Event;
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
        import flash.geom.Rectangle;

    public class OldPlasma extends Sprite {
        const w:int = 232;
        const h:int = 232;
        const sx:int = 2;
        const sy:int = 2;
        const sinN:int = 4000;
        const pi2:Number = 2 * Math.PI;
        
        var step:Number = 2 * Math.PI / sinN;;
        
        var time:Number = 0;
        var ctr:int = 0;
        var ctr1:Number = 0;
        var ctr2:Number = 0;
        
        var x1:int = 0;
        var y1:int = 0;
        
        var v:Number;
        var color:Number;
        
        var a:Number;
        var b:Number;
        
        var shiftx:int = Math.random() * 100000 % pi2 / step;;
        var shifty:int = Math.random() * 100000 % pi2 / step;;
        
        const ssx:int = Math.random() * 10 + 5;;
        const ssy:int = Math.random() * 10 + 5;;

        var pixels:Vector.<uint>;
        var sinT:Vector.<Number>;

        var bmd:BitmapData;
        var bm:Bitmap;
        
        var i:int;
        
        public function OldPlasma() {
            pixels = new Vector.<uint>(w * h);
            
            sinT = new Vector.<Number>();
            
            bmd = new BitmapData(w, h);
            bm = new Bitmap(bmd);
            
            bm.scaleX = sx;
            bm.scaleY = sy;
            
            addChildAt(bm, 0);
            
            for(i = 0; i < sinN; i++){
                sinT.push(Math.sin(i * step));
            }
            
            for(x1 = 0; x1 < w; x1++){
                for(y1 = 0; y1 < h; y1++){
                    pixels[y1 * w + x1] = 0;
                    bmd.setPixel(x1, y1, 0);
                }
            }
            
            addEventListener(Event.ENTER_FRAME, handleEnterFrame);

        }
        
        private function handleEnterFrame(e:Event){
            ctr += 4;
            
            shiftx += ssx;
            shifty += ssy;
            
            if(ctr >= sinN) ctr -= sinN;
            if(shiftx >= sinN) shiftx -= sinN;
            if(shifty >= sinN) shifty -= sinN;
            
            ctr1 = sinT[int(shiftx)] * 300;
            ctr2 = sinT[int(shifty)] * 300;
            
            time = sinT[ctr] * 200;

//Clear screen and draw only new regions - amazing :)            
//            bmd.fillRect(new Rectangle(0, 0, w, h), 0xff000000);
        
            for(x1 = 0; x1 < w; x1++){
                for(y1 = 0; y1 < h; y1++){
                    a = x1 + time - 32 + ctr1;
                    b = y1 - 128 + ctr2;
                    v = sinT[int(((a * a + b * b) / 20000) % pi2 / step)];
        
                    a = x1 - ctr1;
                    b = y1 - 64 + ctr2;
                    v += sinT[int(((a * a + b * b) / 42000) % pi2 / step)];
                    
                    a = x1 - 192 + ctr1;
                    b = y1 -  64 + ctr2;
                    v += sinT[int(((a * a + b * b) / 63000) % pi2 / step)];
                    
                    a = x1 -  192 + ctr1;
                    b = y1 + time / 20 - 100 + ctr2;
                    v += sinT[int(((a * a + b * b) / 34000) % pi2 / step)];
        
                    i = ((4 + v) * 2);
        
                    color = i * 16
                                + ((i * 32) << 8)
                                + ((i * 64) << 16);
                
                    i = y1 * w + x1;
                    
                    if(pixels[i] != color){
                        pixels[i] = color;
                        bmd.setPixel(x1, y1, color);
                    }
                }
            }
        }
    }
}