Flash CS3 - Flash CS4

Free tutorials and scripts for all.
Actionscript 3.0

SharedObject con Actionscript 3.0

This is a discussion on SharedObject con Actionscript 3.0 within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Stai cercando di capire cosa sono e come funzionano gli Shared object di Flash CS3 ? Segui questo articolo e ne ...


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

Register Blogs FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 21-09-07, 09:17
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,354
Blog Entries: 1
Rep Power: 6
Flep is on a distinguished road
SharedObject con Actionscript 3.0

Stai cercando di capire cosa sono e come funzionano gli Shared object di Flash CS3 ?
Segui questo articolo e ne saprai abbastanza molto presto...
La classe SharedObject serve a leggere o immagazinare dati sulla macchina dell' utente. Per capire meglio, posiamo tranquillamente paragonare gli SharedObjects con i cookies del browser.
Questa classe è molto utile e molto usata nelle applicazioni di giochi.
Faccio un esempio, mettiamo caso che abbiamo sviluppato un gioco con Flash CS3 e l' utente deve inserire i propri dati in modo da immagazzinare il suo punteggio di gioco ed associarlo al suo nome.
Mettiamo caso che l' utente voglia fare più di una partita, in questo caso dovrebbe ogni volta inserire i propri dati e di sicuro non ne sarebbe felice ( conosciamo tuti la pigrizia dell' utente comune di internet ).
Utilizzando invece la clase SharedObject, il nostro utente potrebbe fare tutte le partite che vuole inserendo i dati una unica volta in quanto vengono memorizzti in un file che Flash scrive e lascia nella macchina dell' utente.

L' esempio che farò vi chiederà di inserire un nome, una città e l' età. A questo punto cliccate ' SALVA ' e Flash salverà i dati sulla vostra macchina. Poi fate un refresh della pagina, oppure chiudete il browser e riapritelo, noterete che Flash ha chiramente recuperato i vostri dati.
Potete anche fare l' operazione inversa: cancelare i dati. Fatto il refresh di pagina, questa volta vi apparirà nuovamente la form di inserimento dati.

Saltiamo nel vivo dell' esempio...*










Creo un FLA che salvo con nome ' main.fla '.
Al suo interno:

frame 1: una MovieClip con nome istanza ' form_mc ' che ospita al suo interno 3 campi di testo dinamico: nome_txt, citta_txt ed eta_txt. Questi 3 campi devono essere di tipo input, in modo che l' utente possa scrivere i propri dati. Inoltre, form_mc, contiene un bottone con nome save_btn.

una MovieClip con nome istanza ' info_mc ' che ospita al suo interno un campo di testo dinamico con nome info_txt ed un bottone con nome delete_btn.

un campo di testo dinamico con nome output_txt

frame 2: un campo di testo statico, avvisa l' utente che i dati sono stati salvati correttamente.

