Salve a tutti !
Oggi volevo scrivere due righe a riguardo di un metodo di
Actionscript 3.0, più precisamente del metodo HitTestPoint della classe DisplayObject.
Non lasciatevi ingannare o mettervi dubbi dalla classe DisplayObject in quanto la classe
MovieClip eredita da DisplayObject.
Questo significa che possiamo utilizzare il metodo HitTestPoint anche con una MovieClip.
Questo metodo valuta se la MovieClip per il quale lo utilizziamo si sovrappone o collide con una certa coordinata stabilita dai punti x e y che gli passiamo come parametri.
Inoltre il metodo HitTestObject, implementa un altro parametro: shapeFlag.
Il shapeFlag è un valore di tipo Boolean ( true/false ) che indica se vogliamo che il metodo valuti la reale forma della nostra MovieClip oppure la sua area di rettangolo totale.
In questo
tutorial vedremo a cosa può servire il metodo HitTestPoint e che sintassi adottare per utilizzarlo.
Vedremo inoltre che l' swf in cui utilizziamo HitTestPoint si comporta allo stesso modo anche se caricato in un altro SWF.
Creo un FLA che salvo con nome ' main.fla '.
Al suo interno creo una MovieClip sullo stage con una forma a caso ( meglio non quadrata ne rettangolare per fare le prove successive ), gli assegno il nome istanza clip_mc e la posiziono esattamente al centro dello stage.
Utilizzo HiteTestPoint per controllare se clip_mc collide con il punto centrale dello stage.
Quindi, passo come parametri i puti stage.stageWidth/2 ( cioè la metà della larghezza dello stage ) e stage.stageHeight/2 ( la metà dell' altezza dello stage )
Code:
if(clip_mc.hitTestPoint(stage.stageWidth/2,stage.stageHeight/2))
{
trace('ok');
}
e infatti appena pubblico il FLA, ottengo ok come output.
Ora voglio controllare se clip_mc collide con il mouse, quindi questa volta passerò i valori mouseX e mouseY al metodo HitTestPoint. In più passo come terzo parametro u valore true, che dice a Flash di controllare se collide solo con l' effettiva forma di clip_mc:
Code:
clip_mc.addEventListener(Event.ENTER_FRAME,checkMouse);
function checkMouse(evt:Event):void
{
if(evt.target.hitTestPoint(mouseX,mouseY,true))
{
trace('now');
}
}
ed ogni volta che il mouse toccherà clip_mc flash lo intercetterà ( infatti ottengo now come output in quanto viene eseguito il comando trace ).
Se invece avessi utilizzato false come terzo parametro, allora Flash eseguirebbe il trace('now'); al momento in cui il mouse entra in collisione con l' effettiva area di spazio rettangolare di clip_mc.
Questo comportamento del metodo HitTestPoint rimane esattamente lo stesso anche se volessimo caricare main.swf in un altro SWF.
Infatti, se preparo il codice corretto ( utilizzando
Event.ADDED_TO_STAGE ) in modo da poter essere caricato senza errori ) per main.swf:
Code:
addEventListener(Event.ADDED_TO_STAGE,init);
function init(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
if(clip_mc.hitTestPoint(stage.stageWidth/2,stage.stageHeight/2))
{
trace('ok');
}
clip_mc.addEventListener(Event.ENTER_FRAME,checkMouse);
}
function checkMouse(evt:Event):void
{
if(evt.target.hitTestPoint(mouseX,mouseY,true))
{
trace('now');
}
}
e creo l' swf in cui caricarlo, quindi creo un FLA che salvo con nome ' test.fla ' e gli aggiungo il codice per caricare main.swf:
Code:
var request:URLRequest=new URLRequest('main.swf');
var loader:Loader=new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.load(request);
function onComplete(evt:Event):void
{
addChild(loader);
}
a questo punto se pubblico test.swf che carica main.swf, ottengo lo stesso risultato ma solo perchè ho utilizzato Event.ADDED_TO_STAGE in main.fla.
Stay tuned !