Flash: preload che non funzionano sul sito

Di: nannopoli | 26/09/2020 18:43:14
Per cominciare ciao a tutti.
Avrei appena finito (grazie soprattutto all'aiuto del Professore in un precedente post) il sito che stavo costruendo.
Ho verificato però che sono 500Kb e quindi ho deciso di mettergli un preload semplicissimo soltanto che ne ho creati almeno dieci, utilizzato preload di altri e nessuno funziona.
Mi spiego meglio.
Ogni preload provato di per sè funziona alla perfezione, il problema è quando lo inserisco nel mio sito. Da questo momento non ne funziona uno. Ho provato addirittura a crearmi il preload su un documento nuovo(fatto prove anche con preload già fatti), verificato che funzionasse, ma dal momento che ho importato la libreria del mio .fla, senza neanche inserire un clip nello stage, il preload smette già di funzionare.
Ho visto anche che se simulo il download, questo sembra caricare restando fermo sul frame 0. Infatti i preload non funzionano sia che li metta in una scena prima del filmato, sia che li metta nel primo frame del filmato principale.
Che potrebbe essere e come faccio a risolverlo?

Risposte



Ciao Nannopoli,
ci sono decine di motivi possibili per il blocco di un preload, ma considerando il fatto che ne hai provati diversi, assumendo che ognuno di questi preload abbia usato un approccio diverso, c’è una sola ragione che può bloccarli tutti...
Il primo fotogramma pesa quasi quanto tutto il filmato!
Anche se non c’è niente dentro, un fotogramma può pesare parecchi Kb, dipende da cosa ci esporti dentro.
Per verificare questa teoria dovresti fare una cosa:
Mentre provi il filmato premi CTRL+B, dovrebbe apparire in alto il “Profilo Ampiezza Banda” un diagramma che ti mostra quanto pesa il filmato, fotogramma per fotogramma.
Se in corrispondenza del fotogramma 1 c’è il valore più alto (cosa che credo possibile nel tuo caso), riscrivi qui sotto e vedremo il da farsi.
[HR]
Anzi no, siccome sono sicuro di aver colto il problema ti posto subito la soluzione...
Hai degli oggetti nella libreria che vengono esportati al primo fotogramma...
Questo accade sempre quando si utilizzano dei componenti prefabbricati, per esempio, se al fotogramma 100 usi una UIScrollBar che hai preso dalla Palette “Componenti” questa va ad appesantire il tuo filmato di ben 34 Kb, tutti al primo fotogramma.
Per fortuna se questo componente non ti serve subito puoi decidere di esportarlo più avanti, in modo da non appesantire il primo fotogramma.
Individua nella libreria il simbolo corrispondente, per esempio UIScrollBar e clicca con il tasto destro aprendo il menu “Concatenamento”.
Dalla finestra che si è aperta togli la spunta accanto a “Esporta sul primo fotogramma”.
A questo punto hai già alleggerito di 4 Kb il primo fotogramma!
Questi 4 Kb vanno a finire in corrispondenza del fotogramma in cui usi per la prima volta la UISrollBar.
Naturalmente se hai risparmiato soltanto 4 Kb ci deve essere da qualche parte il “grosso” del consumo, si tratta della Classe ActionScript 2.0 che serve a far funzionare la ScrollBar, quello che abbiamo tolto dal primo fotogramma era solo la grafica, adesso procederemo allo spostamento di tutte le azioni.
Apri il menu File > Impostazioni di Pubblicazione.
Scegli la scheda Flash.
Accanto alla casella ActionScript 2.0 c’è un pulsante con la scritta “Impostazioni...”, premilo.
Scrivi 2 (o 3, 4, quello che vuoi, basta che sia oltre il Preload ma PRIMA del fotogramma in cui ti servono i componenti).
Clicca su OK.
I rimanenti 30 Kb si spostano al fotogramma desiderato.
Adesso il tuo fotogramma 1 non contiene quasi niente, quindi sarà visualizzato in fretta e ti mostrerà il Preload.

Di: Professore | 26/09/2020 18:44:14


in effetti era proprio così! Ma scusami la seguente domanda su un "problema" che si presenta adesso. Prima il problema era che ho un audio collegato a un pannello sound con tasto play, stop e barra volume che gestisco così:
stop();
s = new Sound(this);
s.attachSound("you_sang.mp3");
s.setVolume(50);
vol._xscale=s.getVolume();
Per fare prima ho cancellato la musica e rimessa, l'ho rilinkata e ho provata sia con esporta nel primo frame che senza.
Se metto esporta nel primo frame, anche avendo settato le impostazioni action script su 2, il file mi resta da caricare sul primo, mentre se non esporto (quindi linko senza però spuntare "export in First Frame", quando premo play, non si riproduce e infatti l'swf che mi crea diventa di 80kb invece dei 500 che erano prima

Di: nannopoli | 26/09/2020 18:44:14


Asp, prima di disturbarti forse ho capito (sono tardo ma magari ci arrivo).
L'esportazione nel primo frame serve per poterlo richiamare senza aggiungerlo a mano sullo stage, quindi non dovendolo esportare, me lo aggiungo a mano.
E' così? Anche se non capisco perchè, se gli viene detto di spostare tutto sul secondo, lui non lo faccia.
Ma forse mi sto ancora sbagliando
Devo ancora provare. Intanto grazie ancora

Di: nannopoli | 26/09/2020 18:44:14


Io veramente rischio di impazzire.
Come è possibile che adesso introducendo il preload, i gotoandstop dei pulsanti non funzionano?
Ho due menu, di cui se clicchi sulla scritta "menu" (che è un button), ti manda al frame seguente (gotoandstop "frame seguente") che ti visualizza il menu aperto con all'interno altri tasti. Così vale anche per il secondo menu. Da quando ho inserito il preload, quando clicco sul pulsante "menu", mi fa vedere il frame dopo però ritorna subito al frame precedente. Veramente rischio la depressione se va avanti così...

Di: nannopoli | 26/09/2020 18:44:14


Forse ho capito il problema ma non la soluzione.
Il problema è nel preload che utilizzo:
stop();
onEnterFrame = function () {
car = getBytesLoaded();
tot = getBytesTotal();
per = Math.round(car*100/tot);
progres.text = per
if (per == 100) {
gotoAndStop(2);
} else {
trace(per);
}
};
(il preload lo ho preso dal professore, per essere sicuro)
Soltanto che è come se quel gotoandstop (2), venisse continuamente richiamato. Infatti mettendo nextFrame(), il filmato mi va direttamente all'ultimo frame richiamandolo sempre. Come faccio a farlo eseguire solo all'inizio e poi basta?

Di: nannopoli | 26/09/2020 18:44:14


onEnterFrame può essere creato e può essere distrutto, basta aggiungere l’istruzione delete quando il richiamo all’evento non ci serve più, quindi puoi usare questo:
[HR] stop();
onEnterFrame = function () {
car = getBytesLoaded();
tot = getBytesTotal();
per = Math.round(car*100/tot);
progres.text = per;
if (per == 100) {
delete(onEnterFrame);
gotoAndStop(2);
}
};[HR]
L’istruzione delete(onEnterFrame) distrugge l’evento che ci serviva per il preload, richiamandola quando il preload si è concluso e non ci serve più non solo evitiamo conflitti con altri script, ma rilasciamo le risorse impegnate in un’operazione ormai inutile.

Di: Professore | 26/09/2020 18:44:14