Adesso creo la Document Class da associare a main.fla, un file AS che salvo con nome ' Main.as ', implementata in questo modo:
Code:
package
{
	import flash.display.MovieClip;
	import flash.text.TextField;
	import flash.events.MouseEvent;
	import flash.events.NetStatusEvent;
	import flash.net.SharedObject;
	import flash.net.SharedObjectFlushStatus;

	public class Main extends MovieClip
	{
		private var _so:SharedObject;
		
		public function Main()
		{
			stop();
			
			init();
			checkSharedObject();
		}
		
		private function init():void
		{
			form_mc.visible=false;
			form_mc.x=stage.stageWidth/2;
			form_mc.y=stage.stageHeight/2;
			
			info_mc.visible=false;
			info_mc.x=form_mc.x;
			info_mc.y=form_mc.y;
			
			form_mc.save_btn.label='SALVA';
			info_mc.delete_btn.label='CANCELLA I TUOI DATI';
		}
		
		private function checkSharedObject():void
		{
			_so=SharedObject.getLocal('FlepStudio');
			
			if(_so.data.nome==undefined||_so.data.citta==undefined||_so.data.eta==undefined)
				displayAll();
			else
				displayInfo();
		}
		
		private function displayAll():void
		{
			form_mc.visible=true;
			form_mc.save_btn.addEventListener(MouseEvent.CLICK, saveCookie);
            
		}
		
		private function displayInfo():void
		{
			info_mc.visible=true;
			info_mc.delete_btn.addEventListener(MouseEvent.CLICK, clearCookie);
			info_mc.info_txt.text='Tu sei '+_so.data.nome+'\n'+
												'abiti a '+_so.data.citta+'\n'+
												'ed hai '+_so.data.eta+' anni';
		}
		
		private function saveCookie(evt:MouseEvent):void
		{
			var flushStatus:String=null;
			
			_so.data.nome=evt.currentTarget.parent.nome_txt.text;
			_so.data.citta=evt.currentTarget.parent.citta_txt.text;
			_so.data.eta=evt.currentTarget.parent.eta_txt.text;
			try 
			{
				flushStatus=_so.flush(10000);
			} 
			catch (error:Error) 
			{
				trace('Errore...non riesco a scrivere i dati su disco');
			}
			if(flushStatus != null) 
			{
				switch(flushStatus)
				{
					case SharedObjectFlushStatus.PENDING:
					output_txt.appendText('Richiesta permessi per salvataggio oggetto in corso...\n');
					_so.addEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
					break;
						
					case SharedObjectFlushStatus.FLUSHED:
					gotoAndStop(2);
					break;
				}
			}
		}
		
		private function onFlushStatus(event:NetStatusEvent):void
		{
			output_txt.appendText("L'utente ha chiuso la finestra di dialogo.\n");
			switch (event.info.code) 
			{
				case "SharedObject.Flush.Success":
				output_txt.appendText("L' utente ha confermato il permesso.\n");
				break;
				
				case "SharedObject.Flush.Failed":
				output_txt.appendText("L' utente ha negato il permesso.\n");
				break;
			}
			output_txt.appendText("\n");
			
			_so.removeEventListener(NetStatusEvent.NET_STATUS,onFlushStatus);
		}
		
		private function clearCookie(mevt:MouseEvent):void
		{
			info_mc.info_txt.text='I tuoi dati sono stati cancellati dallo Shared Object, chiudi e riapri il browser e vedrai...';
			delete _so.data.nome;
			delete _so.data.citta;
			delete _so.data.eta;
		}
	}
}
Analizziamo il codice

Proprietà

una istanza della classe SharedObject
private var _so:SharedObject;

Funzione costruttrice
fermo la timeline sul primo frame
stop();
chiamo il metodo init
init();
chiamo il metodo checkSharedObject
checkSharedObject();

Metodi
init();
imposto invisibile form_mc e lo posiziono al centro dello stage
form_mc.visible=false;
form_mc.x=stage.stageWidth/2;
form_mc.y=stage.stageHeight/2;
imposto invisibile info_mc e lo posiziono al centro dello stage
info_mc.visible=false;
info_mc.x=form_mc.x;
info_mc.y=form_mc.y;
assegno un testo alla label dei bottoni
form_mc.save_btn.label='SALVA';
info_mc.delete_btn.label='CANCELLA I TUOI DATI';

checkSharedObject();
controllo se sulla macchina dell' utente esiste già un oggetto scrito da Flash con titolo ' FlepStudio ' utilizzando il metodo getLocal
_so=SharedObject.getLocal(FlepStudio);
se eventualmente esistesse, controllo che abbia le tre proprietà nome, citta ed eta. Se una o più delle tre è undefined allora chiamo il metodo displayAll
if(_so.data.nome==undefined||_so.data.citta==undef ined||_so.data.eta==undefined)
displayAll();
altrimenti se le tre proprietà sono definite e contengono dei dati chiamo il metodo displayInfo
else
displayInfo();

displayAll();
form_mc diventa visibile ( dato che non è stato trovato un oggetto )
form_mc.visible=true;
aggiungo un listener al CLICK del bottone save_btn che è dentro a form_mc. L' evento chiamerà il metodo saveCookie
form_mc.save_btn.addEventListener(MouseEvent.CLICK , saveCookie);

displayInfo();
info_mc diventa visibile ( dato che è stato trovato un oggetto )
info_mc.visible=true;
aggiungo un listener al CLICK del bottone save_btn che è dentro a form_mc. L' evento chiamerà il metodo clearCookie
info_mc.delete_btn.addEventListener(MouseEvent.CLI CK, clearCookie);
visualizzo le informazioni che recupero dall' oggetto nella macchina dell' utente
info_mc.info_txt.text='Tu sei '+_so.data.nome+'\n'+'abiti a '+_so.data.citta+'\n'+'ed hai '+_so.data.eta+' anni';

