Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Hiric
    Registrato dal
    Aug 2007
    Messaggi
    10

    [F9] Preloader in AS3 con approccio esclusivo OOP

    --- chiedo anzitutto scusa per aver postato erroneamente nella sezione Flash generale, sarebbe possibile cancellare il topic duplicato? A chi mi posso rivolgere?

    Salve a tutti, stavo muovendo i primi passi in flash, pur avendo in generale un pò di esperienza con la programmazione, e come esercizio ho iniziato a scrivere una classe per realizzare una semplice galleria di immagini, incontrando il diffuso ostacolo del preloader.

    Ho effettuato qualche ricerca, e trovato qualche soluzione... alcune richiedono l'utilizzo della timeline o l'inserimento di una nuova scena, ma tutte perlopiù si basano sull'interfaccia di Flash vera e propria e su frammenti di codice sparsi nella scena e nei frame.

    Mi chiedevo invece se esistesse una soluzione che prescindesse da tutto questo e si basasse interamente sulla costruzione di classi o oggetti che qualcuna che richiede l'utilizzo della timeline inserendo script in qualche frame.


    Non ho di fatto ben chiaro come funzioni il caricamento del filmato flash, anche se ipotizzo che il caricamento del filmato avanzi solamente appena Flash incontra un contenuto non ancora in cache nei fotogrammi successivi.

    Tutto bene sin qui, peccato che avendo lavorato unicamente con la Document class e file .as, la timeline sia completamente vuota (e vorrei rimanesse così )

    Forse sono stato oltremodo prolisso, sarà l'ora tarda,
    vengo al punto:
    • E' possibile replicare le soluzioni basate sulla timeline e sulla scena, ma utilizzando esclusivamente actionscript? (chessoio, creare dinamicamente i frame ed assegnar loro il contenuto che dovranno caricare, sempre dinamicamente)
    • Tra i possibili panorami, ho pensato alla possibilità di caricare a runtime il file flash, utilizzando di fatto un file per il preloader e uno per il filmato vero e proprio (ho già visto qualche soluzione a proposito -usando i Loader- anche se pare che in AS3 le cose richiedano qualche accorgimento extra)... è questa l'unica soluzione possibile?


    grazie in anticipo e scusate le domande puntigliose

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    per l'altro thread dovresti usare il pulsante "Segnala ad un moderatore" che trovi in basso a destra di ogni messaggio, spiegando le ragioni della richiesta di chiusura (credo sia sufficiente linkare questo thread)... per la risposta al tuo quesito mi prendo un po' di tempo per leggerlo

  3. #3
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    mi pare di capire dalle tue parole che il problema non è il modo di fare un preload per le immagini esterne, ma di scrivere un preload per la timeline principale
    in effetti non mi sono ancora posto il problema, ma la soluzione del file di preload mi sembra eccellente, ovviamente però, siccome i caricamenti di swf esterni sono affidati alla classe Loader, è necessario trovare il modo di "sostituire" la timeline del file di preload con quella del file esterno che sarebbe poi il filmato principale dell'applicazione
    ora, quello che mi viene in mente è di sfruttare un Loader, l'evento "INIT" e l'addChildAt della classe Stage, che sostituisca la timeline del preload con quella del filmato principale

    probabilmente fino a qui non mi segui un granché, voglio provare a trasformare le mie parole in qualcosa di concreto...

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    l'approccio in finale è abbastanza semplice, ho optato per un "preload grafico" semplice con una casella di testo che mi dice la percentuale caricata, con un testo a 100pt
    il codice della Document class del preload è questo:

    Codice PHP:
    package {
        
    import flash.display.Loader;
        
    import flash.display.Sprite;
        
    import flash.events.Event;
        
    import flash.events.ProgressEvent;
        
    import flash.net.URLRequest;
        
    import flash.text.TextField;
        
    import flash.text.TextFormat;
        
    import flash.text.TextFormatAlign;
        public class 
    StagePreload extends Sprite {
            private var 
    __u:String;
            private var 
    __r:URLRequest;
            private var 
    __l:Loader;
            private var 
    __t:TextField;
            private var 
    __f:TextFormat;
            public function 
    StagePreload () {
                
    __u "filmato_principale.swf";
                
    __r = new URLRequest(__u);
                
    __l = new Loader();
                
    __t = new TextField();
                
    __f = new TextFormat("Arial Black"1000xFFFFFF);
                
    __f.align TextFormatAlign.CENTER;
                
    __init__();
            }
            private function 
    __init__() {
                
    __l.contentLoaderInfo.addEventListener(Event.INIT__loadinit__);
                
    __l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS__progress__);
                
    __l.load(__r);
                
    __t.defaultTextFormat __f;
                
    __t.selectable false;
                
    __t.width 400;
                
    __t.height 100;
                
    __t.= (stage.stageWidth-400)/2;
                
    __t.= (stage.stageHeight-100)/2;
                
    addChild(__t);
            }
            private function 
    __loadinit__ (e:Event) {
                
    stage.addChildAt(__l.contentstage.numChildren-1);
                
    stage.removeChild(this);
            }
            private function 
    __progress__ (e:ProgressEvent) {
                
    __t.text = (Math.floor((e.bytesLoaded/e.bytesTotal)*100))+"%";
            }
        }


  5. #5
    Utente di HTML.it L'avatar di Hiric
    Registrato dal
    Aug 2007
    Messaggi
    10
    Caspita, anzitutto grazie per la prontezza nel rispondere, e inoltre... wow, grazie dello spaccato di codice, perfettamente funzionante e chiaro

    Si, in realtà il mio problema non consisteva appunto nella difficoltà nel creare un preoloader, o un loader generico per un oggetto, ma di riuscire a fare tutto nella maniera - non penso sia solo una mia mania - più "elegante" ed efficiente possibile, oltrechè riusabile.

    Direi che soli 895 bytes in più sono una soluzione eccellente al problema... mi spiace soltanto che gli sviluppatori non abbiano reso possibile un maggiore controllo circa il caricamento delle risorsa della main timeline


    Ora vedo un pò se riesco ad impantanarmi nel problema dell'embedding parziale dei font, senza l'utilizzo di Flex, e con il solo uso di actionscript (utopia?) magari apro un thread ammesso che non ci sia già e che riesca a capire dove sia l'intoppo (scongiurando non sia un bug )

    Solo una domanda circa il codice che hai postato... perchè hai esteso la classe Sprite e non la MovieClip?

    Un saluto dalla costa occidentale!

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    ho visto ora la provenienza non siamo tanto lontani

    per quanto riguarda l'incorporamento parziale dei font, immagino che tu voglia intendere il fatto che non vuoi incorporare l'intero file del font in libreria, ma solo i glifi che ti servono
    in tal caso con il solo AS non vai molto lontano, in ogni caso se non erro dovrebbe essere possibile caricare un "file di libreria" in cui mettere i font che ti interessano, in modo da non metterli nel file principale e poterli usare a piacimento richiamandone la classe... devo fare un po' di prove perchè è una cosa che devo fare anche io per il mio nuovo sito, avendo utilizzato due tipi di font, e quindi avendo un certo peso sul file, che non è poi tantissimo considerando che si tratta di un intero sito, però preferisco sempre ottimizzare dove posso

  7. #7
    Utente di HTML.it L'avatar di Hiric
    Registrato dal
    Aug 2007
    Messaggi
    10
    però preferisco sempre ottimizzare dove posso
    Amo questa parola

    Si, esatto, considerato che il font mi serviva solo per il preloader (caratteri dall'1 allo 0 più il simbolo di percentuale) e ho fatto il possibile per ridurre le dimensioni della galleria (pochi KB), incorporare un intero font, o caricarlo a runtime mi sembrava un controsenso... e solo per incorporarne 11 a dimensione 10 aumenta la dimensione del file di quasi 4KB, e in bitmap font!

    Al limite pensavo di scrivere una classe apposta, in modo da utilizzare una singola PNG monocromatica con i caratteri necessari, e scimmiottare il bitmap font di Adobe per poterli comporre e scomporre...qualcosa di semplice (e che ho già visto in giro tra l'altro anche se in AS2)...non voglio riscrivere la TextField

    Magari lo faccio come esercizio e la posto se a qualcuno interessa (la tentazione di usare il font di Xenon 2 è tanta, ovviamente per lavori di puro intrattenimento )

    Grazie ancora per l'aiuto!

  8. #8
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    bella idea, un po' come si fa con il contatore di visite in php, con le immagini, alla fine sono 11 immaginette (considerando anche il simbolo "%"), e il peso dovrebbe essere ridotto rispetto all'incorporamento di un font intero
    conta che io nel mio preload ho messo lo stesso font che uso nel sito e linkato la "StagePreload" e sto già a 15.283 byte, che non sono poi tanti attualmente, considerando le velocità di connessione attuali, ma in simulazione a 56K ho comunque 5 secondi di vuoto prima che inizi il conteggio visibile
    comunque un utente di questo forum ha realizzato una classe in AS2 che genera i glifi al volo attraverso i drawing methods, simulando un pixel font... anche questa potrebbe essere una soluzione: http://www.devpro.it/as2_id_65.html

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.