Flash CS3 - Flash CS4

Free tutorials and scripts for all.
Actionscript 3.0

Tenere traccia delle moveClip tramite gli Arrays

This is a discussion on Tenere traccia delle moveClip tramite gli Arrays within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Avrete spesso notato che sono abituato a creare degli Arrays in cui inserisco delle MovieClip anche se effettivamente non servirebbe. ...


Go Back   Forum Flash CS3 Flash CS4 > Flash CS3 e Actionscript 3.0 > Articoli e tutorials

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Old 21-09-07, 10:12
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,486
Rep Power: 6
Flep is on a distinguished road
Tenere traccia delle moveClip tramite gli Arrays

Avrete spesso notato che sono abituato a creare degli Arrays in cui inserisco delle MovieClip anche se effettivamente non servirebbe.

E' propio vero, è questione di abitudine ma spesso questa tecnica mi ha risolto un mare di problemi.

Nel seguente esempio, disegnerò in runtime ( niente effetti spettacolari, solo il minimo indispensabile per poter didatticamente applicare quello che voglio dimostrare ) utilizzando un intervallo ENTER_FRAME in cui creo una MovieClip per ogni iterazione di intervallo e vorrei poi tenerne traccia di questa MovieClip per poter successivamente applicarle un fade/out e rimuoverla.
Inoltre vedremo una variante dell' articolo di ieri, in cui utilizzerò la tecnica che ha messo a punto un utente di FlepStudio ( Ignazio ) per sopperire a quei problemi dati durante l' utilizzo del metodo removeChildAt. Per saperne di più su questa tecnica vi invito a leggere la discussione nel forum di FepStudio
Ora entriamo nel vivo dell' esempio...*

Creo un FLA che salvo con nome ' disegno4.fla ' .
Creo la sua Document Class, un file AS che salvo con nome ' Disegno4.as ', implementata in questo modo:
Code:
package
{
	import flash.display.MovieClip;
	import flash.geom.Point;
	import flash.utils.Timer;
	import flash.events.Event;
	import flash.events.TimerEvent;
	
	public class Disegno4 extends MovieClip
	{
		private var point:Point;
		
		private var clips_array:Array;
		
		private var timer:Timer;
		
		private var arrX:int;
		private var arrY:int;
		private var counter:int=-1;
		
		private var isFirst:Boolean=true;
		
		public function Disegno4()
		{
			init();
			movePoint();
		}
		
		private function init():void
		{
			stage.frameRate=31;
			
			point=new Point(getRandomX(),getRandomY());
			
			clips_array=new Array();
		}
		
		private function getRandomX():int
		{
			var xx:int=Math.round(Math.random()*stage.stageWidth);
			return xx;
		}
		
		private function getRandomY():int
		{
			var yy:int=Math.round(Math.random()*stage.stageHeight);
			return yy;
		}
		
		private function movePoint():void
		{
			arrX=getRandomX();
			arrY=getRandomY();
			
			addEventListener(Event.ENTER_FRAME,goPoint);
		}
		
		private function goPoint(e:Event):void
		{
			var dx:Number=arrX-point.x;
			var ax:Number=dx*.3;
			point.x+=ax;
			
			var dy:Number=arrY-point.y;
			var ay:Number=dy*.3;
			point.y+=ay;
			
			var clip_mc:MovieClip=new MovieClip();
			clip_mc.graphics.lineStyle(1,0x0,1);
			clip_mc.graphics.moveTo(stage.stageWidth/2,0);
			clip_mc.graphics.lineTo(point.x,point.y);
			addChild(clip_mc);
			clips_array.push(clip_mc);
			
			if(Math.abs(dx)<=.2)
			{
				removeEventListener(Event.ENTER_FRAME,goPoint);
				movePoint();
				if(isFirst)
					initTimer();
				isFirst=false;
			}
		}
		
		private function initTimer():void
		{
			timer=new Timer(stage.frameRate,0);
			timer.addEventListener(TimerEvent.TIMER,fadeOut);
			timer.start();
		}
		
		private function fadeOut(t:TimerEvent):void
		{
			counter++;
			clips_array[counter].addEventListener(Event.ENTER_FRAME,fading);
		}
		
		private function fading(e:Event):void
		{
			var da:Number=0-e.currentTarget.alpha;
			var aa:Number=da*.2;
			e.currentTarget.alpha+=aa;
			
			if(Math.abs(da)<=.1)
			{
				e.currentTarget.alpha=0;
				e.currentTarget.removeEventListener(Event.ENTER_FRAME,fading);
				removeChildAt(0);
			}
		}
	}
}
Il risultato è il seguente:










Analizziamo il codice

Proprietà

una istanza della classe Point
private var point:Point;
un Array
private var clips_array:Array;
un timer
private var timer:Timer;
tre variabili numeriche intere
private var arrX:int;
private var arrY:int;
private var counter:int=-1;
una variabile di tipo Boolean
private var isFirst:Boolean=true;

Metodi
init();
imposto una velocità di frame rate
stage.frameRate=31;
creo una nuova istanza Point e gli assegno come coordinate i valori restituiti da due funzioni
point=new Point(getRandomX(),getRandomY());
inizializzo l' Array
clips_array=new Array();

getRandomX():int
questa funzione restituisce una valore random da zero a larghezza massima dello Stage
var xx:int=Math.round(Math.random()*stage.stageWidth);
return xx;

