/** # AS3ScaleSquare.class # AS3 class porting # date: 25-06-2007 # last modify: 02-01-2008 # author: Andrea Milillo - and80 # copyright: v2online.it - all rights reserved # rif_site: http://www.v2online.it # rif_mail: v2online[at]gmail[dot]com # link_download: http://articoli.v2online.it/scalesquare_as3.html */ package { import flash.utils.setInterval; import flash.utils.clearInterval; import fl.transitions.*; import fl.transitions.easing.*; import flash.display.*; import flash.events.*; public class AS3ScaleSquare extends EventDispatcher{ // private vars declaration: private var __target:DisplayObjectContainer; private var __width:Number; private var __height:Number; private var __xSections:Number; private var __ySections:Number; private var __sections:Number; private var __random:Boolean; private var __easeType:Function; private var __duration:Number; private var __mask:Sprite; private var __wid:Number; private var __hei:Number; private var __temporizer:uint; private var __motionChange__:Function; private var __actual:Number; private var __singleTweenDuration:Number; private var __blocker:Boolean; private var __w:Object; // public vars declaration: public var timeMove:Number; public var temp_index:Number; public var completeHandler:Function; // declare constructor: /** * Funzione di costruzione della classe AS3ScaleSquare * * @param target:DisplayObjectContainer=null -> è l'oggetto contenitore a cui viene assegnata la maschera che genera l'effetto, ha un valore di default pari a Null e gestisce l'avvio della classe in maniera immediata, o mediante la funzione startAnimation che vedremo più avanti; in pratica se non viene passato nessun parametro al costruttore, l'animazione non viene eseguita subito; * @param xSections:Number=1 -> rappresenta il numero di sezioni orizzontali in cui si deve dividere la maschera, il valore di default è pari a 1; * @param ySections:Number=1 -> rappresenta il numero di sezioni verticali in cui si deve dividere la maschera, il valore di default è pari a 1; * @param easeType:Function=null -> rappresenta la funzione di movimento da utilizzare nell'animazione, il valore di default è Null ed equivale alla funzione None.easeNone; * @param random:Boolean=false -> se true, dice alla classe di animare la griglia della maschera in maniera casuale, il valore di default è false; * @param duration:Number=Infinity -> equivale alla durata in secondi della transizione ed ha un valore di default di 1, equivalente ad un secondo; * @param singleTweenDuration:Number=1 -> determina il valore di durata dell'animazione di ogni singolo rettangolo che compone la maschera a griglia, ha un valore pari a 1 ossia la durata di un secondo per l'animazione di ogni rettangolo; se viene impostato a 0, la durata di ogni singola animazione viene determinata dalla durata dell'intera animazione divisa per il numero di sezioni da animare. * * @return void -> nessun valore particolare */ public function AS3ScaleSquare(target:DisplayObjectContainer=null,xSections:Number=1,ySections:Number=1,easeType:Function=null,random:Boolean=false,duration:Number=Infinity,singleTweenDuration:Number=1) { __target=target; __xSections=xSections; __ySections=ySections; __sections=__ySections * __xSections; __random=random; __easeType=easeType == null?fl.transitions.easing.None.easeNone:easeType; __duration=duration == Infinity?1 / __sections:duration / __sections; __singleTweenDuration=singleTweenDuration; __mask=new Sprite ; timeMove=duration == Infinity?1:duration; __actual=timeMove - __duration; temp_index=1; __w = {}; if (target is DisplayObjectContainer) { __blocker=true; __wid=__target.width; __hei=__target.height; __drawMask__(); __temporize__(); } } // private methods declaration: private function __drawSquare__(name:Shape,wdt:Number,hgt:Number,col:Number) { with (name) { graphics.moveTo(- wdt / 2,- hgt / 2); graphics.beginFill(col,1); graphics.drawRect(- wdt / 2,- hgt / 2,wdt,hgt); graphics.endFill(); } } private function __scaleSquare__(target:Shape,xscale:Number,yscale:Number,duration:Number):Tween { __w['ysc'+target.name] = new Tween(target,"scaleY",__easeType,target.scaleY,yscale,duration,true); __w['xsc'+target.name] = new Tween(target,"scaleX",__easeType,target.scaleX,xscale,duration,true); return __w['xsc'+target.name]; } private function __temporize__() { var path:Object; path=this; if (! __random) { __temporizer=setInterval(function(){ var s:Shape; s = path['__mask'].getChildByName("sp"+path['temp_index']); var d:Number; d = path['__singleTweenDuration'] == Infinity ? path['__duration'] : path['__singleTweenDuration']; var tw:Tween; tw = path['__scaleSquare__'](s, 1, 1, d); path['temp_index']++; if(path['temp_index'] > path['__sections']) { clearInterval(path['__temporizer']); tw.addEventListener(TweenEvent.MOTION_FINISH, __complete__); } },path['__duration'] * 1000); } else { var sArr:Array; sArr=new Array(this['__sections']); for (var p:Number=0; p < this['__sections']; p++) { sArr[p]=p + 1; } this['__temporizer']=setInterval(function(){ var t:Number = Math.floor(Math.random()*sArr.length); var s:Shape; s = path['__mask'].getChildByName("sp"+sArr[t]); var d:Number; d = path['__singleTweenDuration'] == Infinity ? path['__duration'] : path['__singleTweenDuration']; var tw:Tween; tw = path['__scaleSquare__'](s, 1, 1, d); sArr.splice(t,1); if(sArr.length <= 0){ clearInterval(path['__temporizer']); tw.addEventListener(TweenEvent.MOTION_FINISH, __complete__); } },path['__duration'] * 1000); } } private function __complete__(e:TweenEvent) { dispatchEvent(new Event(Event.COMPLETE)); __resetMask__(); } private function __drawMask__():void { var sec_wid:Number=Math.ceil(this['__wid'] / this['__xSections']); var sec_hei:Number=Math.ceil(this['__hei'] / this['__ySections']); if (this['__mask'].getChildByName('sp1') == null) { for (var i:Number=1; i <= this['__sections']; i++) { var l:Number=i - 1; var pr:Shape=l > 0?this['__mask'].getChildByName("sp" + l):undefined; var sp:Shape=new Shape; sp.scaleX=sp.scaleY=0; sp.name="sp" + i; sp.x=i > 1?pr.x < this['__wid'] - sec_wid?pr.x + sec_wid:0:0; sp.y=i > 1?pr.x < this['__wid'] - sec_wid?pr.y:pr.y + sec_hei:0; this['__drawSquare__'](sp,sec_wid,sec_hei,0); this['__mask'].addChild(sp); } this['__mask'].x+= sec_wid / 2; this['__mask'].y+= sec_hei / 2; this['__mask'].name="masch"; } var masch=this['__target'].parent.addChild(this['__mask']); this['__target'].mask=masch; } private function __resetMask__():void { if (this['__target'].parent.getChildByName('masch') != null) { this['__blocker']=false; this['__wid']=NaN; this['__hei']=NaN; this['temp_index']=1; this['__target'].parent.removeChild(this['__target'].parent.getChildByName('masch')); this['__target'].mask=null; for (var i:Number=1; i <= this['__sections']; i++) { var sp=this['__mask'].getChildByName('sp' + i); sp.scaleX=sp.scaleY=0; } } } // public methods declaration: public function clearAnimation() { clearInterval(this['__temporizer']); this['__resetMask__'](); dispatchEvent(new Event(Event.CANCEL)); } public function startAnimation() { if (! __blocker) { if (__target is DisplayObjectContainer) { if (isNaN(__wid)) { __wid=__target.width; __hei=__target.height; __drawMask__(); __temporize__(); } } } } // getter, setter declaration: public function set target(t:DisplayObjectContainer) { this['__target']=t; } public function get target():DisplayObjectContainer { return this['__target']; } public function set xSections(n:Number) { this['__xSections']=n; } public function get xSections():Number { return this['__xSections']; } public function set ySections(n:Number) { this['__ySections']=n; } public function get ySections():Number { return this['__ySections']; } public function set easeType(f:Function) { this['__easeType']=f; } public function get easeType():Function { return this['__easeType']; } public function set random(b:Boolean) { this['__random']=b; } public function get random():Boolean { return this['__random']; } public function set duration(n:Number) { this['__duration']=n; } public function get duration():Number { return this['__duration']; } public function set singleTweenDuration(n:Number) { this['__singleTweenDuration']=n; } public function get singleTweenDuration():Number { return this['__singleTweenDuration']; } } }