Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di MoSAIk
    Registrato dal
    Jun 2010
    Messaggi
    12

    chiudere SWF esterno AS3

    La situazione è la seguente e ringrazio anticipatamente chiunque riesca a dissolvere questo enigma inestricabile (è una settimana che per lavoro devo finire questo flash e mi manca solo questo dettaglio, ma nonostante forsennate ricerche sul web, nulla fa al caso mio):

    Anzitutto, il sorgente lo potete trovare qui.

    Nella cartella vi è un index.swf che è la pagina iniziale di un ipotetico sito.

    Ci sono 4 bottoni: page1,page2,page3 e page4. Ognuno di essi, cliccandoci sopra:

    1) attiva il blur a tutti e 4 i bottoni (grazie alle classi TweenMax)
    2) apre un SWF eserno con la funzione [ loader.load(new URLRequest("page1")) ], corrispondente alla pagina linkata al bottone: bottone 1 >> page1.swf, bottone 2 >>page2.swf ecc...ecc...

    Il problema è attivare quel maledetto tasto back che, essendo sull'swf esterno, non può interagire con l'index di partenza (banalmente, non si può usare il comando [ loader.unload ] perchè il loader è nell'SWF di partenza, non in page1.swf, page2.swf, page3.swf o page4.swf).

    Inoltre, da quell'SWF esterno non posso nemmeno reimpostare a 0 i paramentri del BLUR perchè le classi e i comandi di questo sono sempre nell'index e non nell'swf caricato esternamente.

    Come faccio quindi a chiudere quel dannato SWF e disattivare il BLUR, quindi a tornare indietro all'swf index.swf di partenza? Usare il comando [ remove.Children ] potrebbe essere un'idea, ma purtroppo una volta rimossi i children, l'swf è chiuso totalmente, ma è comunque impossibile reimpostare il blur a 0, poichè il tasto BACK si trova sull'swf esterno e non qull'index.swf.

    Sono qui per delucidazioni se mi sono spiegato male, ma aprendo index.swf nel file dovrebbe essere tutto chiaro. Ringrazio anticipatamente tuti quanti, perchè devo assultamente chiudere questo lavoro e sono veramente alla frutta. Sul web ci sono centinaia di soluzioni simili, ma nessuna che agisca dall'swf esterno.

    G.

  2. #2
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    Ciao

    Cerco di capire il tuo problema:

    1) Hai un .swf "index" e cliccando su un pulsante carichi dentro "index" un .swf esterno. Giusto ?
    2) Quando l'.swf esterno è caricato, in quest'ultimo c'è un pulsante che deve agire sull'.swf "caricatore" rimuovendo se stesso ovvero l'.swf caricato dal "caricatore". E' esatto ?

  3. #3
    Utente di HTML.it L'avatar di MoSAIk
    Registrato dal
    Jun 2010
    Messaggi
    12
    esattamente, sì

    nell'index c'è il loader, il caricatore che carica l'swf esterno,
    ma è l'swf esterno a dover chiudere sè stesso e lasciare libero l'index.

    EDIT:

    se hai la possibilità di scaricare lo zip da sopra, cliccando su index.swf, vedrai i 4 bottoni a cui mi riferisco. Cliccandoci sopra apriranno ognuno la pagina swf di riferimento, mantenendo sotto l'swf index di base.

  4. #4
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    nell'index c'è il loader, il caricatore che carica l'swf esterno,
    ma è l'swf esterno a dover chiudere sè stesso e lasciare libero l'index.
    Ecco allora: Devi fare in modo che "index" sia visto come un MovieClip.

    Quindi nell'.swf da caricare metti questo codice nel primo fotogramma:

    Codice PHP:
    addEventListener(Event.ADDED_TO_STAGE,init);
    function 
    init(evt:Event):void
    {
        var 
    indice:MovieClip=this.parent.parent as MovieClip;
        
    indice.gotoAndStop(2)

    Praticamente in questo caso appena il filmato .swf viene caricato sullo stage principale interagisce sul "caricatore" spostando la sua timeline al fotogramma 2.

    Questo per farti un'esempio di come poter interagire sul tuo filmato index.swf dai filmati .swf caricati dall'esterno, spero ti sia utile per risolvere.

    ciao

  5. #5
    Utente di HTML.it L'avatar di MoSAIk
    Registrato dal
    Jun 2010
    Messaggi
    12
    Cioè tu dici di mettere nel primo fotogramma dell'swf esterno quel listener?

    ma che evento è ADDED_TO_STAGE?

    Perchè comunque non succede niente nell'SWF caricatore...cioè è come non averlo messo

    veramente non so dove sbattere la testa con qesta storia maledetta. Ma se mai riuscissi a farlo funzionare che me ne faccio del caricatore al secondo fotogramma? Voglio dire, non è AS2 che ho 1000 fotogrammi diversi, ne ho solo uno con dentro i miei mc. Ma è mai possibile che non esista un comando che dica all'swf ''chiuditi!'' e basta?

  6. #6
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    Come ho scritto sopra, questo è un esempio di come da un .swf "caricato" si può interagire sulla timeline del "caricatore".

    Per cui lavorandoci sù, si potrebbe richiamare una funzione presente nel "caricatore" che rimuove l'oggetto caricato in precedenza ma nel tuo caso, non è affatto semplice perchè hai utilizzato variabili locali nelle funzioni di caricamento dei file esterni e l'addChild invece di attaccare allo stage il loader specifico (page1, page2 ecc..) attacca il "currentTarget.content" appoggiato a un'altra variabile locale uguale per tutti i Loader.

    Quindi nella tua funzione richiamata dal file esterno, servirebbe un Listener applicato allo stage principale che monitorizza lo stato dello Stage e che chiama a sua volta una funzione interna con una condizione if che valuta SE esiste un oggetto attaccato con addChild e se si, lo rimuove con il removeChild.

    Insomma, qualcosa di piuttosto macchinoso.

    Un oggetto inserito in un contenitore, per essere rimosso deve essere fatto vuotando il contenitore stesso.
    Non ho mai visto nè sentito di un .swf che una volta aperto si chiude da sè !

    La costante Event.ADDED_TO_STAGE sembra che non faccia nulla e invece è piuttosto importante perchè definisce il valore della proprietà dell'oggetto "attaccato" allo stage dall'esterno, permettendo allo stage stesso di avere un totale controllo su di esso come se fosse un MovieClip interno.

    ciao

  7. #7
    Utente di HTML.it L'avatar di MoSAIk
    Registrato dal
    Jun 2010
    Messaggi
    12
    ti ringrazio, sei stato molto chiaro.

    A questo punto, dovrei trovare un modo più semplice per caricare l'swf esterno. Purtroppo non sono un programmatore esperto di AS3, sto imparando a poco a poco con un background di AS2.

    Forse sarebbe più facile comporre una classe e richiamarla all'interno dei due swf. O meglio, fare un package linkato ad entrambi i file: se ho capito bene, posso richiamare la classe all'interno dei due fla in maniera indipendente. In questo modo dovrei riuscire ad eliminare il problema di avere due livelli e due timeline su cui lavorare. Purtroppo io ho ragionato convertendo il vecchio sistema del loadMovieNum, con cui andavi a piazzare dove volevi l'oggetto sul livello, e poi lo fermavi con un unloadMovieNum.

    Consigliami pure tu, grazie mille,
    G.

  8. #8
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    Ciao

    Anch'io non sono un programmatore esperto ma a mio parere l'alternativa più semplice e fattibile sul tuo progetto è quella di gestire il load e l'unload dal caricatore stesso.

    Quando appare il filmato caricato, si potrebbe far apparire il pulsante "back" su un livello superiore a quello dove viene caricato il filmato e avresti lo stesso effetto di visualizzazione.
    Quando fai il removeChild del "figlio.swf", rimuovi anche il pulsante precedentemente "attaccato" allo stage dalla libreria del .fla.
    Ancora più semplice sarebbe posizionare il pulsante al di fuori dell'area occupata dall'.swf caricato, in modo di lasciare a Flash la gestione dei livelli in automatico.

    Per la prima soluzione, più vicina alla tua idea iniziale, dovresti vedere come si gestiscono i livelli in dinamico con la proprietà numChildren e il metodo setChildIndex che permette appunto di settare un oggetto su uno specifico livello e quindi rimuoverlo con removeChild.


    In questi giorni ho studiato su un codice che ti ho ipotizzato sopra per vedere appunto come creare la condizione if che valuta se esiste un filmato caricato e quindi lo rimuove riportando lo stage nelle condizioni originali.
    Ho poi provato a vedere se riuscivo a rimuovere un qualsiasi oggetto posizionato sullo stage principale, partendo dal file esterno.
    Sono riuscito a rimuovere qualsiasi oggetto dal file esterno compreso l'oggetto "chiamante stesso" (.swf esterno) ma in questo caso, quando ritorno sullo stage principale non funziona più nulla.
    Se invece rimuovo un pulsante o un'altro oggetto qualsiasi partendo dal filmato "chiamante" allo stage principale, funziona ma con il metodo che ho usato removeChildAt(numeroLivello) ovviamente il contenuto del livello cambia sempre ovvero: se ora rimuovo l'oggetto nel livello 2, la volta successiva sul livello 2 c'è quello che era sul 3 e di conseguenza a seconda delle volte che clicco sul pulsante per la rimozione del livello, cancello tutto quello che c'è sullo stage.

    Insomma da quel che ho capito alla fine è che forse si può riuscire a cancellare un oggetto dal suo interno, ovviamente, agendo sul contenitore che lo contiene ma il tutto sarebbe una "macchinata" non facile da realizzare e ci sarebbe da chiedersi se ne vale davvero la pena.

    Comunque se ti interessa quest'ultimo studio che ho fatto, specialmente la prima parte, fammelo sapere e posto il codice con le relative spiegazioni.


    ciao

  9. #9
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    Sono riuscito a mettere il pulsante "back" nell' index e fare in modo che si visualizzi su un livello sopra l'swf caricato.
    Praticamente, al click sul pulsante "back" che nel codice ho chiamato "resetta" viene richiamata la funzione che rimuove il loader caricato.

    Codice PHP:
    var topPosition:int=5;
    var 
    resetta:Resetta=new Resetta();
    resetta.buttonMode=true;
    resetta.x=170;
    resetta.y=300;

    var 
    filmatiEsterni:Array=new Array("page1.swf","page2.swf","page3.swf","page4.swf");
    var 
    bottoni:Array=new Array(bottone1,bottone2,bottone3,bottone4);
    var 
    request:URLRequest;
    var 
    caricatore:Loader=new Loader();
    var 
    proprietario:MovieClip=new MovieClip();
    addChild(proprietario);

    for (var 
    i:int=0i<filmatiEsterni.lengthi++) {
        
    bottoni[i].identificatore=i;
        
    bottoni[i].mouseChildren=false;
        
    bottoni[i].buttonMode=true;

        
    bottoni[i].addEventListener(MouseEvent.MOUSE_DOWN,bottoneDown);
    }
    function 
    bottoneDown(evento:MouseEvent):void {
        if (
    caricatore!=null) {
            
    caricatore.unload();
        }
        
    request=new URLRequest(filmatiEsterni[evento.target.identificatore]);
        
    caricatore.contentLoaderInfo.addEventListener(Event.COMPLETE,filmatoCaricato);
        
    caricatore.load(request);
        
    addChild(resetta);
        
    setChildIndex(resettatopPosition);
    }
    function 
    filmatoCaricato(evento:Event):void {
        if (
    proprietario.numChildren>0) {
            
    proprietario.removeChildAt(0);
        }
        var 
    filmatoSWF:MovieClip=evento.target.loader.content as MovieClip;
        
    proprietario.addChild(filmatoSWF);
    }

    resetta.addEventListener(MouseEvent.CLICK,funzioneAzzero);

    function 
    funzioneAzzero(evento:MouseEvent):void {
        
    proprietario.removeChildAt(0);

    Ho applicato questo codice al tuo index, aggiungendo il pulsante "back" in libreria esportato per AS.
    Praticamente appare sopra l'.swf caricato, nella stessa posizione dove era sui tuoi file esterni e funziona perfettamente.

    Come vedi ho eliminato la parte che riguarda il BLUR ma credo che non avrai problemi a reinserirla nelle funzioni in cui serve.
    Puoi scaricare il file di esempio da qui: LoaderMultiplo con Reset

    ciao

  10. #10
    Utente di HTML.it L'avatar di MoSAIk
    Registrato dal
    Jun 2010
    Messaggi
    12
    Bè che dire, mi sembra perfetto! Ora lo testo sul progetto originale (perchè chiaramente, per motivi di privacy del cliente il file postato era un esempio fatto al volo della mia situazione), ma dovrebbe funzionare.

    Ti ringrazio moltissimo, sei stato davvero illuminante, ottimo lavoro!

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.