PDA

Volledige versie bekijken : DuplicateMovieClip werkt niet bij setInterval


Jobu
%Europe/Berlin %444 %2005, 11:39
Hallo,

Ik probeer aan de hand van een mc die op mijn stage staat (instancename=star) deze duplicateMovieClip() te laten uitvoeren (zie functie sterren), maar het wil om de een of ander reden niet werken.
Roep ik de functie op zich aan, dan werkt het wel ... maar het moet om de seconde aangeroepen worden, vandaar de setInterval().
Ziet iemand het probleem??

Mijn script:
function sterren() {
for(i:Number=0; i<10; i++){
var ster:String = "star"+ i;
_root.star.duplicateMovieClip(ster, this.getNextHighestDepth());

this[ster]._alpha = random(100);

this[ster]._x = random(650);
this[ster]._y = random(550);

var grootte:Number = Math.random(50)+30;
this[ster]._width = grootte;
this[ster]._height = grootte*0.9661;


}
}


var myInterval = setInterval(sterren,6000);

Alvast bedankt

Roenes
%Europe/Berlin %455 %2005, 11:55
this[ster] werkt niet meer als je in de setInterval zit omdat this dan verwijst naar het setInterval object. De oplossing is om de referentie naar de nieuwe mc (die duplicateMovieClip terug geeft) op te slaan en daarmee te werken:

function sterren() {
for(i:Number=0; i<10; i++){
var ster:String = "star"+ i;
var mc = _root.star.duplicateMovieClip(ster, this.getNextHighestDepth());

mc._alpha = random(100);

mc._x = random(650);
mc._y = random(550);

var grootte:Number = Math.random(50)+30;
mc._width = grootte;
mc._height = grootte*0.9661;
}
}
var myInterval = setInterval(sterren,6000);

Laiverd
%Europe/Berlin %488 %2005, 12:42
Volgens mij is er nog een ander probleem. Kwestie van even de docs lezen, maar als een functie iedere seconden wordt aangeroepen, dan betekent dat iedere 1000 (!) milliseconde en niet 6000.

En ik zou eens even een trace doen op this in de functie this.getNextHighestDepth()

John

Jobu
%Europe/Berlin %533 %2005, 13:48
Met de verwijzing naar een variabele (mc) werkt het wel degelijk. Wat die 6000 betreft was ik op de hoogte dat het hier 6 seconden lang duurt. ;)

Maar bij het tracen van this.getNextHighestDepth() geeft hij me steeds undefined??
Waardoor er telkens maar 1 ster wordt gedupliceerd ipv 10 (zie for loop).

Ik denk dat ik ook de definitie van depth niet helemaal doorheb. MOET bij het dupliceren van een movieclip telkens een nieuwe diepte aangegeven worden? Ook als mijn instance name verschillend is?
En bij de volgende setInterval, gaat hij in mijn for loop toch weer dezelfde instance names produceren? --> star0 - star9
Mag dat wel?

Roenes
%Europe/Berlin %536 %2005, 13:52
sorry, die this voor getNextHighestDepth klopt natuurlijk ook niet meer door het interval. _root.getNextHighestDepth() zou het probleem moeten oplossen :)

Jobu
%Europe/Berlin %548 %2005, 14:10
De _root.getNextHighestDepth() heeft het inderdaad opgelost.

Bedankt Roenes en Laiverd voor jullie hulp!

Jobu
%Europe/Berlin %669 %2005, 17:03
Ik blijf toch nog met een probleem zitten.

Namelijk wanneer de animatie een lange tijd blijft lopen wordt het blijkbaar heel zwaar om te verwerken (browser loopt vast).

Ik veronderstel dat dit te wijten is aan het aantal 'stars' die aangemaakt worden in mijn for-loop.
Dus zou ik die, na elke loop, moeten kunnen removen met removeMovieClip() denk ik???

Omdat ik dezelfde instancename in elke loop opnieuw gebruik, hoe kan ik die dan removen (als mijn probleem daar ligt natuurlijk) zodat de movie niet te heavy wordt ... wetende dat elke 'star' een movieclip met een animatie.

Jobu
%Europe/Berlin %686 %2005, 17:28
hmmm ...

Ik denk dat ik het zelf gevonden heb :D (feels great!!)
Onderstaande werd toegevoegd op het einde van de for loop:

mc.onEnterFrame = function(){
if(this._currentframe == 60){this.removeMovieClip()};

Btw: in mijn 'star' mc is frame 60 de laatste frame van de animatie.

Moest er toch iets mis mee zijn met mijn werkwijze, let me know

Roenes
%Europe/Berlin %695 %2005, 17:41
Je werkwijze is op zich goed en het is een goede oplossing. Alleen nu maak je voor iedere mc een eigen onEnterFrame aan wat natuurlijk ook weer zwaar kan worden. Ik zou het nog een stapje makkelijker maken en handmatig op frame 60 de this.removeMovieClip() zetten. :)