Follow us on...
Follow us on Twitter Follow us on Facebook
Registrazione
Risultati da 1 a 9 di 9
  1. #1
    Data Registrazione
    Jan 2009
    Messaggi
    184

    Predefinito il " Per Ogni " HitTest

    Salve, cerco di creare una funzione che al click su un mc, controlli uno per uno gli elementi di un array tramite hitTest, ma non riesco.
    Sono creati automaticamente vari mc (mc1 - mc2 e cos via) draggabili, inseriti in un solo array, vorrei che trascinando uno qualsiasi di questi mc, su un altro mc dell'array stesso, mi dica (esempio) " l'mc21 sopra l'mc 13 ".
    Non capisco come gestire la cosa.

    Codice PHP:
    function dragS(e:MouseEvent)
    {
        
    e.target.addEventListener(Event.ENTER_FRAMEcheckt);
        
    e.target.startDrag();
        var 
    mcRel:MovieClip MovieClip(e.target);
        var 
    topP:Number mcStage.numChildren 1;
        
    mcStage.setChildIndex(mcReltopP);
    }

    function 
    stopD(e:MouseEvent)
    {
        
    e.target.stopDrag();
        
    e.target.removeEventListener(Event.ENTER_FRAMEcheckt);
    }


    function 
    checkt(e:Event):void
    {
        for (var 
    i=0i<arr.lengthi++)
        {
            if (
    e.currentTarget.hitTestObject(arr[i]))
            {
                
    trace(n++)
                
    trace(e.currentTarget.name)
            }
        }

    Voglio diventare un programmatore vero!!

  2. #2
    Data Registrazione
    Jan 2009
    Messaggi
    184

    Predefinito

    troppo difficile??
    Voglio diventare un programmatore vero!!

  3. #3
    Data Registrazione
    Sep 2010
    Messaggi
    483

    Predefinito

    Ciao,
    mi sembra che manchi del codice...

    Presumo che tu abbia omesso come vengano richiamate le 2 funzioni per gestire il drag, comunque
    non capisco il listener associato all'evento ENTER_FRAME.

    Se non ho capito male la tua domanda devi eseguire la funzione checkt quando viene terminato il drag per sapere la posizione assunta dal movieclip che hai spostato
    ma non vedo il codice necessario.

  4. #4
    Data Registrazione
    Jan 2009
    Messaggi
    184

    Predefinito

    Ciao MrPhp, il codice che non c' riguarda la creazione dei vari mc con associati i listener drag&stop tutto qui.
    Il controllo deve avvenire non al rilascio del mouse, quindi al stopDrg, ma durante il drag, ecco perch ho l'enterframe, che sarebbe la funzione di controllo, nello startDrag.
    Voglio diventare un programmatore vero!!

  5. #5
    Data Registrazione
    Sep 2010
    Messaggi
    483

    Predefinito

    Ciao.
    Ho fatto una prova con il tuo codice...
    ho aggiunto solo la propriet "name" ad i movieclip ed il codice funziona.

    Nella funzione checkt ho modificato come segue per evitare che il controllo e la relativa stampa del trace venga eseguita + volte essendo legata all'ENTER_FRAME.

    Codice:
    function checkt(e:Event):void 
    { 
       var lg:int= arr.length;
       for (var i=0; i<lg; i++) 
       { 
         if (e.currentTarget.hitTestObject(arr[i])) 
         { 
            e.target.removeEventListener(Event.ENTER_FRAME, checkt); 
            trace("Il MovieClip",e.currentTarget.name,"si trova sopra il MovieClip",arr[i].name) 
         } 
       } 
    }

    Tutto funziona ma rimane il problema dell'
    ENTER_FRAME che esegue molte volte il controllo meglio se leghi il controllo allo stopDrag, sempre che ti sia possibile.


  6. #6
    Data Registrazione
    Jan 2009
    Messaggi
    184

    Predefinito

    MrPhp ti ho inviato un pm.
    Voglio diventare un programmatore vero!!

  7. #7
    Data Registrazione
    Sep 2010
    Messaggi
    483

    Predefinito

    Ho scritto il codice di getto per arginare le ripetizioni del trace dovute all'ENTER_FRAME.
    Non so se ho scritto un buon codice...anzi penso che sia necessaria una attenta ottimizzazione, che lascio al diretto interessato.

    Ecco quello che ne saltato fuori :

    Codice:
    var mc:MovieClip;                  // dichiaro una variabile di tipo MovieClip
    
    
    var arr:Array = new Array();     // dichiaro e creo una istanza di tipo Array
    var lg:int = 0;                           // dichiaro e imposto valore variabile di tipo int
    var max:Number = 155;           // dichiaro e imposto valore variabile di tipo Number
    var min:Number = -155;           // dichiaro e imposto valore variabile di tipo Number
    
    
    var mcSel:MovieClip;                                     // dichiaro una variabile di tipo MovieClip
    var mcHit:MovieClip = new MovieClip();        // dichiaro e creo una istanza di tipo MovieClip
    
    
    for(lg;lg<5;lg++) {
        
        // creo il movieclip ************************************************************
        //
        mc = new MovieClip();                       // Creo una nuova istanza 
        mc.name="Clip_"+lg;                         // Addegno un nome alla nuova istanza
        mc.graphics.beginFill(0x000000);        // imposto un colore
        mc.graphics.drawCircle(50, 50, 25);    // imposto posizione e dimensione
        mc.graphics.endFill();                         // 
        mc.buttonMode=true;                         // abilito la manina
        
        mc.y= 50;                                           // imposto posizione asse Y
        mc.x= lg*50 + lg*25;                          // imposto posizione asse x
        
        // Cambio il colore da associare al nuovo MovieClip *****************************
        //
        var mcColor:ColorTransform = new ColorTransform();
        mcColor.alphaOffset=0.8;
        mcColor.blueOffset=Math.ceil(Math.random()*(max-min))+min;
        mcColor.greenOffset=Math.ceil(Math.random()*(max-min))+min;
        mcColor.redOffset=Math.ceil(Math.random()*(max-min))+min;
        
        mc.transform.colorTransform=mcColor;     // 
        
        // Imposto i listener del movieclip *********************************************
        //
        mc.addEventListener(MouseEvent.MOUSE_DOWN, dragS); 
        mc.addEventListener(MouseEvent.MOUSE_UP, stopD); 
        
        // Aggiumgo alla displaylist il movieclip****************************************
        //
        addChild(mc);
        
        // Aggiungo il movieclip all'array **********************************************
        //    
        arr.push(mc);
    }
    
    
    function dragS(e:MouseEvent) 
    { 
        e.target.addEventListener(Event.ENTER_FRAME, checkt); 
        e.target.startDrag(); 
        mcSel = e.target as MovieClip; 
        var topP:Number = numChildren - 1; 
        setChildIndex(mcSel, topP); 
    } 
    
    
    function stopD(e:MouseEvent) 
    { 
        e.target.stopDrag(); 
        e.target.removeEventListener(Event.ENTER_FRAME, checkt); 
    } 
    
    
    
    
    function checkt(e:Event):void 
    { 
        var lg:int = arr.length; 
        for (var i=0; i<lg; i++) 
        { 
            if ( (e.currentTarget.hitTestObject(arr[i]) ) && (e.currentTarget.name != arr[i].name) ) 
            {    
                if (mcHit.name != arr[i].name ) {
                    trace(mcSel.name,"si trova sopra",arr[i].name)
                    mcHit=arr[i] as MovieClip;
                }
            } 
        } 
    }
    Buon studio

  8. #8
    Data Registrazione
    Jan 2009
    Messaggi
    184

    Predefinito

    Codice PHP:
    if ( (e.currentTarget.hitTestObject(arr[i]) ) {trace("ok")} 
    Non mi chiaro, se l'mc selezionato sopra uno degli elementi contenuti nell'array, tracciami "ok", ma allora perch l'ok appare appena clicco a prescindere dalla posizione dell'mc?

    Lo stesso in questa:
    Codice PHP:
     && (e.currentTarget.name != arr[i].name
    Se il nome dell'mc selezionato diverso da quello sopra cui si trova ecc ecc .. ..

    Seziono e studio il tuo codice, sbaglio nello scrivere le condizioni?
    Voglio diventare un programmatore vero!!

  9. #9
    Data Registrazione
    Sep 2010
    Messaggi
    483

    Predefinito

    Citazione Originariamente Scritto da nuovobuio Visualizza Messaggio
    Codice PHP:
    if ( (e.currentTarget.hitTestObject(arr[i]) ) {trace("ok")} 
    Non mi chiaro, se l'mc selezionato sopra uno degli elementi contenuti nell'array, tracciami "ok", ma allora perch l'ok appare appena clicco a prescindere dalla posizione dell'mc?
    Questo succede perch alla pressione del mouse ( quindi il target il movieclip selezionato ) viene rilevato l'evento ENTER_FRAME e poi viene eseguito il loop sull' array ( che ovviamente contiene anche il movieclip target) che soddisfatta la condizione dell' if con la conseguenza di eseguire il trace.

    Non so se mi sono spiegato bene ..... o ti ho fatto confusione.

    Se guardi i controlli if che ho postato ti renderari conto che servono, oltre che ha verificare la collisione tra i movieclip, proprio ad evitare che venga eseguito il trace appena fatto il click su un movieclip e per non ripetere il trace ad ogni evento ENTER_FRAME.

    Come vedi, in sostanza, ho modificato solo i controlli If .

 

 

Segnalibri

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •