Visualizzazione dei risultati da 1 a 7 su 7

Discussione: funzione as3

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6

    funzione as3

    salve a tutti, premetto che sono una schiappa con as3...
    sto preparando una presentazione e ho un problema con le funzioni,
    ho un movie index swf che chiama un swf esterno in questo modo

    var request:URLRequest = new URLRequest("intro.swf");
    var loader:Loader = new Loader()
    loader.load(request);
    addChild(loader);

    e definisce una funzione per caricare un altro swf esterno successivamente

    function caricaHome():void
    {
    var request:URLRequest = new URLRequest("home.swf");
    var loader:Loader = new Loader()
    loader.load(request);
    addChild(loader);
    }


    il problema è che vorrei richiamare questa funzione caricaHome da intro.swf ma non riesco a capire la sitassi...

    grazie dell'aiuto

  2. #2
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    Puoi accedere a proprietà e metodi (funzioni) di un .swf solo a caricamento completato quindi nel filmato index.swf scrivi:

    Codice PHP:
    var request:URLRequest = new URLRequest("intro.swf"); 
    var 
    loader:Loader = new Loader() 
    loader.load(request);
    loader.contentLoaderInfo.addEventListener(Event.COMPLETEintroCaricata); 

    function 
    introCaricata(evento:Event):void
    {
        var 
    mySWF:MovieClip evento.target.content as MovieClip
        addChild
    (loader);
        
    mySWF.caricaHome();
        

    Come puoi vedere una soluzione potrebbe essere quella di creare una variabile di tipo MovieClip a cui assegnare il valore del contenuto del loader che in questo caso è l'oggetto che scatena l'evento: COMPLETE.
    Dopo di che puoi utilizzare l'oggetto Loader come se fosse un normale MC e pertanto chiamare la funzione al suo interno.

    Sorge un problema: In questo modo, viene caricato immediatamente il filmato 'Home.swf' chiamato dalla funzione e quest'ultimo, andrà a sovrapporsi al filmato 'Intro.swf' che rimarrà in esecuzione appesantendo inutilmente la memoria del FlashPlayer.
    Sarebbe meglio rimuoverlo dalla DisplayList quando e se non serve più e per farlo, potresti fare così:
    Nel filmato index.swf invece di chiamare la funzione 'caricaHome' crei una funzione che rimuove la intro e la chiami dalla intro stessa:

    In 'index.swf' scrivi:

    Codice PHP:
    var request:URLRequest = new URLRequest("intro.swf");
    var 
    loader:Loader = new Loader();
    loader.load(request);
    loader.contentLoaderInfo.addEventListener(Event.COMPLETEintroCaricata);

    function 
    introCaricata(evento:Event):void
    {
        
    addChild(loader);
    }
    function 
    resettaIndex():void
    {
        
    removeChild(loader);

    In intro.swf crei un pulsante che chiama la funzione di caricamento 'home.swf' (altrimenti verrebbe caricata immediatamente) oppure puoi usare un Timer in modo che l'aggiunta del filmato home.swf avvenga quando vuoi tu e non prima.
    Quindi nel filmato intro.swf inserisci il codice:

    Codice PHP:
    var loaderHome:Loader;

    pulsante.buttonMode true
    pulsante
    .addEventListener(MouseEvent.CLICKcaricaHome);

    function 
    caricaHome(evento:MouseEvent):void
    {
        var 
    request:URLRequest = new URLRequest("home.swf");
        
    loaderHome = new Loader();
        
    loaderHome.load(request);
        
    loaderHome.contentLoaderInfo.addEventListener(Event.COMPLETEhomeCaricata);
        
    }
    function 
    homeCaricata(evento:Event):void
    {
        var 
    filmatoIndex:MovieClip this.parent.parent as MovieClip
        filmatoIndex
    .resettaIndex();
        
    filmatoIndex.addChild(loaderHome);
        

    Come vedi in questo esempio a caricamento completato ho dichiarato una variabile di tipo MovieClip a cui ho assegnato il valore/posizione di 'index.swf' e nella riga successiva chiamo la funzione 'resettaIndex' che rimuove il filmato 'intro.swf'.
    Infine, sempre facendo riferimento a 'index.swf' che in pratica è il filmato 'contenitore principale' aggiungi 'home.swf'.



    ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    ti ringrazio molto, provo e vi faccio sapere... è un casino as3

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    scusa però io intendevo dire che la funzione caricaHome si trova in index.swf

    poi in un determinato fotogramma del filmato intro.swf devo richiamare caricaHome affinchè si carichi il filmato home.swf che deve essere child di index.swf e non di intro.swf

    come si richiama una funzione del parent dal child?

    come hai scritto tu la funzione caricaHome si trova in intro.swf .... oppure ho capito male

  5. #5
    Utente di HTML.it L'avatar di Sleter
    Registrato dal
    Aug 2005
    Messaggi
    465
    come si richiama una funzione del parent dal child?
    Nell'ultimo codice che ho postato che come ho scritto sopra è posizionato in 'intro.swf' c'è la chiamata alla funzione che si trova in 'index.swf'.
    Ovviamente nella stessa funzione oltre a rimuovere il 'figlio', puoi caricare un altro 'figlio'.

    Che la chiamata alla funzione sia attivata dal click su un pulsante o dal raggiungimento di un determinato fotogramma è irrilevante.

    esempio: codice per index.swf
    Codice PHP:
    var loaderHome:Loader;

    var 
    request:URLRequest = new URLRequest("intro.swf");
    var 
    loader:Loader = new Loader();
    loader.load(request);
    loader.contentLoaderInfo.addEventListener(Event.COMPLETEintroCaricata);

    function 
    introCaricata(evento:Event):void
    {
        
    addChild(loader);
    }
    function 
    resettaIndex():void
    {
        
    removeChild(loader);
        var 
    request:URLRequest = new URLRequest("home.swf");
        
    loaderHome = new Loader();
        
    loaderHome.load(request);
        
    loaderHome.contentLoaderInfo.addEventListener(Event.COMPLETEhomeCaricata);
    }
    function 
    homeCaricata(evento:Event):void
    {
        
    addChild(loaderHome);

    In intro.swf al fotogramma che vuoi inserisci:

    Codice PHP:
    stop();

    var 
    filmatoIndex:MovieClip this.parent.parent as MovieClip
    filmatoIndex
    .resettaIndex(); 
    Nota un cosa: Quando pubblichi intro.swf e quest'ultimo raggiunge il fotogramma con il codice ti darà errore di accesso a proprietà e metodo = null
    E' normale e logico perchè stai chiamando una funzione presente nel 'padre' e se lanciato da solo 'intro.swf' non sà nemmeno che esiste il 'padre'.
    Tutto regolare e senza errori se invece lanci 'index.swf', la funzione chiamata da 'intro.swf' sarà eseguita correttamente e senza errori.

    Comunque se tutto questo ti appare complicato e inutilmente macchinoso è perchè si cercano di implementare logiche di programmazione più conformi a AS2: codice sparso sulla timeline o annidato nelle timeline dei MovieClip.
    Con AS3 è raramente necessario utilizzare questo sistema di programmazione e tutto o quasi tutto può essere facilmente gestito da un'unico fotogramma della timeline principale o meglio ancora, con l'utilizzo di classi.as esterne.


    ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    sì è chiaro, infatti io usavo bene as2, non avevo bisogno di flash da diversi anni e ora mi sono trovato in difficoltà...
    sei stato molto gentile
    grazie

  7. #7
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Originariamente inviato da Sleter
    Nota un cosa: Quando pubblichi intro.swf e quest'ultimo raggiunge il fotogramma con il codice ti darà errore di accesso a proprietà e metodo = null
    E' normale e logico perchè stai chiamando una funzione presente nel 'padre' e se lanciato da solo 'intro.swf' non sà nemmeno che esiste il 'padre'.
    Tutto regolare e senza errori se invece lanci 'index.swf', la funzione chiamata da 'intro.swf' sarà eseguita correttamente e senza errori.
    Aggiungo una cosa veloce riguardo a questo genere di workaround... per evitare ogni genere di problema è possibile rinchiudere un codice con un potenziale errore (ovviamente quando sappiamo che c sarà e vogliamo escluderlo, come i questo caso) all'interno del costrutto try...catch aumentando la pulizia e la leggibilità del codice.

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.