saveCookie();
creo una variabile di tipo String e gli imposto il valore null per controllare se l' operazione andrà a buon fine
var flushStatus:String=null;
assegno tre proprietà all' oggetto data di _so ( istanza di SharedObject ) alle quali a loro volta assegno il testo scritto dall' utente per ogni campo di testo
_so.data.nome=evt.currentTarget.parent.nome_txt.te xt;
_so.data.citta=evt.currentTarget.parent.citta_txt. text;
_so.data.eta=evt.currentTarget.parent.eta_txt.text ;
adesso dovrei controllare che i campi di testo siano tutti compilati, ma lascio a voi l' onore e avvio la procedura di scrittura
try
{
imposto a flashStaus un valore restituito dal metodo flush della classe SharedObject ( a cui passo un valore massimo di scrittura in bytes )
flushStatus=_so.flush(10000);
}
catch (error:Error)
{
se qualcosa va storto faccio un trace ( quì sta a voi aggiungere un messaggio eventualmente )
trace('Errore...non riesco a scrivere i dati su disco');
}
if(flushStatus != null)
{
se l' operazione di scrittura è andata a buon fine ( lo si capisce dal fatto che flushStatus non è più null ) controllo il valore di flushStatus
switch(flushStatus)
{
se il valore di flashStatus è ' pending ' ( restituito dall' evento PENDING della classe SharedObjectFlushStatus ) significa che l' utente molto probabilmente ha un sistema di sicurezza abilitato che richiede una conferma del salvataggio su disco ( tipo la disattivazione dei cookies ), per cui assegno il testo a output_txt che avvisa l' utente che serve l' autorizzazione. A questo punto si aprirà una finestra all' utente ( ripeto: solo in caso avesse un sistema di sicurezza che non permette la scrittura su disco senza autorizzazione ) .Quindi adesso devo controllare se l' utente autorizza o nega il permesso. Per fare questo, devo aggiungere un lstener a _so in ascolto dell' evento NET_STATUS della classe NetStatusEvent che chiamerà il metodo onFlashStatus
case SharedObjectFlushStatus.PENDING:
output_txt.appendText('Richiesta permessi per salvataggio oggetto in corso...\n');
_so.addEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
break;
se il valore di flashStatus è ' flushed ' ( restituito dall' evento FLUSHED della classe SharedObjectFlushStatus ) sposto la timeline al frame 2 che avviserà l' utente del successo dell' operazione
case SharedObjectFlushStatus.FLUSHED:
gotoAndStop(2);
break;
}
}

onFlashStatus()
in questo momento l' utente ha chiuso la finestra di dialogo ed ha confermato o negato il premesso
output_txt.appendText("L'utente ha chiuso la finestra di dialogo.\n");
quì controlliamo se appunto ha confermato o negato in base alla proprietà code dell' oggetto info dell' evento PENDING della classe SharedObjectFlushStatus ( lol... sembra un gatto che si morde la coda ) e se ha confermato avviso con un mesaggio sempre assegnato ad output_txt che è il campo di testo sullo Stage
switch (event.info.code)
{
case "SharedObject.Flush.Success":
output_txt.appendText("L' utente ha confermato il permesso.\n");
break;
se non ha confermato avviso comunque l' utente della sua negazione
case "SharedObject.Flush.Failed":
output_txt.appendText("L' utente ha negato il permesso.\n");
break;
}
rimuovo il listener in ascolto di NetStatusEvent.NET_STATUS
_so.removeEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);

clearCookie();
questo metodo viene chiamato se l' utente decide di cancellare i suoi dati, quindi avviso con un messaggio
info_mc.info_txt.text='I tuoi dati sono stati cancellati dallo Shared Object, chiudi e riapri il browser e vedrai...';
e rimuovo le tre proprietà che avevo creato allo SharedObject ( _so )
delete _so.data.nome;
delete _so.data.citta;
delete _so.data.eta;
Allego i files sorgente:
Attached Files
File Type: zip shared_object.zip (574.7 KB, 9 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; 04-06-08 at 23:33.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #2 (permalink)  
Old 17-09-08, 14:08
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: SharedObject con Actionscript 3.0

Ci dev'essere un errore in partenza perchè a me dice questo:

[IMG]file:///C:/Users/fJ/AppData/Local/Temp/moz-screenshot.jpg[/IMG]ReferenceError: Error #1056: Impossibile creare la proprietà label su flash.display.SimpleButton.
at Main/init()
at Main()

non sono poi andato avanti!
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 17-09-08, 14:24
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: SharedObject con Actionscript 3.0

scusate, bisogna usare per forza un componente, io avevo crato tasti miei....per questo non funzionava.

Si può mettere label a un tasto creato da sè?
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
SharedObject with Actionscript 3.0 Flep Tutorials 9 16-06-08 03:43
AS3 e gli SharedObject Remoti, AIUTO! lorenz82 Actionscript 3.0 avanzato 2 12-01-08 18:04


All times are GMT. The time now is 07:46.


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


FlepStudio
by Filippo Lughi
P.IVA 03605860406