Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Problemi con fl.transition.Tween - Actionscript 3

    Ho creato un'animazione di ingresso e d'uscita di foto, che vengono caricate, tramite la funzione Load, da una cartella esterna al file swf. Per l'animazione ho utilizzato la classe Tween (la funzione alpha e quella scaleX/Y). Ho provato il filmato online ma nn funziona correttamente. Cioè, le immagini -a volte - rimangono sbiadite oppure piccole. Com'è possibile ke l'animazione funzioni ad intervalli? Ho provato la stessa animazione con le foto importate e tutto funziona correttam. Ma le foto sono troppe e quindi nn possono essere importate all'interno del file swf. Potete aiutarmi a risolvere questo mistero?
    Grazie.
    Margherita

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    E' presumibile che questi sfasamenti (definiamoli così) siano dovuti al fatto che le transizioni non siano sincronizzate con l'evento di avvenuto caricamento delle immagini (che è di tipo asincrono).
    In altre parole è come se la tween partisse quando ancora non è presente l'immagine generando quindi un calcolo errato dei relativi valori.
    Ovviamente questa è un'ipotesi.
    Per capire meglio dovresti postare la parte di script che riguarda il caricamento e la transizione delle immagini.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Postare il codice nn sarà una cosa semplice, ma ci proverò ugualm. Il codice seguente si riferisce ai pulsanti ke aprono le relative pagine.
    codice:
    stop();
    
    import fl.transitions.Tween;
    import fl.transitions.easing.*;
    import fl.transitions.TweenEvent;
    import fl.motion.easing.*;
    
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    
    
    var miotween:Tween;
    
    
    var fin:Number=1;
    
    var fout:Number=-1;
    
    var idpagina:uint;
    
    var paginaIN=Pagine;
    var paginaOUT=Pagine;
    
    var lista_menu:Array=new Array(menu.g0,menu.g1,menu.g2,menu.g3,menu.g4);
    
    
    inizializzo();
    
    paginaIN= new Pagine();
    paginaOUT= new Pagine();
    
    addChild(paginaIN);
    addChild(paginaOUT);
    
    paginaIN.x=paginaOUT.x=180;
    paginaIN.y=paginaOUT.y=148;
    
    paginaIN.visible=false;
    paginaOUT.visible=false;
    
    mostroPagina(1,-1);
    
    
    function inizializzo():void {
    
    
    	for (var i=0; i<lista_menu.length; i++) {
    
    		lista_menu[i].mouseChildren=false;
    
    		lista_menu[i].buttonMode=true;
    
    		lista_menu[i].idpagina=i+1;
    
    		lista_menu[i].addEventListener(MouseEvent.CLICK,aggiungo);
    
    		lista_menu[i].addEventListener(MouseEvent.MOUSE_OVER,aggiungo);
    
    
    	}
    
    }
    
    function aggiungo(evt:MouseEvent):void {
    
    	var id:uint=uint(evt.currentTarget.idpagina);
    
    	cambiopagina(id);
    
    }
    
    
    
    function cambiopagina(clickmenu:uint):void {
    
    	fin=clickmenu;
    
    	mostroPagina(fin,fout);
    
    	fout=fin;
    
    }
    
    function mostroPagina(pin:uint, pout:Number):void {
    	if (fin!=fout) {
    		ingressoPagina(pin);
    
    
    	}
    
    	if (fin!=fout&&pout!=-1) {
    
    		uscitaPagina(pout);
    	}
    }
    
    function ingressoPagina(idpagina:uint):void {
    	paginaIN.visible=true;
    	paginaIN.gotoAndStop(idpagina);
    
    	var miotween=new Tween(paginaIN,"alpha",Regular.easeIn,0,1,0.2,true);
    	
    }
    
    function uscitaPagina(idpagina:uint):void {
    	paginaOUT.visible=true;
    	paginaOUT.gotoAndStop(idpagina);
    
    	var miotween=new Tween(paginaOUT,"alpha",Regular.easeOut,1,0,0.2,true);
    }
    All'interno del movieclip Pagine, ho inserito diversi frames (tanti quante sono le pagine da visualizzare). All'interno di ciascun frame ho inserito il seguente codice, in cui variano solo i nomi delle foto e dei testi:

    codice:
    import flash.display.*;
    import flash.net.URLRequest;
    
    import LoadImg;
    
    var img:LoadImg=new LoadImg("cartella/foto.png");
    
    addChild(img);
    
    ////carico testo
    
    var loader:URLLoader= new URLLoader();
    
    var testo_file:URLRequest=new URLRequest("testi/testo.txt");
    
    loader.addEventListener(Event.COMPLETE, mostroTesto);
    
    loader.load(testo_file);
    
    
    function mostroTesto(evt:Event):void {
    
    	var testo:TextField= new TextField();
    
    	testo.x=215;
    	testo.y=-187;
    
    	testo.wordWrap=true;
    	testo.autoSize=TextFieldAutoSize.LEFT;
    	testo.width=317;
    	testo.multiline=true;
    
    	var loader:URLLoader=URLLoader(evt.target);
    	testo.htmlText=loader.data;
    	addChild(testo);
    }
    Di seguito il file di classe LoadImg.as:
    codice:
    package {
    
    	import flash.display.*;
    	import flash.net.URLRequest;
    	import flash.events.*;
    	import flash.text.*;
    
    	import fl.transitions.Tween;
    	import fl.transitions.easing.*;
    
    	public class LoadImg extends Sprite {
    
    		private var _loaderStato:TextField;
    		public var id:uint;
    		private var loader:Loader;
    		private var prx,pry:uint; //queste sono le coordinate del preloader
    		private var pr,cornice_mc:MovieClip;
    
    		public function LoadImg(url:String="",imgx:uint=0,imgy:uint=0) {
    
    			prx=imgx;
    			pry=imgy;
    			cornice_mc= new Cornice(); //questa cornice serve x centrare le immagini 
    
    			loader=new Loader  ;
    			loader.contentLoaderInfo.addEventListener(Event.OPEN,apri);
    			loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,progresso);
    			loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completo);
    			loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,errore);
    
    
    			loader.load(new URLRequest(url));
    
    			cornice_mc.x=imgx;
    			cornice_mc.y=imgy;
    
    			cornice_mc.mouseChildren=false;
    			cornice_mc.addChild(loader);
    			addChild(cornice_mc);
    
    
    		}
    
    		private function apri(evt:Event):void {
    
    			pr=new Preloader();
    			addChild(pr);
    			pr.x=prx;
    			pr.y=pry;
    
    
    		}
    		private function progresso(evt:ProgressEvent):void {
    
    			var percent:Number=evt.bytesLoaded/evt.bytesTotal*100;
    			pr.testo_mc.text="Loading.... "+percent;
    
    		}
    		private function completo(evt:Event):void {
    
    			removeChild(pr);
    			pr=null;
    
    			loader.x=- loader.width/2;
    			loader.y=- loader.height/2;
    
    			new Tween(cornice_mc,"scaleX",Regular.easeIn,0.3,1,0.5,true);
    			new Tween(cornice_mc,"scaleY",Regular.easeIn,0.3,1,0.5,true);
    			
    		}
    
    		private function errore(evt:IOErrorEvent):void {
    
    			trace("errore caricam. immagine");
    
    
    		}
    
    	}
    
    }
    Dove sbaglio? :master:
    Margherita

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    :master:
    Metto da parte quanto ho indicato nel precedente post, il problema non sembra essere lì.

    Ho fatto qualche prova ma ho concluso ben poco.
    Ad ogni modo trovo un po' di confusione nella struttura dello script (molte parti mi sembrano ridondanti) e nel metodo utilizzato per raggiungere lo scopo.

    In pratica hai utilizzato due istanze per definire la pagina in entrata e quella in uscita e al cambio pagina indirizzi questi due clip a dei frame specifici che ne definiscono le pagine (e quindi i relativi contenuti). In ogni frame hai scritto di aver inserito uno script che carica i contenuti. Già questo a mio parere non è un buon procedimento. A parte lo script ridondante (ripetuto in ogni frame), avendo i due clip che contengono dei loader e saltando da un frame all'altro in quel modo, credo che potresti avere dei problemi dovuti al verificarsi dei vari eventi relativi ai loader.

    Oltre questo c'è il problema dei tween che molto probabilmente creano degli errori sempre per lo stesso motivo. Cioè perché vengono in qualche modo associati sempre ai 2 clip creando delle sovrapposizioni tra un tween e l'altro nel momento in cui si cambia pagina.

    Per risolvere puoi fare in due modi.
    Potresti interrompere i tween creati nel caso si verifichi appunto l'avvio di un nuovo clip prima che il precedente sia terminato.
    Dovresti quindi istanziare i due tween di uscita e entrata (per quanto riguarda l'effetto alpha) utilizzando delle variabili a livello della root e interromperli opportunamente con il relativo metodo stop() prima di ridefinirli e avviarli al cambio pagina.
    Per quanto riguarda il tween sulla classe esterna non saprei.. se anche questo genera problemi credo dipenda sempre dallo stesso motivo, quindi dovresti provare ad interromperlo prima di avviarne uno "nuovo".
    Tieni presente che non ho avuto modo di testare la cosa nello specifico.

    In qualunque caso io opterei per una diversa soluzione, anche se il problema non dovesse dipendere da questo. Anziché utilizzare due clip per la pagina in uscita e quella in entrata, taglierei la testa al toro inserendo direttamente un nuovo clip ogni volta che si cambia pagina, e distruggendo quello già esistente dopo che ha eseguito il tween d'uscita.
    In questo modo ogni riferimento (variabili, tween o altro) definito in quella determinata istanza avrà fine nel momento in cui l'istanza non esisterà più.
    Mi sembra una strada più sensata.

    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Scusami ma nn ho capito benissimo quello ke mi consigli di fare. Purtroppo io ho iniziato ad usare l'as3 solo quest'estate e quindi diciamo ke sono una principiante. Nn capisco come interrompere i tween. E nn capisco neanke la tua frase:"....inserendo direttamente un nuovo clip ogni volta che si cambia pagina, e distruggendo quello già esistente dopo che ha eseguito il tween d'uscita." :master:
    Puoi darmi una mano?
    Margherita

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    Non preoccuparti, io ho iniziato ad usare l'AS3 giusto da qualche settimana ...per necessità di lavoro, altrimenti avrei tranquillamente continuato ad usare il fratello minore AS2 con cui ho molta più padronanza.

    Comunque sia non si tratta tanto dello strumento utilizzato (il linguaggio di programmazione) ma più che altro del metodo da applicare per ottenere un determinato risultato nel miglior modo possibile. Ovviamente ci sono sempre mille modi per fare ogni cosa, bisogna quindi valutare i vari aspetti.
    Credo infatti che sia più pratico, funzionale e meno dispendioso (relativamente al risparmio di risorse) creare ogni istanza "pagina" al momento opportuno (cioè nel momento in cui si clicca su una voce del menu) e rimuovere quindi quella o quelle pagine non più utilizzate, piuttosto che utilizzare due istanze fisse sullo stage.
    Ecco il perché della mia frase: "inserendo direttamente un nuovo clip ogni volta che si cambia pagina, e distruggendo quello già esistente dopo che ha eseguito il tween d'uscita."

    Infatti avendo i due clip fissi.. primo, è un dispendio di risorse; secondo, dovrai fare maggiori controlli sulle variabili e istanze create, e qui entrano in ballo anche le tween che infatti rischiano di accavallarsi.

    In sostanza non dovrai far altro che inserire sullo stage la classe "Pagine" ogni volta che "cambi pagina" e allo stesso tempo avviare la tween dell'eventuale pagina presente che dovrà essere rimossa al termine dell'effetto d'uscita (cioè sull'evento motionFinish) semplicemente utilizzando il metodo removeChild().

    Questo in linea generale.
    Rivedrei comunque anche il sistema che hai utilizzato per saltare al frame della pagina specifica. Questo non serve se l'impostazione dei contenuti deve restare uguale, come presumo, anche perchè da quanto ho capito hai incollato uno stesso script su ogni frame variando giusto l'url di ciò che deve essere caricato dinamicamente... ma dal momento che comunque stai utilizzando un sistema dinamico, perché non utilizzare lo stesso script una sola volta e passare una semplice variabile per definire quello che vuoi caricare?

    Altra cosa.. ripulirei un po' tutto lo script. Ad esempio tutte le varie funzioni (aggiungo, cambiopagina, mostroPagina, ingressoPagina, uscitaPagina) a mio parere possono essere ridotte ad una funzione unica dato che più o meno una richiama l'altra.. non ha senso separare il tutto in quel modo a meno che non ci sia un motivo preciso che mi sfugge.

    Capisco che il mio discorso andrebbe a sconvolgere tutto il lavoro che hai già fatto ma prendili comunque solo come consigli. Eventualmente se hai intenzione di rielaborare il tutto come ti consiglio puoi chiedere sempre aiuto sul forum, nel caso mi farà piacere dare un aiuto se mi sarà possibile.



    PS: per interrompere la riproduzione di una tween devi semplicemente utilizzare il metodo stop(), applicandolo ovviamente all'istanza di quella determinata tween.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.