Nov

15

Grant Skinner’s OSX Squeeze Effect in AS3

By scott

First off, thank you Grant for releasing the source for your squeeze effect. Dirty code is better than no code. After looking at the source code I began to wonder how much better it would run in AS3 so I converted it. I didn’t clean up any of the code, just a straight conversion. It seems to run a little smoother. Next I am going to make it dynamic allowing you to load in an image passed in through flashVars. Maybe if I’m really bored I will set it up so you can load in multiple images from an xml file and build a gallery type app using this effect. Again, thanks Grant, as always, very cool work!


 
Download the rough AS3 source here.
 

Jul

15

Actionscript 3.0 Rain Effect Source Code

By scott

I only posted the AS 3.0 Make it Rain effect yesterday and I have been bombarded with people asking me to release the source. It’s not the tightest code yet but here it is anyway:

package {
   import flash.display.MovieClip;
   import flash.display.BitmapData;
   import flash.display.Bitmap;
   import flash.geom.Rectangle;
   import flash.geom.Point;
   import flash.geom.Matrix;
   import flash.filters.ConvolutionFilter;
   import flash.geom.ColorTransform;
   import flash.filters.DisplacementMapFilter;
   import flash.utils.Timer;
   import flash.events.TimerEvent;

   class RainMaker {
      private var __scope:MovieClip;
      private var __clip:MovieClip;
      private var __sourceBitmap:BitmapData;
      private var __bitmap1:BitmapData;
      private var __bitmap2:BitmapData;
      private var __buffer:BitmapData;
      private var __outputImage:BitmapData;
      private var __bounds:Rectangle;
      private var __origin:Point;
      private var __matrix:Matrix;
      private var __matrix2:Matrix;
      private var __wave:ConvolutionFilter;
      private var __damp:ColorTransform;
      private var __water:DisplacementMapFilter;
      private var __surface:BitmapData;
      private var __fillcolour:int = 128;
      private var __xPos:int;
      private var __yPos:int;
      private var __lastx:int;
      private var __lasty:int;

      //Movieclips
      private var cloneClip_mc:MovieClip;

      function RainMaker(scope:MovieClip, clip:MovieClip) {
         __scope = scope;
         __clip = clip;
         draw();
      }

      private function draw():void {
         cloneClip_mc = new MovieClip();
         __scope.addChild(cloneClip_mc);
         var bitmapImage:BitmapData = new BitmapData(__clip.width, __clip.height, false, 0);
         bitmapImage.draw(__clip);
         __surface = bitmapImage;
         __clip.visible = false;
         __bitmap1 = new BitmapData(__clip.width, __clip.height, false, __fillcolour);
         __bitmap2 = new BitmapData(__clip.width, __clip.height, false, __fillcolour);
         __sourceBitmap = new BitmapData(__clip.width, __clip.height, false, __fillcolour);
         __buffer = new BitmapData(__clip.width, __clip.height, false, __fillcolour);
         __outputImage = new BitmapData(__clip.width, __clip.height, true, __fillcolour);
         __bounds = new Rectangle(0, 0, __clip.width, __clip.height);
         __origin = new Point();
         __matrix = new Matrix();
         __matrix2 = new Matrix();
         __matrix2.a = __matrix2.d = 2;
         __wave = new ConvolutionFilter(3, 3, [1, 1, 1, 1, 1, 1, 1, 1, 1], 9, 0);
         __damp = new ColorTransform(0, 0, 0.99609374, 1, 0, 0, 2, 0);
         __water = new DisplacementMapFilter(__bitmap2, __origin, 4, 4, 32, 32, "ignore");

         var bm:Bitmap=new Bitmap(__outputImage);
         cloneClip_mc.addChild(bm);
         var __waterTimer:Timer = new Timer(10);
         __waterTimer.addEventListener('timer', turnOnWater);
         __waterTimer.start();
         var myTimer:Timer = new Timer(150);
         myTimer.addEventListener('timer', waterEffect);
         myTimer.start();
      }

      private function fitsArea():Boolean {
         var curX = __xPos;
         var curY = __yPos;

         if ((curX < __clip.width) && (curY < __clip.height)) {
            return true;
         } else {
            return false;
          }
      }

      private function waterEffect(ev:Object):void {
         if (isNaN(__xPos)) {
            __xPos = 0;
            __yPos = 0;
         } else {
            if (fitsArea()) {
               __xPos = Math.random()*__clip.width;
               __yPos = Math.random()*__clip.height;
            } else {
               __xPos = 0;
               __yPos = 0;
            }
         }

         __lastx = __xPos;
         __lasty = __yPos;
      }

      private function turnOnWater(ev:Object):void {
            var curX = __xPos / 2;
            var curY = __yPos / 2;

            if ((__lasty != curY) || (__lastx != curX)) {
               __sourceBitmap.setPixel(curX + 1, curY, 16777215);
               __sourceBitmap.setPixel(curX - 1, curY, 16777215);
               __sourceBitmap.setPixel(curX, curY + 1, 16777215);
               __sourceBitmap.setPixel(curX, curY - 1, 16777215);
               __sourceBitmap.setPixel(curX, curY, 16777215);
            }

            __lastx = curX;
            __lasty = curY;
            __bitmap1.applyFilter(__sourceBitmap, __bounds, __origin, __wave);
            __bitmap1.draw(__bitmap1, __matrix, null, "add");
            __bitmap1.draw(__buffer, __matrix, null, "difference");
            __bitmap1.draw(__bitmap1, __matrix, __damp);
            __bitmap2.draw(__bitmap1, __matrix2, null, null, null, true);
            __outputImage.applyFilter(__surface, new Rectangle(0, 0, __clip.width,
            __clip.height), __origin, __water);
            __buffer = __sourceBitmap;
            __sourceBitmap = __bitmap1.clone();
      }
   }
}