package com.shanimal.fx {
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.events.TimerEvent;
import flash.filters.DisplacementMapFilter;
import flash.filters.DisplacementMapFilterMode;
import flash.filters.GlowFilter;
import flash.geom.Point;
import flash.utils.Timer;
import spark.components.Image;
public class Wave {
// private stuff
private var _animating:Boolean = false;
private var _dmFilter:DisplacementMapFilter;
private var _originalBmpData:BitmapData;
private var _originalFilters:Array;
private var _target:*;
private var _timer:Timer = new Timer(Math.floor(1000/32));
// constructor
public function Wave(){
_timer.addEventListener(TimerEvent.TIMER,eof);
_timer.start();
}
// public getters/setters
/**
* releases the prior target and assigns a new target. making this a good button component for a list of <s:Image flags
*
* usage:flex <fx:Script ...
* <pre>
* [Bindable] private var wave:Wave = new Wave();
* private var _locale:String = "";
*
* [Bindable]
* private function get locale():String {
* return _locale;
* }
* private function set locale(s:String):void{
* _locale = s;
* var defaultChain:Array = ["es_MX",LocaleID.DEFAULT];
* var flags:Object = {
* "en_US":{target:flagEnglish,chain:["en_US"].concat(defaultChain)},
* "de_DE":{target:flagDeutsch,chain:["de_DE"].concat(defaultChain)},
* "pi_RT":{target:flagPirate,chain:["pi_RT","en_GB"].concat(defaultChain)}
* }
* resourceManager.localeChain = flags[s].chain;
* wave.target = flags[s].target;
* }
* </pre>
*/
[Bindable]
public function get target():* {
return _target;
}
public function set target(t:*):void{
if(t == target) return;
if(t.hasOwnProperty("bitmapData")){
initTarget(t);
}
}
//public methods
public function play():void{
_animating = true;
}
public function restore():void{
if(_originalBmpData && target){
(target as Image).bitmapData.draw(_originalBmpData);
target.filters = _originalFilters
}
}
public function stop():void{
_animating = false;
}
// protected methods
protected function applyEffect(t:Image):void{
var mapBmd:BitmapData = t.bitmapData;
mapBmd.perlinNoise(15,30,2,0,true,false,BitmapDataChannel.RED|BitmapDataChannel.BLUE,false,[new Point(-_timer.currentCount,_timer.currentCount/100),new Point(mapBmd.rect.width,mapBmd.rect.height)]);
_dmFilter = _dmFilter || new flash.filters.DisplacementMapFilter(mapBmd, new Point(), BitmapDataChannel.RED, BitmapDataChannel.BLUE, -5, -5, DisplacementMapFilterMode.CLAMP);
_dmFilter.mapBitmap = mapBmd;
t.filters = [_dmFilter];
}
protected function eof(e:TimerEvent):void{
if(_animating && target && target.bitmapData)
applyEffect(target);
}
protected function initTarget(t:*):void{
restore();
_target = t;
_originalBmpData = target.bitmapData.clone();
_originalFilters = target.filters;
play();
}
}
}