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

    Refresh di una squenza swf

    Pochi giorni fa mi sono imbattuto in un actionscript postato da enigma79, questo codice permette di leggere da un file txt cosi composto:
    Codice PHP:
    &file0=pippo.swf&
    &
    file1=pluto.swf&
    &
    file2=paperino.swf&
    &
    file3=prova.swf
    una sequenza di files swf che uno alla volta vengono caricati dentro una clip creata dinamicamente, lo stesso codice poi crea il loop.
    Riposto lo script qui con un copia/incolla dalla vecchia discussione:
    Codice PHP:
    fscommand("fullscreen"true);
    Stage.scaleMode "exactFit" 
    // BLOCCO LA ROOT; SUPERFLUO IN QUESTO CASO, UTILE SE QUESTO SWF 
    // E' ALL' INTERNO DI UNA LATRO E CARICATO
    this._lockroot true;

    // CREO IL CONTENITORE CHE E' UN MOVIECLIP CON NOME ISTANZA container DI DEFAULT
    // A POSIZIONE X = 0 / Y = 0 , VISIBLE E ALPHA 100 con ROTATION 0
    this.createEmptyMovieClip'container'this.getNextHighestDepth() );

    // CREO IL GESTORE DI EVENTI, UN OGGETTO CON METODI DEDICATI
    // COME LISTENER DEL MOVIECLIPLOADER ED ALTRI UTILI AL TUO SCOPO
    var swfloader:Object = new Object();

    // EVENTO LISTENER: onLoadInit
    //     Richiamato dal MovieClipLoader a MC caricato e disponibile
    //  [ esiste anche l' onLoadComplete, ma l' MC in quel caso non e' disponibile a keyframe 1 ]
    swfloader.onLoadInit = function( mc:MovieClip ):Void {
        
        
    // POSIZIONO L' SWF CARICATO AL PRIMO FRAME
        
    _root['container'].gotoAndStop);
        
    // LO RENDO VISIBILE
        
    _root['container']._visible true;
        
    // ASSEGNO IL PATH PER RISALIRE ALL' OGGETTO
        // swfloader QUANDO MI SERVIRA' ...
        
    _root['container'].__path this;

        
    //DIMENSIONE CLIP 100%
        
    _root['container']._xscale 186
        
    _root['container']._yscale 191

        
        
    //_root['container']._y = Math.floor( ( Stage.height / 2 ) - ( mc._height / 2 ) );
        // INIZIO L' ONENTERFRAME:
        // onEnterFrame e' un loop che ha latenza 1 fotogramma
        // questo significa che quando e' invocato non parte immediatamente
        // looppa priam sul primo keyframe del MovieClip sulla quale viene applicato
        // poi passa al successivo o fa quello che gli viene detto di fare
        // Nell' onEnterFrame il riferimento di default e' THIS, ovvero il MovieClip
        // alla quale viene applicato.
        
    _root['container'].onEnterFrame = function() {
            
    // se il frame di questo MC e' un frame minore del totale frames disponibili ...
            
    if( this._currentframe this._totalframes ) {
                
    // vado al frame successivo , ovvero questo frame + 1
                
    this.gotoAndStop( ++this._currentframe );
            }
            
    // altrimenti sono a fine frames, ergo timeline finita
            
    else {
                
    // in questo caso controllo che il contenitore con tutti gli MC
                // che e' una variabile interna all' oggetto swfloader che e' il path
                // di riferimento della variabile __path di questo MC assegnata precedentemente
                // ... se non esiste il prossimo filmato, basato sul fatto che l' array
                // swfloader.__container sara' giunto al termine
                
    if( this.__path.__containerthis.__path.__containerNum ] == undefined ) {
                    
    // allora reimposto la variabile swfloader.__containerNum a 0, cosi' 
                    // da ricaricare il primo degli SWF disponibili
                    
    this.__path.__containerNum 0;
                }
                
    // a questo punto sono sicuro che esistera' il valore contenuto nell' array
                // swfloader.__container[ this.__path.__containerNum ]
                // che per comodita' incremento di 1 per passare poi al controlo sul valore contenuto
                // nel prossimo indice dell' array swfloader.__container
                
    this.__path.loadMoviethis.__path.__containerthis.__path.__containerNum++ ] );
                
                
    // qui elimino questo onEnterFrame perche' non mi serve piu' il LOOP su questo movieClip
                
    delete this.onEnterFrame;
            }
        }
    }

    // EVENTO LISTENER: onLoadProgress
    //     Richiamato dal MovieClipLoader durante il caricamento del MovieClip
    // ci rende noti i bytes caricati e quelli totali
    swfloader.onLoadProgress = function( mc:MovieClipbl:Numberbt:Number ):Void {
        
        
    // creo la solita perc , magari la usi ma in locale questo metodo non
        // funzionera' mai, o meglio, non te ne accorgi, solo online servira' a qualcosa
        
    var p:Number Math.floor( ( bl bt ) * 100 );
        if( 
    != NaN && != infinity && ) {
            
    tracemc ', ' );
        }
    }

    // EVENTO LISTENER: onLoadError
    //     Richiamato dal MovieClipLoader se e' impossibile caricare il file richiesto
    // Rende noto l' errore generato
    swfloader.onLoadError = function( mc:MovieCliperror:String ):Void {
        
    traceerror );
    }

    // EVENTO PERSONALE, ASSEGNATO PER COMODITA': loadMovie
    // Questo evento dell' oggetto swfloader altro on fa che eliminare
    // il precedente MovieClipLoader per ricrearlo su una variabile interna
    // quale e' __ML__ , allo stesso tempo esegue l' unloadMOvie sul MovieClip
    // container della _root, probabilmente superfluo visto che un loadMovie su
    // un movieClip che ha caricato qualcosa, scarica questo qualcosa in automatico
    // ... ma imho sempre meglio fare le cose in modo ordinato
    swfloader.loadMovie = function( swf:String ):Void {
        
    // metto l' MC invisibile, cosi' durante il caricamento, nell' onLoadProgress
        // sono sicuro che se l' SWF non ha STOP(); a inizio filmato tale filmato non mi parta per
        // i fatti suoi frame dopo frame , a seconda di cosa carica
        
    _root['container']._visible false;
        
        
    // se e' almeno la seconda volta che richiamo questo metodo __ML__ sara' definito
        
    if( this.__ML__ != undefined ) {
            
    // quindi scarico il MovieClip container e cancello la variabile __ML__ ....
            
    _root['container'].unloadMovie();
            
    delete this.__ML__;
        }
        
    // la quale viene riassegnata o creata come MovieClipLoader
        
    this.__ML__ = new MovieClipLoader();
        
    // per poi aggiungergli swfloader come listener, in modo da far gestire al MovieClipLoader
        // glie eventi dedicati descritti sopra
        
    this.__ML__.addListenerthis );
        
    // per poi dirgli cosa caricare e dove, in questo caso carica il testo contenuto
        // in swf sul movieClip _root['container']
        
    this.__ML__.loadClipswf_root['container'] );
    }

    // EVENTO PERSONALE, ASSEGNATO PER COMODITA': preload
    // Questo metodo er' l' inizializzatore di tutto sto' sistemino di caricamento files
    // altro non fara' che leggersi le informazioni sui nomi dei files che andranno a popolare
    // l' array creato per gestire il loop, inizializzare, oltre l' array, una variabile
    // numerica per controllare o sapere sempre a che punto dell' array sono e cosa devo 
    // caricare poi, tale variabile sara' swfloader.__containerNum , mentre l' array sara'
    // swfloader.__container
    swfloader.preload = function( txtFile:String ):Void {
        
        
    // creo l' oggetto LoadVars con scope interno, perche' una volta usato non mi servira' piu'
        
    var __lv__:LoadVars = new LoadVars();
        
    // dico a questo oggetto il path di riferimento per creare o gestire variabili appartenenti a swfloader
        // ovviamente essendo dentro un metodo di swfloader il path di riferimento sara' THIS, riferito a se stesso
        
    __lv__.__path this;
        
    // scrivo cosa fare all' onLoad
        
    __lv__.onLoad = function( s:Boolean ):Void {
            
    // se trovo il file ...
            
    if( == true ) {
                
    // creo la variabile swfloader.__container come nuovo Array
                
    this.__path.__container = new Array();
                
    // mi creo una variabile convenzionale per fare il loop delle informazioni nel file di testo
                
    var a:Number 0;
                
    // finche' esiste 'fileN' dove N sara' incrementato di 1 in 1 ad ogni loop di questo ciclo ...
                
    while( this['file'+String(a)] != undefined ) {
                    
    // aggiungi all' Array swfloader.__container il nome o il testo di questa variabile
                    // this['file'+String( a )] sara' esattamente this.file0 , this.file1, etc etc
                    // per comodita' incremento la a direttamente in assegnazione
                    
    this.__path.__container.pushthis['file'+Stringa++ )] );
                }
                
    // arrivati a this.fileN , inesistente , quindi undefined, quindi usciti dal ciclo precedente ...
                // creo la variabile numerica swfloader.__containerNum facendola partire da 0 ... poi
                // sara' questo applicativo stesso a gestirla, incrementarla o riresettarla
                
    this.__path.__containerNum = new Number);
                
                
    // bene, ho le informazioni sull' array, ho il primo elemento da caricare
                // ... quale momento migliore per far partire il tutto ???
                
    this.__path.loadMoviethis.__path.__containerthis.__path.__containerNum++ ] );
                
    // per comodita' incremento di uno la variabile swfloader.__containerNum
                // cosi' al prossimo controllo sull' array verifichero' che esista
                // swfloader.__container[1] e non zero che gia' so di averlo usato e che quindi e' presente nell' array
            
    }
            else {
                
    // impossibile caricare il file di testo
                
    this.__path.onLoadError_root'Impossibile caricare il file: ' txtFile );
            }
        }
        
        
    // effettuo il load del file specificato in txtFile
        
    __lv__.loadtxtFile );
    }

    // avvio l' ambaradan ...
    swfloader.preload'file.txt' ); 
    Lo script funziona benissimo ho solo una piccola difficoltà...
    Devo utilizzare un proiettore in exe che mi fa vedere questa lista di file in sequenza ripetuta all'inifinito, ma considerando che nel corso del tempo il file txt può essere aggiornato (da un altro sistema automatico gia presente) ho la necessità di ricaricare la nuova lista di file all'interno dello script.
    Quindi in buona sostanza servirebbe una sorta di refresh che avviene ogni volta che lo script legge l'ultimo swf della lista.
    a chiunque può darmi una mano o un suggerimento per risolvere la questione glie ne sono molto grato.
    io intanto continuo a fare prove

  2. #2
    ragazzi non ci sono proprio, datemi una mano che sto per impazzire

  3. #3
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    Ciao.

    Ho provato lo script proposto da enigma ma ho voluto rielaborare un po' il tutto giusto per apportare alcune migliorie, tra cui l'aggiornamento dei dati a fine ciclo come da te richiesto.

    Ecco le migliorie apportate:

    - Snellita la struttura del txt e aggiunta variabile folder. Può essere specificata, opzionalmente, la variabile "folder" per indicare il percorso di una cartella da cui si vogliono pescare i filmati swf, mentre dovrà essere specificata la variabile "files" in cui si dovranno indicare, uno sotto l'altro, i nomi dei file swf. Sarà inoltre possibile escludere l'estensione ".swf" nei nomi, lo script rielaborerà in maniera opportuna ogni dato.

    - Utilizzati contenitori differenti per il caricamento degli swf. Ogni swf resterà in attesa sull'ultimo frame finché il successivo swf non sarà pronto ad avviarsi, così da non creare vuoti nel passaggio tra un swf e l'altro. Sarà quindi possibile, volendo, inserire degli eventuali effetti per creare una dissolvenza.

    - Salto al caricamento del prossimo swf se un file dovesse generare un errore durante il caricamento. In questo modo il filmato non si interromperà ma proseguirà col caricamento dei successivi swf, dove possibile.

    - Aggiornamento dati in runtime. Ovviamente modificando il file txt durante l'esecuzione, la sequenza si aggiornerà automaticamente alla fine dell'ultimo filmato, come richiesto.

    Spero possa andare bene.

    Ecco un esempio del file txt:
    codice:
    folder=filmati/altra cartella/disney/
    &files=
    pippo.swf
    minnie
    topolino
    pluto.swf
    zio paperone
    ... e lo script da piazzare nell'unico frame:
    Codice PHP:
    fscommand("fullscreen"true);
    this._lockroot true;
    var 
    swfList:Array;
    var 
    folder:String;
    var 
    mcl:MovieClipLoader = new MovieClipLoader();
    var 
    = [];
    l.onLoadStart = function(t) {
        
    t._visible false;
    };
    l.onLoadInit = function(t) {
        
    t._visible true;
        
    t.play();
        (
    oldmc) && removeMovieClip(oldmc);
        
    _root.onEnterFrame = function() {
            if (
    mc._currentframe == mc._totalframes) {
                
    delete _root.onEnterFrame;
                
    mc.stop();
                
    loadNextSwf();
            }
        };
    };
    l.onLoadError = function() {
        
    loadNextSwf();
    };
    mcl.addListener(l);
    function 
    loadNextSwf() {
        if (
    swfList.length) {
            var 
    swfList.shift().toLowerCase();
            (
    s.substr(-4) != ".swf") && (+= ".swf");
            if (!
    oldmc) {
                
    this.mc.swapDepths(0);
                
    this.mc._name "oldmc";
            }
            
    this.createEmptyMovieClip("mc"1);
            
    mcl.loadClip(_root.folder+smc);
        } else {
            
    update("file.txt");
        }
    }
    function 
    trim(str) {
        for (var 
    0str.charCodeAt(i)<33i++) {
        }
        for (var 
    str.length-1str.charCodeAt(j)<33j--) {
        }
        return 
    str.substring(ij+1);
    }
    function 
    update(txt) {
        var 
    lv = new LoadVars();
        
    lv.onLoad = function(ok) {
            if (
    ok) {
                
    _root.folder trim(this.folder) || "";
                (
    _root.folder != "" && _root.folder.substr(-1) != "/") && (_root.folder += "/");
                
    swfList = [];
                var 
    this.files.split("\r\n").join("\r").split("\r").join("\n").split("\n");
                for (var 
    i in s) {
                    ((
    i=trim(s[i])) != "") && swfList.unshift(i);
                }
                
    loadNextSwf();
            } else {
                
    trace('ERRORE CARICAMENTO DATI');
            }
        };
        
    lv.load(txt);
    }
    update("file.txt"); 
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  4. #4
    da una semplicissima prova sembra funzionare alla perfezione.
    ti ringrazio tantissimo e ti aggiorno sulle prove che continuerò a fare
    sei stato veramente molto molto gentile

  5. #5
    allora, ho effettuato tutte le prove possibili (credo) e sono arrivato alla conclusione che va fatto un mezzo busto, decidi tu il materiale killerworm bronzo, acciao, marmo oppure oro?

    grazie tante veramente lo devo studiare per bene ora

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,780
    Bene
    Una birra sarebbe più che sufficiente

    Buono studio e buon proseguimento.
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.