• User

    Rilevare il passaggio del mouse su un clip filmato "duplicato"

    Ciao!
    Ho un problemino che mi ha bloccato da un paio di giorni, 😞 sto realizzando un viewer di immagini/video/musica in Flash, ed ho realizzato un clip filmato ha cui do per esempio nome istanza "clip"...
    con il metodo "```
    clip.duplicateMovieClip("clip" + i, i, {_y:245,_x:asseX});

    A questo punto utilizzando "```
    clip1.onRollOver = function () {
        testo.text = "prova";
        etc..;
        etc..;
    }; 
    clip1.onRollOut = function () {
        etc..;
        etc..;
    };
    ```"
    eseguo del codice al passaggio del puntatore del mouse supra il clip filemato "clip1" e altro codice quando ne esco.
    Il problema e che non so a priori quanti clip sono stati duplicati e vorrei ottenere un codice senza dover entrare in tanti cicli di controllo quanti clip massimo posso duplicare, qualcosa come ```
    "clip"+i.onRollOver = function () { etc..
    ``` che ovviamente non funziona perché non posso assegnare il clipx tramite l'aggiunta di una variabile, e neanche ```
    clipX = "clip"+i, e poi clipX.onRollOver = function () { etc.."
    ``` come faccio a rilevare quando mi trovo con il puntatore del mouse sopra un clip filmato generato in automatico da action scritp ?!?:bho:
    
    Mi manca solo questo controllo per terminare il mio filmato HELP !!!

  • Super User

    Ciao,

    direi che ti servira aggiungere tutti questi clip duplicati in un array (con un 'push' - non so se usi un ciclo for o no per duplicare:bho:).
    Poi da la, si potrebbe aggiungere azione onRollover/Rollout con un ciclo for della lunghezza del array che richiama una funzione 'generale' per tutti i clip.

    Un esempio proprio di base:

     clip_rollOver = function () {
        //azione
    };
    clip_rollOut = function () {
        //azione
    };
    for (i=0; i<clip_array.length; i++) {
        clip_array*.onRollOut = clip_rollOut;
        clip_array*.onRollOver = clip_rollOut;
    }
    

  • User

    Ciao Onsitus! come sempre precisa e puntuale :surprised:
    Allora per risponderti, sì utilizzo un ciclo for per la duplicazione delle clip filmato.

    for(var i:Number = 1; i < 5; i++) {
        var asseX:Number = i * (clip._height + spazio);;
        clip._alpha = 60;
        clip.duplicateMovieClip("clip"+i, i, {_y:245,_x:asseX});
        loadMovie("thumbnails/image"+i+".jpg", "clip"+i+".foto");
    }
    ```questo è il frammento di codice che mi duplica il mio clip filmato "clip" per n° 5 volte, nel loadMovie esiste "clip"+i+".foto", perché la foto jpg viene caricata all'interno di un clip figlio "foto".
    Ho usato gli array per dichiarare variabili ma mai per "indicizzare" il nome di un clip filmato :bho: non capisco come funziona la cosa (programmo ed uso flash perché utilizzo diversi linguaggi di programmazione molto simili a AS ma se non le ho mai utilizzate ho difficoltà con espressioni o sintassi tipiche del linguaggio :cry:) come ho ottenuto la copia è sopra ,ora un piccolissimo esempio di come richiamare una istanza all'interno di un' altro ciclo per esempio per attribuire DOPO un attributo come "clip(x)._x -= 10;" o almeno una buona guida dove posso apprendere il sistema in AC 
    GRAZIE :kiss:

  • User

    Il mio problema è che per utilizzare una struttura di array come nell'esempio ```
    clip*.onRollOut = clip_rollOut;
    clip*.onRollOver = clip_rollOver;

    devo prima assegnare ad ogni singolo elemento dell'array il nome dell'istanza precedentemente creata con duplicateMovieClip, esempio
    clip[1] = clip1;
    clip[2] = clip2;
    etc..
    per assegnare direttamente all'array l'istanza del clip duplicato ho provato sensa successo così: 
    

    clip.duplicateMovieClip(clip*, i, {_y:245,_x:asseX});
    clip.duplicateMovieClip("clip["+i+"]", i, {_y:245,_x:asseX});

    :x come cavolo devo assegnare il clip filmato duplicato ad un array ? 
    non funziona un'assegnazione neanche di questo tipo:
    clip* = "clip"+i;
    :cry:

  • Super User

    Prima del ciclo for, c'è da dichiarare l'array:
    var clip_array:Array = new Array();
    Poi dentro il for, dopo il duplicate, usa il push:
    clip_array.push("clip"+i);
    Se a quel momento fai un trace(clip_array); ti ritorna tutte le istanze create e sono anche disponibile da usare al di fuori del ciclo.

    E quella parte che non aveva capito???:bho:


  • User

    Onsitus, no!
    vediamo se riesco a spiegarmi meglio (è difficile in quanto confuso anche io :?)
    Con il metodo push, assegno in automatico ad ogni elemento dell'array il valore corrente, cioè se faccio un trace (clip_array) ottengo ad ogni ciclo iterazione del ciclo For:
    clip1
    clip1, clip2
    clip1, clip2, clip3
    etc..
    se faccio un bel trace di trace(clip_array[2]) ottengo un bel clip1 cioè il valore caricato nella seconda cella dell'array (come è giusto che sia!)
    Ma questo funzionava anche prima senza il comodo metodo push.
    Il mio problema non è memorizzare in ogni cella dell'array il nome dell'istanza del clip filmato, ma utilizzarla.
    Esempio: se voglio applicare la proprietà _xscale all'istanza con il nome clip3, faccio: clip3._xscale = 100; e funziona, ma se faccio clip_array[2]._xscale = 100; NON funziona anche se un trace su clip_array[2] mi restituisce correttamente "clip3", al contrario se assegno direttamente clip_array[2] = clip3; allora clip_array[2]._xscale = 100; FUNZIONA! 😮

    Spero di essere stato più chiaro possibile :bho: non fosse per altro che per gli esempi con i pezzettini di codice...
    NOTTE


  • Super User

    @teradm said:

    Ciao!
    Il problema e che non so a priori quanti clip sono stati duplicati e vorrei ottenere un codice senza dover entrare in tanti cicli di controllo quanti clip massimo posso duplicare, qualcosa come ```
    "clip"+i.onRollOver = function () { etc..

    Lasciando a perdere l'array per il momento...stavo rileggendo il tuo primo post.
    Riguardo quello scritto sopra, provato con:

    this["clip"+i].onRollOver=function(){
            trace("over");
    }
    ```Sempre nel ciclo for.:bho:

  • User

    Onsitus 💋💋💋💋💋💋 SMACH!!!!!!!!!!

    Ora ci siamo!

    for(var i:Number = 0; i < nClip; i++) {
        this["clip"+i].onRollOut = dia_rollOut;
        this["clip"+i].onRollOver = dia_rollOver;
    };
    

    Va a meraviglia! finalmente il nome contenuto nella variabile (o nell'array in caso di array) viene considerato come il nome di istanza di un clip filmato!!! e quindi è possibile assegnare ad esso qualunque proprietà od operazione.

    Davvero tante grazie, sono sicuro che in seguito mi tornerà utile per tanti altri filmati.

    CIAO!:wink3:


  • Super User

    Mi fa piacere sapere che funziona. Ci ho messo un po per capire.:D


  • User

    Onsitus, intanto complimenti, ho dato un'occhiata al tuo sito e di conseguenza ai tuoi lavori, veramente molto brava e professionale.
    Ma ritorno OT ;).
    Come ti dicevo utilizzando
    this["clip"+i]._proprietà o altro....
    AC utilizza il testo clip+i come reale nome di un clip filmato, e quindi ad esso posso associare tutte le proprietà o metodi che voglio... (e fin qua ci siamo...) ma specificando "this" ho il problema che, se ad esempio, entro in una funzione generata da un oggetto, all'interno di questa funzione non posso utilizzare il metodo "this" per eseguire una operazione su un oggetto diverso... esempio:

     dia_rollOver = function () {
        this.swapDepths(diapositiva4);
        this.gotoAndPlay(2);
            etc.. etc..
            var i:Numeber = 5; //solo per fare un esempio
        this["riflesso"+i]._xscale = 12;
    };
    
    this["clip"+i].onRollOut = dia_rollOut;
    ```uso l'evento onRollOut sul clip filmato clip+i (esempio clip3) entro nella funzione dia_rollOut, eseguo una serie di operazioni sullo stesso clip utilizzando "this", ma quando devo specificare un altro clip filmato senza specificarlo direttamente come ad esempio riflesso3._xscale = 12; ma come accadeva prima this["riflesso"+i] etc.. non funziona, e direi giustamente perché il metodo this fa riferimento all'oggetto che ha generato l'evendo per il quale sono entrato nella funzione... allora in questo caso come devo specificare il nuovo clip ? :?
    In pratica è lo stesso problema di prima ma non funzionante lì dove non può essere utilizzato il metodo this...
    Sono sicuro che se hai capito bene la mia domanda grazie alla tua professionalità saprai rispondermi facilmente.
    
    Ciao :ciauz:

  • Super User

    Se i clip filmati 'riflesso' si trovano sulla linea temporale principale:
    dia_rollOver = function () {
    var i:Number=5;
    _root["riflesso"+i]._xscale=12;
    }

    :mmm:


  • User

    Onsitus come al solito ci hai preso :), ed ho anche capito che il problema stava non nel tipo di dichiarazione dell'oggetto clip ma dal suo percorso path dell'oggetto a cui si fa riferimento!

    GRAZIE ! di nuovo e Buon S.Valentino 💋


  • Super User

    Prego e grazie.:)