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

    [MX2004] getNextHighestDepth() e componenti

    Ciao a tutti

    un amico stava facendo un filmato usando molti duplicateMovieClip e removeMovieClip (in pratica è un filmato in cui l'utente prende degli oggetti da una libreria e li duplica per portarli nei contenitori e inoltre c'è l'opzione per cancellarli singolarmente).
    Dato che con flash player 7 c'è il metodo getNextHighestDepth() l'amico ha deciso di usare questo metodo per indicare il livello del mc duplicato.
    Finchè prova il filmato senza inserire alcun componente, tutto funziona (facendo il trace di getNextHighestDepth() i valori restituiti sono bassi, cioè 0-1-2...etc). Se invece nel filmato vengono inseriti anche dei componenti, il getNextHighestDepth() mi restituisci dei valori alti, ossia superiore a 1048575 (che è il limite della profondità come indicato sul manuale).

    La soluzione l'abbiamo trovata (usando una variabile che si incrementa automaticamente ad ogni duplicate) però sta storia che il getNextHighestDepth() non funziona con i componenti non è poi tanto bella...

    Qualcuno di voi ne sa qualcosa in più? E' documentato da qualche parte questo "difetto"?

    thanks

    regalami un oggi da favola...e il domani bhe!?non mi importa se tu 6 con me! ©Ily

  2. #2
    se vi può essere d'aiuto ecco 2 esempi.

    Nel primo ho messo il componente, nel secondo no
    il codice è lo stesso. Per provare basta cliccare sul pulsante duplica, quindi cliccate sulla gomma e cliccate nuovamente sul movieClip duplicato.
    In basso a sx viene tracciato il valore di getNextHighestDepth()

    vi lascio anche i .fla

    1) con component
    fla con component
    2) senza component
    fla senza component

    per i più pigri ecco il codice

    codice:
    duplica.onRelease = function() {
    	_root.campo.text = _root.getNextHighestDepth();
    	mc.duplicateMovieClip("mc1", _root.getNextHighestDepth());
    	mc1._x = 200;
    	this.enabled = false;
    };
    gomma.onPress = function() {
    	_root.campo.text = _root.getNextHighestDepth();
    	this.duplicateMovieClip("gommariserva", _root.getNextHighestDepth());
    	Mouse.hide();
    	startDrag("gommariserva");
    	gommariserva.onMouseDown = function() {
    		if (this.hitTest(_root.mc1)) {
    			_root.mc1.removeMovieClip();
    			_root.duplica.enabled = true;
    		}
    		stopDrag();
    		Mouse.show();
    		this.removeMovieClip();
    	};
    };

    regalami un oggi da favola...e il domani bhe!?non mi importa se tu 6 con me! ©Ily

  3. #3
    A parte che secondo me se un metodo stesso di Flash va oltre quel limite consigliato , ovvero restituisce 1048576 se richiamato, significa che un livello sopra e disponibile ancora c'e' ... quindi non vedo perche' non approfittarsene di tutti quelli che trova oltre quel "limite" ... comunque ho pensato ad una cosa di questo tipo:


    codice:
    var nextDepth:Function = function():Number {
    	var highestDepth:Number = new Number( getNextHighestDepth() );
    	if( highestDepth > 1048575 ) {
    		var a:Number = new Number( 0 );
    		while( a < 1048575 ) {
    			if( getInstanceAtDepth( a ) == undefined ) {
    				highestDepth = new Number( a );
    				break;
    			}
    			a++;
    		}
    	}
    	return highestDepth;
    }
    ti permette di non andare mai oltre il cosidetto limite e di non sovrascrivere mai livelli gia' utilizzati.


    un esempio di utilizzo puo' essere:
    this.createEmptyMovieClip( "myMovie_" + nextDepth(), nextDepth() );

    Funziona, ovviamente, solo con MX2004
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Yasso ha detto che ha già risolto (v. thread in annunci), ma a quanto pare s'è scordato di scriverlo di qua

  5. #5
    a te stavo aspettando

    Originariamente inviato da andr3a
    A parte che secondo me se un metodo stesso di Flash va oltre quel limite consigliato , ovvero restituisce 1048576 se richiamato, significa che un livello sopra e disponibile ancora c'e' ... quindi non vedo perche' non approfittarsene di tutti quelli che trova oltre quel "limite"
    semplicemente perchè non funziona (visto gli esempi???) cioè non funziona il removeMovieClip, il duplicate va

    Originariamente inviato da andr3a
    comunque ho pensato ad una cosa di questo tipo:


    codice:
    var nextDepth:Function = function():Number {
    	var highestDepth:Number = new Number( getNextHighestDepth() );
    	if( highestDepth > 1048575 ) {
    		var a:Number = new Number( 0 );
    		while( a < 1048575 ) {
    			if( getInstanceAtDepth( a ) == undefined ) {
    				highestDepth = new Number( a );
    				break;
    			}
    			a++;
    		}
    	}
    	return highestDepth;
    }
    ti permette di non andare mai oltre il cosidetto limite e di non sovrascrivere mai livelli gia' utilizzati.


    un esempio di utilizzo puo' essere:
    this.createEmptyMovieClip( "myMovie_" + nextDepth(), nextDepth() );

    Funziona, ovviamente, solo con MX2004
    io ne ho trovato un altro, ossia quello di controllare a priori se co sono livelli occupati, in casso affermativo li sposto sui livelli bassi... però devo verificare bene sta cosa
    Cmq provo anche il tuo sistema poi magari vediamo qual'è la miglior soluzione

    regalami un oggi da favola...e il domani bhe!?non mi importa se tu 6 con me! ©Ily

  6. #6
    io ho fatto na cosa del genere (prima di altri codici):

    codice:
    i = 0;
    var k = _root.getNextHighestDepth()-1;
    while (i!=k && k>=0){
    	i++;
    	var kk = _root.getInstanceAtDepth(k);
    	kk.swapDepths(i);
    	var k = _root.getNextHighestDepth()-1;
    }
    però devo verificare bene se funziona o meno

    regalami un oggi da favola...e il domani bhe!?non mi importa se tu 6 con me! ©Ily

  7. #7
    Originariamente inviato da Yassassin
    a te stavo aspettando
    eccomi



    Originariamente inviato da Yassassin
    semplicemente perchè non funziona (visto gli esempi???) cioè non funziona il removeMovieClip, il duplicate va
    non ho visto gli esempi, comunque e' una storia vecchia e c'e' una p4n74/andr3a/7vite prototype che risolve il problema ...



    Originariamente inviato da Yassassin
    io ne ho trovato un altro, ossia quello di controllare a priori se co sono livelli occupati, in casso affermativo li sposto sui livelli bassi... però devo verificare bene sta cosa
    Cmq provo anche il tuo sistema poi magari vediamo qual'è la miglior soluzione
    se la tua necessita' e' di creare sempre e comunque davanti agli altri c'e' un errore di logica perche' potresti ( a livello teorico intendo ) trovarti come dire .... incartato, mentre se vuoi semplicemente creare in sequenza ha piu' senso sia il tuo metodo che il mio, solo che il mio fa meno operazioni quindi e' piu' leggero e/o veloce.

    Se invece il tuo unico interesse e' quello di creare comunque davanti agli altri, non ti resta che usare il solo getNextHighestDepth() e risolvere il problema della rimozione con la proto di cui ti parlavo:

    codice:
    MovieClip.prototype.removeMovie = function() {
    	this.removeMovieClip( this.swapDepths( 666 ) );
    }
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    per completare il tutto direi che come soluzione puoi anche adottare la combinazione delle 2, cosi' da non rompere mai le scatole a nessuna depth a prescindere da dove parti .

    duplichi o crei usando getNextHighestDepth() e rimuovi con la proto che pero' sara' usata in combinazione con la funzione che ho postato prima.
    codice:
    var nextDepth:Function = function():Number {
    	var highestDepth:Number = new Number( getNextHighestDepth() );
    	if( highestDepth > 1048575 ) {
    		var a:Number = new Number( 0 );
    		while( a < 1048575 ) {
    			if( getInstanceAtDepth( a ) == undefined ) {
    				highestDepth = new Number( a );
    				break;
    			}
    			a++;
    		}
    	}
    	return highestDepth;
    }
    MovieClip.prototype.removeMovie = function() {
    	var thisDepth:Number = new Number( this.getDepth() );
    	if( thisDepth > 1048575 ) {
    		this.removeMovieClip( this.swapDepths( nextDepth() ) );
    	}
    	else {
    		this.removeMovieClip();
    	}
    }
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

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.