Flash CS3 - Flash CS4

Free tutorials and scripts for all.
Actionscript 3.0

Eventi personalizzati - classe DispatchEvent

This is a discussion on Eventi personalizzati - classe DispatchEvent within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Augh! Dopo svariati tutorials e articoli e dopo altrettante utilità gratuite messe a disposizione con i codici sorgente, chiunque ...


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, 09:23
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,486
Rep Power: 6
Flep is on a distinguished road
Eventi personalizzati - classe DispatchEvent

Augh!
Dopo svariati tutorials e articoli e dopo altrettante utilità gratuite messe a disposizione con i codici sorgente, chiunque di voi si fosse impegnato in uno studio approfondito del package flash.events avrà sicuramente adesso una buona dimestichezza con i metodi addEventListener e removeEventListener di Actionscript 3.0.
Detto questo, è giunto il momento di approfondire su come creare degli eventi personalizzati con Actionscript 3.0... eventi personalizzati ?*
Sì, con*Actionscript 3.0*( potevamo farlo già con Actionscript 2.0 ) si possono creare degli eventi che non fanno parte del package flash.events. O meglio, in questo tutorial vedremo come aggiungere un evento alla classe built-in Event, creando una nostra classe, sottoclasse di DispatchEvent, quindi che estende DispatchEvent e ne eredita metodi e proprietà.
Quindi, ad esempio, sappiamo che la classe Event ha un evento chiamato ENTER_FRAME. Noi andremo ad aggiungere a quella classe gli eventi EVENTO_UNO ed EVENTO_DUE, gestendoli a nostro piacere.

Vediamo come fare...

Creo un FLA che salvo con nome ' main.fla '.
Al suo interno creo una MovieClip di qualsiasi forma, che istanzio sullo stage assegnadole nome istanza ' clip_mc '.

Creo la Document Class, un file AS che salvo con nome ' Manager.as ', implementata in questo modo:
Code:
package
{
	import flash.display.MovieClip;
	import flash.events.Event;
	
	public class Manager extends MovieClip
	{
		private var movement:Movement;
		
		public function Manager()
		{
			init();
		}
		
		private function init():void
		{
			stage.frameRate=31;
			
			movement=new Movement(this);
			movement.addEventListener(Movement.EVENTO_UNO,partito);
			movement.addEventListener(Movement.EVENTO_DUE,arrivato);
			movement.addEventListener(Movement.EVENTO_TRE,tornato);
			movement.parti();
		}
		
		private function partito(e:Event):void
		{
			trace('partito');
		}
		
		private function arrivato(e:Event):void
		{
			trace('arrivato');
		}
		
		private function tornato(e:Event):void
		{
			trace('tornato');
		}
	}
}
Analizziamo il codice

Proprietà

una istanza della classe Movement che andremo a creare più avanti
private var movement:Movement;

Metodi
init();
imposto la velocità del frame rate
stage.frameRate=31;
istanzio la classe Movement
movement=new Movement(this);
ecco un punto importantissimo di questo tutorial. Come si nota, aggiungo un listener all' istanza movement. Sappiamo che addEventListener vuole almeno 2 parametri e cioè un evento e il nome del metodo da chiamare quando l' evento è scaturito. In una situazione ' normale ' ci troveremmo in questa sintassi: my_mc.addEventListener(Event.ENTER_FRAME,partito); invece , per creare un evento personalizzato in più alla classe Event, passiamo come parametro una proprietà statica della classe Movement ( che vedremo ) ed il nome del metodo da chiamare ( partito ). Quindi, ad un dato evento verrà chiamato il rispettivo metodo ( e quì niente di nuovo ).
movement.addEventListener(Movement.EVENTO_UNO,part ito);
movement.addEventListener(Movement.EVENTO_DUE,arri vato);
movement.addEventListener(Movement.EVENTO_TRE,torn ato);
chiamo un metodo della classe Movement che come possiamo capire è un metodo non statico in quanto viene chiamato dall' istanza della classe stessa.
movement.parti();

Ora passiamo a vedere la classe Movement.
Creo un file AS che salvo con nome ' movement.as ', implementato in questo modo:
Code:
package
{
	import flash.display.MovieClip;
	import flash.events.EventDispatcher;
	import flash.events.Event;
	
	public class Movement extends EventDispatcher
	{
		private var _fla:MovieClip;
		
		private var arrX:int=400;
		
		public static const EVENTO_UNO:String='eventoUno';
		public static const EVENTO_DUE:String='eventoDue';
		public static const EVENTO_TRE:String='eventoTre';
		
		public function Movement(fla:MovieClip)
		{
			_fla=fla;
		}
		
		public function parti():void
		{
			dispatchEvent(new Event(Movement.EVENTO_UNO));
			_fla.clip_mc.addEventListener(Event.ENTER_FRAME,go);
		}
		
		private function go(e:Event):void
		{
			var dx:Number=arrX-e.target.x;
			var ax:Number=dx*.2;
			e.target.x+=ax;
			if(Math.abs(dx)<=.2)
			{
				e.target.x=arrX;
				dispatchEvent(new Event(Movement.EVENTO_DUE));
				e.target.removeEventListener(Event.ENTER_FRAME,go);
				arrX=25;
				e.target.addEventListener(Event.ENTER_FRAME,back);
			}
		}
		
		private function back(e:Event):void
		{
			var dx:Number=arrX-e.target.x;
			var ax:Number=dx*.2;
			e.target.x+=ax;
			if(Math.abs(dx)<=.2)
			{
				e.target.x=arrX;
				dispatchEvent(new Event(Movement.EVENTO_TRE));
				e.target.removeEventListener(Event.ENTER_FRAME,back);
			}
		}
	}
}
Analizziamo il codice
Da notare che le classe Movement estende la classe built-in DispatchEvent.
Proprietà
una istanza MovieClip a cui assegno la root passata dalla Document Class ( Manager.as ) in modo che possa recuperare la clip_mc che ho sullo stage.
private var _fla:MovieClip;
una variabile numercia che contiene il valore della x di arrivo durante uno spostamento di clip_mc utilizzando un effetto inerzia.
private var arrX:int=400;
Ecco le 3 proprietà statiche e pubbliche di questa classe. Quando dalla Document Class abbiamo aggiunto i listeners all' istanza appunto di questa classe, lo abbiamo fatto chiamando queste tre proprietà che contengono un valore stringa ( così come ad esempio l' evento built-in Event.ENTER_FRAME contiene un valore stringa 'enterFrame' ).
public static const EVENTO_UNO:String='eventoUno';
public static const EVENTO_DUE:String='eventoDue';
public static const EVENTO_TRE:String='eventoTre';

Metodi
parti();
dalla Document Class viene chiamato questo metodo per fare partire l'animazione ( spostamento sull' asse x tramite effetto inerzia ) di clip_mc, però prima di azionare l' ENTER_FRAME, dispacciamo EVENTO_UNO. Dispacciando questo evento, ricordiamoci che la Document Class ha un listener in ascolto di questo evento, per cui verrà chiamato il metodo segnalato al momento dell' aggiunta del listener ( partito ).
dispatchEvent(new Event(Movement.EVENTO_UNO));
_fla.clip_mc.addEventListener(Event.ENTER_FRAME,go );

go();
quì applico un effetto inerzia sull' asse x di clip_mc
var dx:Number=arrX-e.target.x;
var ax:Number=dx*.2;
e.target.x+=ax;
if(Math.abs(dx)<=.2)
{
e al momento opportuno imposto la x di clip_mc uguale al valore di arrX
e.target.x=arrX;
dispaccio un altro evento ( EVENTO_DUE ) che a sua volta sarà percepito dalla Document Class che ha un listener in ascolto di tale evento e chiamerà il rispettivo metodo da eseguire ( arrivato )
dispatchEvent(new Event(Movement.EVENTO_DUE));
rimuovo ENTER_FRAME
e.target.removeEventListener(Event.ENTER_FRAME,go) ;
cambio il punto di arrivo
arrX=25;
aggiungo un altro ENTER_FRAME che questa volta chiamerà il metodo back
e.target.addEventListener(Event.ENTER_FRAME,back);
}

back();
altro effetto dispostamento asse x di clip_mc
var dx:Number=arrX-e.target.x;
var ax:Number=dx*.2;
e.target.x+=ax;
if(Math.abs(dx)<=.2)
{
al momento opportuno imposto la x di clip_mc uguale al valore di arrX
e.target.x=arrX;
dispaccio un altro evento ( EVENTO_TRE ) che a sua volta sarà percepito dalla Document Class che ha un listener in ascolto di tale evento e chiamerà il rispettivo metodo da eseguire ( tornato )
dispatchEvent(new Event(Movement.EVENTO_TRE));
rimuovo ENTER_FRAME
e.target.removeEventListener(Event.ENTER_FRAME,bac k);
}

Ed ecco il risultato:










Allego i files sorgente:
Attached Files
File Type: zip EventDispatcher.zip (7.4 KB, 17 views)

__________________

 


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 !

Last edited by Flep; 05-06-08 at 00:28..
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
Scroller di eventi Flep Utilità di FlepStudio 71 05-11-08 22:24
Actionscript 3 Gestione EVENTI Alarik Actionscript 3.0 avanzato 2 05-11-08 02:00
scroller eventi: ridimensionare eventi pettedemon AIUTO utilità free 12 22-11-07 11:24
classe per le connessioni, dispacciare nuovi eventi? nootropic.kint Flash CS3 | PHP | mySQL 5 25-10-07 15:29
come inviare parametri con dispatchEvent kapitan0 Flash CS3 generale 3 04-09-07 14:04


All times are GMT. The time now is 10:44.


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