Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    AS3 removeChild e oggetto che continua ad esistere

    Sto al solito convertendo una classe.


    Situazione, ho un clip sullo stage chiamato pippo,

    nella mia classe ho qualcosa tipo


    classe.addControl(pippo)

    codice:
    function addControl(target)
       oggetto = new object()
       oggetto.target = target
      _ogg_controllati.push(oggetto)
    }

    Se io rimuovo dallo stage pippo
    removeChild(pippo)

    e poi vado a controllare

    _ogg_controllati[0].target è come se l'oggetto esistesse ancora, cioè sicuramente esiste ancora.
    La domanda è: removeChild non rimuove l'oggetto proprio, o l'oggetto rimane perché ne ho un riferimento sull'array?

    Quello che devo fare è controllare ogni volta l'array _ogg_controllati, e vedere se il displayobject esiste ancora sullo stage, altrimenti lo sego dall'indice.

    Sono stato chiaro? ^^

    In AS2 era così

    codice:
    		for (var i=0;i<__ogg_controllati.length;i++){
    			var oggetto:Object = __ogg_controllati[i];
    			if (oggetto.target._name==undefined){ //se il clip non esiste più lo tolgo dall'elenco da posizionare
    				__ogg_controllati.splice(i,1)
    			}else{
    				Sposta(oggetto);
    			}
    		}

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Il removeChild non rimuove e non elimina un oggetto di visualizzazione, lo rimuove solo dalla lista di visualizzazione.
    In AS3 il garbage collector funziona in maniera automatica e dopo un tot di tempo che un oggetto non viene più utilizzato e quindi non serve più viene eliminato, ma a quanto pare (e dalle prove che ho fatto) non può essere eliminato manualmente, cosa che dovrebbe comunque valere solo per gli elementi di visualizzazione.
    Puoi in ogni caso rimuovere l'oggetto dall'array utilizzando l'evento removed o removedToStage.

  3. #3
    Questo immagino nel momento in cui faccio removeChild()

    Dovrei mettere un eventListener al remove e quindi togliere l'oggetto dall'array, giusto?

    Un'altra cosa.

    E' possibile accedere alle proprietà di alineamento e alle dimensioni dello Stage, da una classe?
    Se è troppo intricato le passo come parametri al costruttore.

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    >>Questo immagino nel momento in cui faccio removeChild()
    >>Dovrei mettere un eventListener al remove e quindi togliere l'oggetto dall'array, giusto?

    Sì chiaramente però l'evento va impostato quando stai creando l'elemento, ad esempio:

    Codice PHP:
    var test:Sprite = new Sprite();
    test.addEventListener(Event.REMOVEDremovedHandler);
    function 
    removedHandler (evt:Event) {
        
    trace("removed")
    }
    addChild(test);
    setTimeout(removeChild1000test); 

    >>E' possibile accedere alle proprietà di alineamento e alle dimensioni dello Stage, da una classe?
    >>Se è troppo intricato le passo come parametri al costruttore.

    Da una classe di visualizzazione sì, ma solo se l'elemento è presente sullo stage (fino ad allora la proprietà stage sarà null). La cosa più semplice è effettivamente passare stage come parametro al costruttore o alla funzione che ne deve fare uso.

  5. #5
    Sì, però è un po' una palla metterlo ad ogni oggetto...

    Sarebbe da estendere la classe e metterci l'evento pronto però boh...

    Ecco, non avevo pensato a passare direttamente lo stage alla classe (avevo pensato di passare le proprietà, solo che ogni volte le avrei dovute ripassare). Così risolvo alla grande.

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Originariamente inviato da Stan
    Sì, però è un po' una palla metterlo ad ogni oggetto...

    Sarebbe da estendere la classe e metterci l'evento pronto però boh...
    Beh, dipende da come lo fai, se usi una routine in una funzione, non te ne accorgi nemmeno.

  7. #7
    Ovvero? :master:

  8. #8
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Beh, crei una funzione tipo questa

    Codice PHP:
    function addChildWithEvent (c:*) {
        var 
    addChild(c);
        
    c.addEventListener(Event.REMOVED, function (evt:Event) { //azioni });


  9. #9
    ti dico un trucchetto per evitare di passare lo stage come parametro.
    Il trucco cosiste nel creare una classe Global.as in cui è definito un oggetto Var (ad esempio) che ha dele proprietà dinamiche, ciò significa che puoi creare delle var tipo Global.Var.Ciao senza passare dalla classe Global, da qualunque classe aggiunta allo stage.
    Nella MainClass fai Global.Var.MainStage=stage e da qualunque classe raggiungi lo stage chiamando Global.Var.MainStage.

  10. #10
    Originariamente inviato da and80
    Beh, crei una funzione tipo questa

    Codice PHP:
    function addChildWithEvent (c:*) {
        var 
    addChild(c);
        
    c.addEventListener(Event.REMOVED, function (evt:Event) { //azioni });

    Mica male

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.