beh... scusate per il ritardo alla mia risposta, ma sono particolarmente impegnato ultimamente...
cmq, ecco il codice. Questo programmino in AS legge un determinato file XML, il quale contiene 3 nodi principali:
1. lista di filmati;
2. indirizzo relativo per poter uscire dal Loop (questa applicazione prevede la riproduzione FullScreen)
3. file sul quale salvare il numero di filmato e il fotogramma dal quale far ripartire il Loop
In pratica:
1. il Loader carica il file XML prelevando la lista di file e ne esegue sia un conteggio che ne realizza un array da poter usare nella funzione avviaFilmato().
2. Preleva il nome di file dal quale catturare le informazioni del numero del filmato ed il fotogramma dal quale far ripartire quel filmato (indicato all'interno del file XML).
3. Terminata la lettura, viene tutto dato in pasto alla funzione avviaFilmato() il quale inizia a caricare il filmato indicato dal file esterno, ed al termine esegue il successivo. Arrivato all'ultimo filmato ricomincia dal primo e così via.
4. La funzione avviaFilmato() viene lanciata non appena termina la lettura del file esterno con il numero di clip ed il fotogramma di start; a seguito, poichè la funzione è ricorsiva (richiama, cioè sè stessa), esegue un controllo del numero di clip eseguito e del successivo. Se tale numero è maggiore del numero massimo di clip (meno uno, poichè l'array inizia dall'elemento ZERO), riparte il ciclo dal filmato uno (ovvero l'elemento ZERO dell'array).
Di seguito, riporto il codice (un pò di commenti ci stanno, cmq!)...
codice:
/*
Versatile IDLE LOOP versione 2.31 (06.06.2006) ::: by kL0d3
ringrazio tutti quelli del forum actrionscript.it per l'aiuto
datomi nella realizzazione di questo piccolo script.
Avvia in ciclo continuo (simile a Screen Saver), una serie di filmati
indicati da una lista presente in formato XML.
Controlla in automatico l'arresto e l'avvio di nuovi filmati,
e, all'interruzione di esso cliccando sul filmato stesso,
verranno portati esternamente i valori indicativi dell' ultimo
clip avviato e dell'ultimo frame visualizzato relativo al clip.
*/
//_root.path = "D:/sheldon/pir/spot/"; // Per uso su unità locale
_root.path = "http://" + _root.base + "/spot/"; // Il percorso base viene preso dall'esterno con il metodo GET
// per uso su di un Server
trace("Percorso Base = " + _root.path);
//_root.lista_filmati = "pir.xml"; // Per uso su unità locale
_root.lista_filmati = _root.playlist; // File XML prelevato con metodo GET
// Per uso su di un Server
_root.filmato_partenza = 0; // Valore di START del numero CLIP
_root.fotogramma_partenza = 1; // Valore di START per numero FOTOGRAMMA
_root.primo_avvio = true; // Controlla se è la prima volta che viene avviato il LOOP
//_root.frame = ""; // NON RICORDO ... o_0'
_root.sound_frame = 0;
_root.maxvol = 100;
s = new Sound;
loading = new LoadVars();
loading.onLoad = function (success)
{
trace("Tentativo di caricamento del file CLIP.TXT");
if (success)
{
_root.filmato_partenza = (this.clip != undefined) ? this.clip : 1;
// Se c'è la variabile esterna "fotogramma" con metodo _GET, verrà avviato
// il clip indicato da "filmato_partenza" da questo frame, altrimenti parte
// dal primo fotogramma
_root.frame_partenza = (this.fotogramma != undefined) ? this.fotogramma : 1;
trace("Avvio dal frame n° "_root.frame_partenza + " del filmato n° " + _root.filmato_partenza);
} else {
_root.fotogramma = 1;
_root.clip = 0;
trace("non ho caricato nulla dall'esterno!");
}
avviaFilmato();
}
// DICHIARAZIONE VARIABILI :::::::::::::::::::::::::::::::::::::
// =============================================================
var another_frame:Boolean = false; //se dall'esterno va richiamato un altro frame
var another_movie:Boolean = false; //se è finito il filmato corrente, ne carica un'altro
// Verifica info su Clip e Frame::::::::::::::::::::::::::::::::::::::::
//=======================================================================
// Preparazione ISTANZA sulla quale caricare gli SPOT:::::::::::::::::::
var loader:MovieClip = loader_mc;
// Inizializzazione variabile per numero massimo di spot della lista
_global.maxSpots = 0;
// Preparazione variabile per nuovo oggetto XML
lista_movie = new XML();
lista_movie.ignoreWhite = true; // elimina eventuali spazi vuoti ???
// Inizializzazione variabile per numero massimo di frame del filmato
// corrente
_global.frame_totali = undefined;
// Inizializzazione variabile per numero frame corrente
_global.frame_corrente = undefined;
// Inizializzazione stringa nome file SWF da caricare
_global.filmato = "";
// FINE DICHIARAZIONE VARIABILI :::::::::::::::::::::::::::::::::::::::
// ====================================================================
// Funzione da avviare quando l'oggetto "lista_movie" viene caricata
lista_movie.onLoad = function()
{
//Controlla il numero di nodi presenti nel file XML
trace("Sto caricando lista_movie");
_global.maxSpots = this.childNodes[0].childNodes.length;
// Richiamo funzione "crealista()" per generare l'array con i nomi
// dei file SWF
_root.external_link = this.childNodes[1].childNodes[0].attributes.src;
trace("Punto di ritorno = " + _root.external_link);
_root.coords = this.childNodes[2].childNodes[0].attributes.src;
trace("Punto di avvio frame = " + _root.coords);
crealista();
}// fine funzione
// Caricamento oggetto XML "lista_movie" con relativo file XML
lista_movie.load(_root.path + _root.lista_filmati);
loading.load(_root.coords + "?a=" + random(9999));
// Inizializzazione nuovo array sul quale verranno richiamati i filmati
// SWF
_global.clip = new Array();
// Funzione "crealista()" per generare il contenuto per l'array
// "_global.clip[]"
function crealista()
{
// Ciclo FOR da 1 a _global.maxSpots(il numero massimo di spot
// presenti nell'oggetto XML "lista_movie"
//l'indice del ciclo FOR verrà utilizzato per indicare il numero
// della riga dell'array sul quale operare
trace("Sto creando l'array _global.clip[]");
for (i=1; i<=_global.maxSpots; i++)
{
//clip[indice-1] = file XML . nodo [0] ovvero <spots> .
// . nodo [i - 1] ovvero <filmato ... /> . attributo src
_global.clip[i-1] = lista_movie.childNodes[0].childNodes[i-1].attributes.src;
//comando di controllo: verifica se si stanno effettivamente leggendo
//i dati dal file XML indicato dall'oggetto "lista_movie"
trace(_global.clip[i-1]);
}// fine ciclo FOR
//_root.loading.load(_root.path + _root.frame + "?a=" + random(9999));
// Richiamo della funzione "avviaFilmato()" per avviare la prima volta
// il VERO "IDLE LOOP"
} // fine funzione "crealista()"
// Funzione "avviaFilmato()" ::: IL VERO IDLE LOOP
function avviaFilmato()
{
// Carica nella variabile _global.filmato la stringa indicata
// nell'array "_global.clip[]" presente alla riga n° "filmato_partenza"
// NB: viene messo il prefisso "_root." per indicare che la variabile
// si trova al di fuori della funzione "avviaFilmato()"
trace("Sto cominciando ad avviare avviaFilmato() con filmato n° " + _root.filmato_partenza +
" e con frame totali " + _root.frame_totali);
_global.filmato = _root.path + _global.clip[_root.filmato_partenza];
// Comando di controllo assegnazione stringa alla variabile
// "_global.filmato"
trace("Filmato in avvio su loader_mc = " + _global.filmato);
// Assegnazione alla variabile "loader" di tipo MovieClip il percorso
// dell' ISTANZA loader presente fuori da questa funzione
var loader:MovieClip = _root.loader;
// Caricamento filmato indicato dalla variabile "_global.filmato"
// nell'oggetto MovieClip "loader"
loader.loadMovie("" + _global.filmato + "");
// All'avvio del filmato presente nel livello0 ("loader")
// esegue la funzione
_level0.onEnterFrame = function()
{
// Comando di controllo: stampa in output il n° frame corrente
// di esecuzione (generato dalla funzione presente nella
// istanza "loader_mc"
trace("Main frame corrente = "+ _root.frame_corrente);
// Comando di controllo: stampa rapporto tra frame corrente e
// frame totali del filmato
trace("Dimmi un pò che ti stai vedendo = " + _root.frame_corrente + "/" + _root.frame_totali);
// ITERAZIONE IF: poichè l'evento "onEnterFrame" viene eseguito
// ciclicamente ad ogni frame visualizzato, controlla se il
// filmato è giunto al termine
// Controlla che il frame corrente ed il numero di frame totali
// sia uguale E (AND &&) che il numero di frame totali sia
// maggiore di 1. Questo per evitare che, qualora non venga
// caricato alcun filmato nell'istanza "loader_mc",
// l'evento "onEnterFrame" venga avviato per l'istanza vuota,
// comprensiva di 1 SOLO FRAME
if((_root.frame_corrente == _root.frame_totali) &&
(_root.frame_totali > 1))
{
// Interrompe l'esecuzione di questa istanza
this.stop();
// Stampa in output il messaggio "Main fermato"
trace("Filmato su \"Main\" interrotto");
// Interrompe il controllo dell'evento "onEnterFrame"
delete this.onEnterFrame;
// ITERAZIONE IF per verifica del successivo filmato da
// eseguire: l'indice dell'array "_global.clip[]" inizia
// dal valore 0. il numero massimo di filmati inidicato
// dalla variabile "_global.maxSpots (con prefisso "_root.")
// parte dal valore 1. Percui, il controllo va eseguito
// tra l'indice del filmato attualmente completato e
// il numero massimo di filmati "_global.maxSpots" MENO 1.
if((_root.filmato_partenza == (_root._global.maxSpots - 1)) &&
(_root.frame_totali != undefined))
{
// Comando di controllo: stampa in output il numero di indice
// filmato appena eseguito
trace("Filmato eseguito n° " + _root.filmato_partenza);
// Poichè è l'ultimo filmato della lista, riporta l'indice
// "filmato_partenza" a ZERO.
_root.filmato_partenza = 0;
} //fine gruppo comandi per iterazione VERA
else
{
// Se non abbiamo eseguito l'ultimo filmato,
// incrementa di 1 l'indice dell'array "_global.clip[]"
// affinchè venga eseguito il filmato successivo
_root.filmato_partenza++;
// Comando di controllo: stampa in output il filmato da
// eseguire successivamente (e ne indica il numero complessivo)
trace("Nuovo filmato: Filmato n° " + (_root.filmato_partenza + 1) + " su " + _root._global.maxSpots);
} //fine gruppo comandi iterazione FALSA
// Riesegue la funzione "avviaFilmato()" per continuare
// l' IDLE LOOP
avviaFilmato();
} // fine iterazione IF per frame attuale == frame totali
}//fine funzione su evento "onEnterFrame" del _level0
}//fine funzione "avviaFilmato()"
Il file XML è il seguito:
codice:
<?xml version="1.0" encoding="iso-8859-1"?>
<spots>
<filmato src="clip1.swf"/>
<filmato src="max1.swf"/>
<filmato src="belfare.swf"/>
<filmato src="hello_world.swf" />
<filmato srC="candy_shop.swf" />
</spots>
<link>
<esterno src="../index.php" />
</link>
<frame>
<file src="clip.txt" />
</frame>
Inoltre, il file CLIP.TXT è il seguente:
codice:
&clip=1&
&fotogramma=120&
Infine, un bottone grande quanto il LOOP, contiene il seguente codice:
codice:
on(release)
{
var variabile = new LoadVars();
variabile.fotogramma=_root.frame_corrente;
variabile.clip = _root.filmato_partenza;
variabile.coords = _root.coords;
//variabile.comando = "" + _root.path + "varframe.php?t=" + (new Date().getTime()) + "&" + variabile;
controllo = variabile.sendAndLoad(_root.path + "varframe.php?t="+(new Date().getTime()),variabile,'POST');
if(controllo)
{
getURL(_root.external_link ,"_self");
}
}
Mentre il file varframe.php contiene il codice seguente:
codice:
<?
$file_name="varframe.txt";
$testo_file="&clip=".$_GET[clip] . "&\n" . "&fotogramma=" . $_GET[fotogramma] . "&";
$handle=fopen($file_name,"w");
fwrite($handle,$testo_file);
fclose($handle);
?>
Unico problema: in rete, il browser non riesce a prelevare il file CLIP.TXT aggiornato. Mantiene l'ultimo salvato nella cache. Qualcuno di voi ha un'idea per tutto ciò? L'unica soluzione che ho trovato è quella di sostituire il nome di file CLIP.TXT con undefined...
mistero di fede!
Se qualcuno può aiutarmi a migliorare il codice...
sono pronto a consigli utili! 
kL0d3