etRandomY():int
questa funzione restituisce una valore random da zero ad altezza massima dello Stage
var yy:int=Math.round(Math.random()*stage.stageHeight) ;
return yy;

movePoint();
asegno ad arrX e arrY due valori random
arrX=getRandomX();
arrY=getRandomY();
aggiungo un listenere in ascolto dell' evento ENTER_FRAME che chiamerà il metodo gopoint tante volte al secondo pari al numero del frame rate
addEventListener(Event.ENTER_FRAME,goPoint);

goPoint();
applico l' effetto inerzia alle X e Y di point
var dx:Number=arrX-point.x;
var ax:Number=dx*.3;
point.x+=ax;
var dy:Number=arrY-point.y;
var ay:Number=dy*.3;
point.y+=ay;
creo una MovieClip ogni volta e la faccio disegnare da un punto fisso alle coordinate di point
var clip_mc:MovieClip=new MovieClip();
clip_mc.graphics.lineStyle(.25,0x333333,1);
clip_mc.graphics.moveTo(stage.stageWidth/2,0);
clip_mc.graphics.lineTo(point.x,point.y);
inserisco la MovieClip nell' Array clips_array
addChild(clip_mc);
clips_array.push(clip_mc);
ad un dato momento fermo l' intervallo rimuovendo il listener in ascolto di ENTER_FRAME
if(Math.abs(dx)<=.2)
{
removeEventListener(Event.ENTER_FRAME,goPoint);
chiamo il metodo movePoint per spostare nuovamente il punto ( istanza Point )
movePoint();
e chiamo una sola volta ( date le logiche condizionali applicate ) il metodo initTimer
if(isFirst)
initTimer();
isFirst=false;
}


initTimer();
istanzio il Timer dandogli una velocità pari al frame rate e pasandogli uno zero come secondo argomento in modo che esso non si fermi mai
timer=new Timer(stage.frameRate,0);
aggiungo un listener in ascolto dell' evento TIMER che chiamerà il metodo fadeOut
timer.addEventListener(TimerEvent.TIMER,fadeOut);
faccio partire il timer
timer.start();

fadeOut();
questo metodo aumenta il valore della variabile counter di una unità e aggiunge un ENTER_FRAME, alla MovieClip contenuta in clips_array con indice pari al valore della variabile counter, che chiama il metodo fading
counter++;
clips_array[counter].addEventListener(Event.ENTER_FRAME,fading);

fading();
applico l' effetto inerzia all' alpha della MovieClip
var da:Number=0-e.currentTarget.alpha;
var aa:Number=da*.2;
e.currentTarget.alpha+=aa;
ad un certo momento fermo ENTER_FRAME rimuovendo il listener della MovieClip
if(Math.abs(da)<=.1)
{
e.currentTarget.alpha=0;
e.currentTarget.removeEventListener(Event.ENTER_FR AME,fading);
rimuovo la MovieClip che si trova a depth 0. Perchè ? Leggere questi articoli: Trucco del giorno - DisplayObjectContainer.removeChildAt e articolo di Ignazio nel forum
removeChildAt(0);
}

Alla prossima !
__________________

 


I recommend: Essential Actionscript 3.0

- Non rispondo ai messaggi privati con domande tecniche. Apri una discussione sul forum !
- I do not reply technicians pvt messages. Open a thread !
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #2 (permalink)  
Old 21-04-08, 10:27
Zolmandacuba's Avatar
Member
 
Join Date: Apr 2008
Posts: 60
Rep Power: 1
Zolmandacuba is on a distinguished road
Send a message via Skype™ to Zolmandacuba
Re: Tenere traccia delle moveClip tramite gli Arrays

ma flep sono un po' sconcertato: per ottenre risultati cosi semplici, servono codici estremamente lunghi. di conseguenza il tempo che si impiega a scriverli non è porprio ridotto....
quello che mi chiedo è: per fare un sito intero (e intendo un bel sito, al top) quanti giorni dovrò stare dietro ad un codice? (domanda retorica):....
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #3 (permalink)  
Old 22-06-08, 15:45
Zolmandacuba's Avatar
Member
 
Join Date: Apr 2008
Posts: 60
Rep Power: 1
Zolmandacuba is on a distinguished road
Send a message via Skype™ to Zolmandacuba
Re: Tenere traccia delle moveClip tramite gli Arrays

hai notato che alla lunga le righe cominciano ad accumularsi?

forse il timer settato come (stage.frameRate,0) è troppo lento???!!!

però impostato (30,0) invece è troppo veloce, prima o poi la sua velocità supera quella della creazione delle line e genera un errore.....
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

Reply

Bookmarks

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is On
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump

Similar Threads

Thread Thread Starter Forum Replies Last Post
Personalizzare flv preview tramite AS - come funziona? Eugene Actionscript 3.0 base 2 20-08-08 15:28
Mappa 4: determinare la dimensione della blank tramite XML giulia AIUTO utilità free 0 16-07-08 10:33
Cambiare Colore delle clip tramite pulsante in AS 3.0 Vinny85 Actionscript 3.0 base 1 18-05-08 19:21
How to keep track of the MovieClips using Arrays Flep Tutorials 0 23-09-07 13:05
leggere xml tramite array naruto Actionscript 3.0 base 4 06-09-07 14:15


All times are GMT. The time now is 11:39.


Powered by vBulletin versione 3.7.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0 RC4
Forum SiteMap


FlepStudio
by Filippo Lughi
P.IVA 03605860406