Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    207

    [AS3] parametro passato al gestore di evento

    Ciao, ho un problema con la gestione degli eventi. Come faccio ad accedere all'oggeto/istanza che ha generato l'evento?
    Nel codice che riporto creo vari oggetti BtnNav (è una classe che estende Sprite e ha propri metodi) con un for. Ogni ciclo for richiama il metodo initBtnEvent, passando come parametro l'istanza di BtnNav. InitBtnEvent inizializza i listener. Il problema sorge quando viene richiamato il gestore di evento. Nell'esempio provo ad accedere al metodo twColorContinueTo di BtnNav, ma il compilatore mi dice che non è un metodo di evt.target.
    Il trace mi rende [object Sprite] e non object BtnNav come mi aspetterei. Perche?
    Da mouseOverHandler come faccio a fare riferimento all'oggetto su cui è registrato il listener?

    codice:
    private function creaBtns() {
    	for (var i:int=0; i<_pulsantiDati.length; i++) {
    		var btn:BtnNav=new BtnNav(_pulsantiDati[i].etichetta, _pulsantiDati[i].link,_slideShow);
    		initBtnEvent(btn);
    	             this.addChild(btn);
    	}
    }
    private function initBtnEvent(dispatcher:BtnNav):void {
    	dispatcher.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
    	dispatcher.addEventListener(MouseEvent.CLICK, mouseUpHandler);
    }
    private function mouseOverHandler(evt:MouseEvent) {
    	trace(evt.target);
    	evt.target.twColorContinueTo(Assets.MOUSE_OVER, 0.5);
    }

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    dentro la funzione prova a ritrasformare il target in BtnNav

    Codice PHP:
    private function mouseOverHandler(evt:MouseEvent) {
        var 
    t:BtnNav evt.target as BtnNav;
        
    t.twColorContinueTo(Assets.MOUSE_OVER0.5);


  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    207
    Mi rende questo errore:
    TypeError: Error #1009: Impossibile accedere a una proprietà o a un metodo di un riferimento oggetto null.
    at it.techne::Nav/mouseOverHandler()

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    l'errore parte da un oggetto Nav e non BtnNav :master: in effetti guardando il codice non dovrebbe creare questo problema, mi piacerebbe vedere il resto del codice per darti una mano a risolvere la cosa

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    207
    Problema risolto, anche se mi lascia perpleso, sarà che sono ancora al rodaggio di as3.
    Nella classe BtnNav, creavo uno Sprite vuoto di nome sp (var sp:Sprite=nre Sprite()) che mi faceva da contenitore.
    Al suo interno aggiungevo sfondo e testo. Poi dicevo, sempre nella classe BtnNav, this.addChild(sp).
    Nella classe principale quando istanziavo BtnNav se facevo un trace mi veniva reso [object BtnNav] ma nel listener [object Sprite]. Ho eliminato il contenitore (sp) e aggiungo alla displayList i due elementi singolarmente (this.addChild(sfondo), this.addChild(testo)).
    Così pare funzionare.
    Mi chiedo perchè?

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    207
    Anzi mi correggo non funziona neanche così. Il problema nasce appena uso uno sprite (lo sfondo).
    Se uso solo il testo funziona.
    Ecco il codice.

    Codice PHP:
        public class BtnNav extends Sprite {

            private var 
    _etichetta:String;
            public var 
    _link:String;
            private var 
    _twColore:TweenColore;
            private var 
    _slideShow:SlideShow;

            public function 
    BtnNav(etichetta:Stringlink:StringslideShow:SlideShow) {
                
    _link=link;
                
    _slideShow=slideShow;
                
    creaBtn(etichetta);
            }
            private function 
    creaBtn(etichetta:String) {


                var 
    testo:TextField=creaEtichetta(etichetta);
                
    testo.mouseEnabled=false;

                var 
    sf:Sprite=new Sprite();
                
    sf.graphics.beginFill(0x0000001);
                
    sf.graphics.drawRect(0,0,testo.width,testo.height);
                
    sf.graphics.endFill();

                
    this.addChild(sf);
                
    this.addChild(testo);

                
    _twColore=new TweenColore(testoAssets.MOUSE_OUT);

            }
            private function 
    creaEtichetta(etichetta:String):TextField {

                var 
    campo:TextField=new TextField();
                
    campo.name="testo";
                
    campo.autoSize=TextFieldAutoSize.LEFT;
                
    campo.text=etichetta;
                
    campo.embedFonts=true;
                
    campo.selectable=false;
                
    ///---////
                
    var format:TextFormat=new TextFormat();
                
    format.font="Bodoni";
                
    format.size=16;
                
    ///---////
                
    campo.setTextFormat(format);
                
    ///---////
                
    return campo;

            }
            public function 
    twColorContinueTo(color:uinttime:Number):void {
                
    _twColore.continueTo(colortime);
            }
        } 

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    207
    Il resto di Nav direi che non è influente: la classe estende Sprite, l'unico metodo omesso è il costruttore, che si occupa solo di assegnazioni e di chiamare il metodo creaNav.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    207
    Ok. Penso di aver capito.
    Da un punto i vista empirico mi sembra che se si registra un listener su di un DisplayObjectContainer, che contiene diversi DisplayObject, la chiama al gestore venga fatta dall'oggetto "coinvolto" nell'evento. Quindi se ho sfondo e testo in uno Sprite su cui ho registrato un MOUSE_OVER, e il mouse passa prima sullo sfondo, il contenuto di evt.target è lo sfondo.
    Tornado al mio caso ho provato a usare evt.target.parent e pare che tutto funzioni.
    Mi sa che devo studiare meglio la guida!

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    207
    Ecco la teoria (direi che è fondamentale capire il flusso di eventi)


    La proprietà target
    La proprietà target contiene un riferimento all'oggetto che rappresenta il destinatario dell'evento. In alcuni casi il destinatario è semplice: quando un microfono diventa attivo, il destinatario dell'evento è l'oggetto Microphone. Se il destinatario si trova nell'elenco di visualizzazione, tuttavia, è necessario prendere in considerazione anche la gerarchia dell'elenco di visualizzazione. Ad esempio, se un utente esegue un clic del mouse in un punto che comprende più oggetti dell'elenco di visualizzazione sovrapposti, Flash Player sceglie come destinatario dell'evento l'oggetto più distante dallo Stage.

    Nei file SWF particolarmente complessi, in particolare quelli in cui i pulsanti sono normalmente decorati con piccoli oggetti secondari, la proprietà target spesso può non essere utilizzabile poiché punterebbe a un oggetto secondario e non al pulsante. Un metodo comunemente usato in questi casi consiste nell'aggiungere listener di eventi al pulsante e usare la proprietà currentTarget perché ha la particolarità di puntare al pulsante, mentre la proprietà target potrebbe puntare a un oggetto secondario del pulsante.

    La proprietà currentTarget
    La proprietà currentTarget contiene un riferimento all'oggetto che sta elaborando l'oggetto evento. Anche se può apparire strano non sapere quale nodo sta attualmente elaborando l'oggetto evento che si sta analizzando, si tenga presente che è possibile aggiungere una funzione listener a qualsiasi oggetto di visualizzazione del flusso dell'oggetto e che la funzione listener può essere inserita in qualsiasi posizione. Inoltre, la stessa funzione listener può essere aggiunta a vari oggetti di visualizzazione. Man mano che la dimensione e la complessità di un progetto crescono, la proprietà currentTarget diventa sempre più utile.


  10. #10
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    ho compreso il tuo problema, è uan questione di propagazione dell'evento, nel tuo caso l'oggetto che viene considerato target è il primo che viene "letto" dal mouse, ossia proprio lo Sprite al suo interno, ma se inibisci la propagazione degli eventi del mouse ai figlio (usando mouseChildren=false) non dovresti avere più problemi

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.