_lockroot: a cosa serve? Come funziona?

- Letture: 5.508

Quante volte vi è capitato di avere problemi a caricare un filmato swf in un altro? Da solo funziona..ma quando lo carico in un altro filmato non da segni di vita!!

Cosa sta succedendo?

Molto semplice, a volte quando richiamiamo degli oggetti in un swf utilizziamo il comando _root per identificare la sua posizione sullo stage riferito a quel progetto.

ALFA.swf

Quando andiamo a caricare l’swf in un altro, con dei richiami alla _root, quest’ultima non sarà più intesa sul progetto iniziale ma verrà presa in considerazione nell’swf richiamante.

In questo modo avremo degli errori di percorsi dovuti dall’errata scrittura di percorsi, pensiamo solo quando richiamiamo un file esterno, un movie clip nidificato o suoni inlibreria.

Come risolvere? Utilizziamo _lockroot!

È possibile utilizzare _lockroot per specificare il contenuto corretto e non identificare la vera _root nel file swf richiamante.

L’uso di _lockroot deve essere considerato semplicemente una soluzione alternativa per i problemi causati dall’uso di _root.

In pratica non facciamo altro che bloccare (_lock) la _root

Vediamo un esempio:

Abbiamo due swf il primo di nome ALFA e il secondo di nome BETA.

In ALFA richiamo BETA in un clip contenitore di nome istanza carica

In BETA richiamo un clip contenitore di nome istanza mc_beta

_root.mc_beta //la _root è riferita a BETA

Ora richiamo BETA in ALFA

loadMovie("BETA.swf",_root.carica); //_root riferita a ALFA
_root.carica._lockroot=true; //specifico che la _root è bloccata dal clip carica quindi riferita a BETA

Metodo alternativo

Un altro metodo per caricare swf esterni senza perdere i percorsi è utilizzare _level0

ecco un esempio con un clip filmato contenitore di nome istanza box:

loadMovie("filmato.swf", _root.box);

diventa:

loadMovie("filmato.swf", _level0.box);

Stratega, Docente, Speaker con più di 12 anni di esperienza in strategie creative multicanale. Oggi sono Managing Partner di ThinkingHat, Innovation Studio specializzato in tecnologie emergenti per aziende e brand audaci.

51 Commenti

  1. Ragazzi occhio perchè questa riga: _root.carica._lockroot=true deve finire con “;” ovvero: _root.carica._lockroot=true;

  2. Non ci ho capito nulla!:-(
    Peccato perchè mi interessava!
    Ma (tra le tante domande ne scolgo una)perchè mettiamo il nome istanza”box” se poi non la richiamiamo mai?!

  3. :(
    ciao, ok non ci ho capito niente pure io …. panico!
    se ti mando i filess c’hai voglia di scrivermelo giusto ?
    Una pizza e una birra quando passo dalle tue parti ! eheh

  4. scusa se ti faccio impazzire ….
    allora che un movie principale che con un “bottoncino” dalla scena1 passa alla scena 2 e sull’ultimo frame della s2 mi deve caricare un altro movie sul “livello 2” …. ho fatto quello che dici qua sopra ma non va!
    penso sia una cosa banalissima, anzi ne sono sicuro, ma cisto perdendo il sonno!
    ciao e sempre grazie x la pazienza!
    J.

  5. julius sbaglio sicuramente qualcosa ….. :-(

    io ho un SWF principale che si chiama SPAGO nel quale ho il MC che si chiama CENTRO e dove voglio caricare DETTAGLI è la root di DETTAGLI che deve rimanere bloccata.

    ma non ci riesco dove sbaglio? ti scrivo il codice che ho inserito:

    loadMovie("DETTAGLI.swf",_root.CENTRO);
    _root.CENTRO._lockroot=true;

    …. aiuuutoooooo !!

  6. Il problema è che non viene caricato? viene caricato male non bloccando la root e i percorsi non sono corretti?

  7. viene caricato ma credo che rimanga il problema del blocco della root del DETTAGLI.swf

    (DETTAGLI.swf sarebbe l’SWF principale di “zoom_pan_gallery”)

    potrebbe essere un problema a parte?

    intanto ti ringrazio per la grande disponibilità
    ciao

  8. caro Julius ….
    con tutta la buona volontà ma qui ci vuole un file di esempio per noi poveri mortali …. :-)

    …….. e se lo faresti con l’ image_scroller ……….

    cmq GRAZIE!!!

  9. ciao Julius, grazie ti sei spiegato benissimo in questo articolo ed io ho risolto almeno un problema iniziale nel sito che sto facendo. Ma avrei bisogno di un aiuto. è la prima volta che scrivo in un blog, perchè in genere riesco a risolvere tutto leggendo le domande degli altri e le relative risposte. Dunque: io ho un SWF principale che carica un secondo SWF che ne carica un terzo. Per riuscire a fare questo ho messo il comando _lockroot nel primo SWF ed è tutto OK. Ora dopo che ha caricato tutto io avrei bisogno di riattivare quella prima root, poichè, per chiudere il secondo SWF ho messo su quest’ultimo un pulsane con il comando
    on (release) {_root.popup.unloadMovie();} facendo riferimento al nome della root posta sul primo SWF. Prima di aggiungere la lockroot sul primo SWF questo comando funzionava alla perfezione e mi consentiva di chiudere il secondo SWF. Dopo non ha più funzionato..

    è possibile risolvere in qualche modo la cosa?
    Ti ringrazio in anticipo, se riesci ad aiutarmi ed in ogni caso.
    ciao Ananda

  10. ciao, ehi… intanto aspettando una tua risposta ho fatto dei tentativi ed ho risolto:
    ho semplicemente cancellato il nome della root, lasciando solo:
    on (release) {_root.unloadMovie();}
    e mi funziona!!!
    Magia.
    Grazie in ogni caso, per l’appunto.
    Immagino che per voi genietti queste magie siano tutte spiegabili.
    Ananda

  11. ciao Julius
    siccome non riesco a far funzionare la funzione lockroot, volevo chiederti se conosci qualche tutorial Video che spiega passo passo come fare.
    Ormai e 2 settimane che provo e riprovo e non so piu che fare.

    Grazie

  12. E’ semplice vi è un loadMovie e un _lookroot come scritto nell’articolo

    spiega meglio il tuo problema…

  13. ok, adesso provo a raccontarti i passaggi.
    titolo: Insedrimento MP3 (tipo quello del tuo tutorial) da swf estrno.
    Premetto che la funzione non la uso quando mi trovo sulla timeline principale ma bensi’ dentro un movieclip. (lo chiamero’ 1)
    1.Mi tovo dentro il movieclip 1 dove ho diversi livelli.
    2. Creo un nuovo livello (pippo) e genero un fotogramma vuoto.
    3. Seleziono il fotogramma vuoto e creo un simbolo movieclip e lo chiamo A.
    4. Dentro A creo un altro movieclip e lo chiamo B
    5. Inserisco quindi il SWF esterno in B attraverso la funzione “comportamenti” detta anche Behaviors.
    6. ora in B avro il codice Actionscript:

    //load Movie Behavior
    if(this == Number(this)){
    loadMovieNum(“ipodplayer_update2.swf”,this);
    } else {
    this.loadMovie(“ipodplayer_update2.swf”);
    }
    //End Behavior

    7. Adesso vado nel Movieclip A, trascino il movieclip B dentro A prendendolo dalla libreria e metto questo codice actionscipt:

    _root.mc_B //la _root è riferita a B

    8.Al movieclip A do nome istanza “mc_B”

    8. Ora vado nel movieclip 1 che ho generato all’inizio (vedi punto 1)
    e trascino dentro il frame “pippo” il movieclip A. Adesso inserisco il codice actionscipt:

    loadMovie(“ipodplayer_update2.swf”,_root.carica); //_root riferita a A
    _root.carica._lockroot=true; //specifico che la _root è bloccata dal clip carica quindi riferita a B

    9. Infine al Frame pippo do il nome istanza “carica”.

    Quando faccio il preview, l’mp3 appare ma mostra degli evidenti errori di caricamento che non vangono pero’ segnalati dalla finestra errori.

    Spero che la spiegazione sia utile per capire dove sbaglio.
    Spero di risolvere il problema anche perche’ questa funzione e molto utile a non appesantire troppo il sito.

    Ti ringrazio molto per la tua disponibilita’.

  14. ciao julius dopo un millennio dagli esordi ho capito come funzionano tante cose su flash e specie look root ora…
    sto rifacendo il sito e in piu’ altri 4… grazie di tutto veramente
    fabio

    quando ho finito ti mando il link del nuovo sito… speriamo sia migliorato… ghghghghg

    ciao a presto

  15. Ciao julius, ecco il mio rpoblema da un milione di dollari…
    ho un primo swf che ne richiama un altro così:

    loadMovieNum(“menu_.swf”, 2);

    ora…
    menu_.swf contiene un pulsante con questo codice
    on (release) {
    loadMovie(“show.swf”, _root.showreel);
    _root.showreel.swapDepths(_root.getNextHighestDepth());
    }

    show.swf è una gallery delle tue;)…questa:
    https://www.juliusdesign.net/dynamic-product-gallery-xml/

    e qui nasce il problema…praticamente funzona tutto perfettamente, tutto tranne la paginazione della galleria che sparisce completamente…

    in sostanza se pubblico il solo file show.swf va tutto bene, ma se pubblico l’intero sito arrivo a vedere show funzionamente ma senza la aginazione…che dici? che potrebbe essere che mi sta facendo perder ei capelli???aiutooo

  16. @Marco: prova cosi

    loadMovie("show.swf", _level0.showreel);

    NB. Occhio quando fai copia e incolla dei doppi apici nel codice

  17. @marco: Ciao in pratica ci sono delle funzioni riferite allo stage, incorporandolo in un altro crea degli errori

    Ecco le modifiche da fare:

    Nella galleria show.fla

    in linea 8 trovi:

    var _loc4 = Stage.width - 236;

    Ovviamente la posizione dei pulsanti è riferita in base alla larghezza dello stage.

    Tu caricandola in un altro stage imposti differenti misure, quindi trasforma quella riga in

    var _loc4 = ValoreNumericoFisso;

    esempio:

    var _loc4 = 400;

    Cosi sei sicuro che parte da 400 in poi anche se caricato su un altro stage di dimensioni diverse

    Per finire sul pulsante showrel in menu.fla

    loadMovie("show.swf", _root.showreel);
    _root.showreel._lockroot = true;

  18. grosso, davvero un grosso. grazie, mi hai levato da un po di casini. a buon rendere.

  19. mmm…nuova domandina…come ancorare i numeri della paginazione a sinistra?
    mi spiego meglio…se gli do il valore assoluto come hai detto giustamente te, funziona tutto, ma nel momento in cui inserisco una nuova img l’intera paginazione si muove verso sinistra, perchè la posizione la prende dal suo centro o da destra. come mettere che la posizione è intesa da destra?

  20. ciao julius vorrei chiederti se possibile centrare un clip nello stage,ti spiego voglio mettere thumbnail_gallery,la gallery si vede ma rimane verso il basso , ho usato loadMovie(“thumbnail_gallery.swf”,_root.CENTRO);
    _root.CENTRO._lockroot=true; x rikiamare la gallery,ce il modo x mettere al centro la gallery? complimenti x il tuo blog ke ormai e diventato un portatale!;)

  21. Io ho sulla mia root principale un pulsante che mi carica in un contenitore un MC esterno e lo controllo con _lockroot fin qui tutto tranquillo. Quando carico questo filmato ho impostato anche _parent.book.enabled=false; in modo da bloccarmi il pulsante, ora dal filmato caricato, per ritornare alla root principale è stato semplice ma non riesco a far riattivare il pulsante della root principale tramite il pulsante che si trovava nel filmato caricato

  22. Julius ti preeeego aiutami!
    Sto realizzando il mio 2 sito in flash e sono nei guai.
    Ho costruito una galleria di immagini con Flash slide show maker.
    Ho esportato il swf e lo voglio importare in un punto preciso del mio sito.
    cliccando sul pulsante immagini quindi deve caricare questo file.
    L’ho caricato nel contenitore CT per poterlo posizionare.
    Il codice è questo:

    _root.CT._x = 390;
    _root.CT._y = 130;
    loadMovie(“page3i.swf”, _root.CT);
    _root.CT._lockroot = true;

    Se faccio la prova del filmato vedo la galleria nella posizione giusta.
    Anche se mi da questo errore:
    Errore: un’azione ‘with’ non è riuscita perché l’oggetto specificato non esiste.

    Se però esporto il filmato la galleria non si carica proprio!

    Vi prego aiutatemi! Cosa sto sbagliando?????

  23. Ciao Julius … ti seguo da molto tempo e grazie ai tuoi tutorial ho imparato e risolto tante cose… premetto che non sono un grande esperto ma mi diverto a fare i miei siti personalmente…ora vorrei utilizzare il tuo slide_scorrevole sul mio sito ..vorrei metterlo nella home page ma nonostante tanti tentativi non riesco a farlo funzionare….pur richiamando l’swf dello slide dalla index.swf del sito non sono visibile le foto… ho fatto tantissimi tentativi ma senza nessun risultato… premetto che dalla index dello slide funziona tutto correttamente … se hai tempo e se puoi puoi darmi qualche consiglio..grazie

  24. Praticamente richiami lo slide in un altro swf? Potresti avere problemi di percorsi e quindi devi caricare il tutto con _lockroot come da tutorial… hai provato?

  25. Niente non funge … ho provato e riprovato ma niente.. se ti invio il codice sei cosi gentile di dargli una occhiata … grazie

  26. Ciao Julius,
    Fantastico, sto usando la galleria nel sito ed è veramente funzionale. Ho però un problema:
    Ho creato un menù con pulsanti di navigazione per le diverse sezioni del sito. Al pulsante gallery ho detto: On release goto And Stop (40);
    Il fotogramma 40 è quello in cui ho inserito la tua galleria.
    Fin quì tutto bene!
    Quando però clicco su un altro bottone del menù per cambiare sezione (ex: sezione contatti, posizionata sul frame 50) mi accorgo che sopra appare sempre la galleria.
    Cosa devo fare?
    Grazie per la pazienza!!

  27. Ciao Julius,
    Da poco ho scoperto il tuo sito ed è diventato un punto di riferimento per me.
    Premetto che sono un’autodidatta. Ho un problema con loadMovie che mi sta facendo diventare pazzo
    Mi spiego con un esempio banale:
    -Il filmato principale si chiama main.swf e ha sulla linea temporale principale ho un mc di nome istanza box dove devo caricare quattro filmati secondari che poi sono le sezioni del sito.
    -i filmato secondario che mi da problemi è gallery.swf (al suo interno ci sono 4 mc che richiamano 4 frame dove sono le 4 immagini quindi ad esempio il primo mc mi porta sul secondo frame così naturalmente:

    onClipEvent (mouseUp) {
    _root.gotoAndStop(2);
    }

    da sola questa gallery funziona stra bene anche perchè è davvero elementare ma quando è caricata (da un pulsante) dal filmato main.swf in box così

    onClipEvent (mouseUp) {
    loadMovie(“gallery.swf”, _root.box);
    }
    appare il primo fotogramma ed appena premo uno dei 4 mc per vedere un’immagine praticamente ricarica il filmato (gallery.swf) da capo!
    Sono pronto anche a mandarti i file di un’esempio quando vuoi ti prego di rispondermi sto diventando pazzo co sta cosa sicuramente faccio uno sbaglio da principiante ma non riesco a trovare la soluzione
    Grazie ancora!

  28. ho capito dove sbagliavo
    nel richiamare gallery.swf non aggiungevo la stringa
    _root.box._lockroot=true;

    facevo solo

    onClipEvent (mouseUp) {
    loadMovie(“gallery.swf”, _root.box);

    grazie lo stesso alla prossima ciao

  29. Ciao Julius, sono nuovo del forum e soprattutto non sono molto pratico di flash, sto cominciando solo ora a studiarne i meccanismi. Ho un problemino e cioè non riesco a caricare un file esterno di nome “home.swf” sul file principale chiamato “prova.swf”, o meglio il file lo carica ma non si vede nulla. Se provo a caricare un altro file e cioè “player.swf” che è un lettore mp3, questo me lo carica se invece indico “home.swf” no…. Specifico che il file “home.swf” ha un solo frame chiave con codice action script prelevato da un tutorial trovato sul web dove mi visualizza delle foto che scorrono con l’effetto dissolvenza (una slide). Il file “home.swf” compilato da solo funziona ma se richiamato con loadmovie(); non parte. Riporto qui sotto i codici dei due file:

    “home.swf”

    // Variabili modificabili
    v_fattoreGradiente=1;
    v_scambioAlpha=50;
    v_path=”immagini”;
    v_totaleFoto=5;

    // —————————————————————————
    // Inizio software
    v_numeroFoto=2;

    function ControllaVariabili()
    {
    if (!(fattoreGradiente==undefined)) v_fattoreGradiente=fattoreGradiente;
    if (!(scambioAlpha==undefined)) v_scambioAlpha=scambioAlpha;
    if (!(path==undefined)) v_path=path;
    if (!(totaleFoto==undefined)) v_totaleFoto=totaleFoto;
    }

    _root.onLoad=function()
    {
    ControllaVariabili();
    v_gradiente=1*v_fattoreGradiente;
    arrClip=new Array(2);
    idMain=0;
    idNonMain=1;
    arrClip[0]=_root.createEmptyMovieClip(“clip0”,1);
    arrClip[1]=_root.createEmptyMovieClip(“clip1″,0);
    arrClip[0].loadMovie(v_path+”/1.jpg”);
    arrClip[1].loadMovie(v_path+”/”+v_numeroFoto+”.jpg”);
    arrClip[0]._alpha=100;
    arrClip[1]._alpha=0;
    }

    _root.onEnterFrame=function()
    {
    arrClip[idMain]._alpha-=v_gradiente;
    if (arrClip[idMain]._alpha=100)
    {
    temp=idMain;
    idMain=idNonMain;
    idNonMain=temp;
    arrClip[idNonMain]._alpha=0;
    v_numeroFoto++;
    if (v_numeroFoto>v_totaleFoto) v_numeroFoto=1;
    arrClip[idNonMain].loadMovie(v_path+”/”+v_numeroFoto+”.jpg”);
    }
    }

    prova.swf

    loadMovie(“home.swf”, _root.page);
    _root.page._lockroot = true;

    preciso che nel file “prova.swf” nel primo livello si trova il codice actionscript appena sopra e nel secondo ho inserito sullo stage il clip vuoto con nome istanza “page”

    perchè non funziona con home.swf mentre con player.swf si? Aiutami sono disperato, sono ormai due settimane che ci sto sbattendo e proprio mi serve!!! Grazie!!

  30. @Lorenzo: ciao! hai provato con

    loadMovie("home.swf", _level0.box);

    Se così non funziona verifica le seguenti cose:

    – Hai creato il box contenitore e assegnato nome istanza page in prova.swf?

    – Prova a cambiare il nome del contenitore con un nome neutro tipo mc_cont

    se cosi non funziona inviami i file che correggiamo insieme ;)

  31. Ho fatto le prove che mi hai detto ma niente da fare… La cosa strana è che per capire se il file lo caricava o non lo caricava per niente, io, in un secondo livello del file “home.swf” ci ho inserito un semplice quadrato e, quando richiamo il file “home.swf” da “prova.swf ” con loadMovie(), quest’ultimo mi compare ma non vedo lo scroller delle foto. Premetto che da solo il file “home.swf” mi funzione benissimo. Ti invio i due file? Come faccio? te li invio sulla tua casella di posta gmail?

Commenti