Volledige versie bekijken : Alles uit movieclip verwijderen
Yonivh
%Europe/Berlin %559 %2010, 14:25
Ik ben bezig met een applicatie die een xml file uitleest met bestanden en deze achtereenvolgens gaat tonen. Afbeeldingen, swf, video door elkaar heen. Ook moet hij verschillende swf's over elkaar heen kunnen tonen.
Ik loop alleen tegen een probleem aan. Als ik een flash file met geluid inlaad blijft het geluid doorlopen na het wisselen van bestand. Ook krijg ik in een flash file, waar ik enkel de dimensies van het scherm uitlees en op het scherm toon, een foutmelding. Deze melding verschijnt echter ook pas bij het laden van de volgende file. Het lijkt erop dat de flash file van de stage wordt verwijderd (hij kan de waardes daardoor blijkbaar niet meer uitlezen?) maar op de één of andere manier toch nog geladen is.
Dit is de situatie:
Flash file waarin een movieclip wordt aangemaakt. Hierin laadt ik de 'Preview' class. Preview extends Sprite. In Preview ga ik na wat voor type bestand ik mee te maken heb en a.d.h.v. deze informatie maak ik een instantie van een class aan behorende bij het bestandstype en stop deze ook in een movieclip. In de laatste class (welke ook Sprite extend) laadt ik de file en doe ik een addChild(). Na dit alles heb ik in mijn Preview class ook een addChild() om de instantie toe te voegen.
Voor het laden van een bestand gebruik ik de volgende functie:
private function removeChildren (holder):void {
var i:int = holder.numChildren;
while( i -- ) {
holder.removeChildAt( i );
}
}Je zou denken dat alles uit de movieclip verwijderd wordt en hij daarna de nieuwe file aan de movieclip toevoegt. Er gaat blijkbaar nog iets fout. Ik kom er alleen niet achter wat.
Heeft iemand hier enig idee?
e.l.dam
%Europe/Berlin %945 %2010, 23:41
Iets met geluid eerst handmatig stoppen? Volgens mij is het verwijderen van een display object nooit voldoende, maar moet je ook het soundchannel stoppen.
Yonivh
%Europe/Berlin %829 %2010, 20:54
Ok, bedankt. Dit is inderdaad iets om te proberen. Mijn bevindingen zal ik hier posten. :)
BernardV
%Europe/Berlin %966 %2010, 00:12
Je code voor het verwijderen klopt ook niet.
Stel dat je een movieclip hebt met 3 children, dan loop jij van 0..2 wat goed is.
Dan verwijder je als eerste de child op positie 0 en dan verhoog je je teller met 1.
MAAR aangezien je net de child op index 0 hebt verwijderd is de child op index 1 verplaatst naar de index 0 en de child op index 2 verplaatst naar index 1.
Dus je verwijderd nu index 1 en de child die daar stond blijft bestaan, aangezien die nu index 0 heeft.
Makkelijkste oplossing is:
while(displayObject.numChildren > 0)
{
displayObject.removeChildAt(0);
}
Dan blijft hij gewoon loopen totdat de numChildren 0 is.
//EDIT: Geluid stoppen moet sowieso.. dit was meer ter info over je code.
Salvago
%Europe/Berlin %464 %2010, 12:09
Klopt natuurlijk niet wat je zegt hè BernardV. Misschien volgende keer toch wat eerder gaan slapen ;)
var i:int = displayObject.numChildren; // bv 5
while( i -- ) { // i = 5 op check, en 4 na deze is uitgevoerd
displayObject.removeChildAt( i ); // verwijderd Child op positie 4 (laatste child dus)
} // rinse repeat, totdat i = 1, waarop de child op index 0, de eerste, verwijderd wordt
// de volgende keer is de conditional niet meer waar, en dus loop afgehandeld
Dat gezegd hebbende, ben ik wel voorstander van jouw notatie: het is een stuk leesbaarder/duidelijker, en lang niet zo dubbelzinnig als bovenstaande. En dat is het belangrijkste aan code.
BernardV
%Europe/Berlin %892 %2010, 22:24
Dat klopt zeker wel Salvago ;)
Test maar :D
Misschien heb je een kleine uitleg nodig :P
Door een while (numChildren > 0) te gebruiken en elke keer het item op index 0 te verwijderen loopt hij door totdat alles weg is, met een loop die een incremental counter heeft en je gaat dan indexes verwijderen opbasis van die index in de counter verwijder je niet het item wat je in eerste instantie dacht te verwijderen (behalve bij het starten van de loop).
Heb even een voorbeeldje gemaakt ;)
var spriteCount:int = 5;
var i:int = 0;
var holderSprite:Sprite = addChild(new Sprite()) as Sprite;
var tempSprite:Sprite;
for(i=0 ; i < spriteCount ; i++)
{
tempSprite = new Sprite();
tempSprite.name = "index" + i.toString();
holderSprite.addChild(tempSprite);
}
for(i = 0 ; i < holderSprite.numChildren ; i++)
{
trace(holderSprite.getChildAt(i).name);
holderSprite.removeChildAt(i);
}
trace("Oeps! Ik heb nog " + holderSprite.numChildren + " children :P");
while(holderSprite.numChildren > 0)
{
holderSprite.removeChildAt(0);
}
trace("Zo! Ik heb nu " + holderSprite.numChildren + " children");
//EDIT:
.... Misschien volgende keer toch wat eerder gaan slapen ;) ....
Ach ja, mag hopen dat jij ook een korte nacht hebt gehad voordat je dit poste ;)
jaspermuts
%Europe/Berlin %021 %2010, 01:31
@BernardV
for(i = 0 ; i < holderSprite.numChildren ; i++)
{
trace(holderSprite.getChildAt(i).name);
holderSprite.removeChildAt(i);
}
werkt uiteraard niet, door de uitleg die jij gaf.. Maar das ook niet wat hier gedaan werd: de code hier telt af, ipv op en dat maakt veel uit, want met deze code verwijder je altijd op numChildren - 1, en da's altijd een bestaande index, zolang i >= 0.
// Voeg toe
var holder:Sprite = new Sprite();
for(var i:uint = 0; i < 10; i++)
{
holder.addChild(new Sprite());
}
trace('Num:'+holder.numChildren);
// Verwijder
i = holder.numChildren;
while(i--)
{
trace(holder.removeChildAt(i), i);
}
trace('Num:'+holder.numChildren);
Output:
Num:10
[object Sprite] 9
[object Sprite] 8
[object Sprite] 7
[object Sprite] 6
[object Sprite] 5
[object Sprite] 4
[object Sprite] 3
[object Sprite] 2
[object Sprite] 1
[object Sprite] 0
Num:0
(en ja ik slaap laat, maar ik heb deze code wel getest!)
Overigens ga ik normaal wel het liefst voor jouw manier, maar vond dat het gezegd moest worden :D
Salvago
%Europe/Berlin %378 %2010, 10:05
Haha, het is wel grappig hoe je twee keer over hetzelfde heen kunt lezen. Zoals Jasper nog eens toelicht, de counter telt af (en begint ook op numChildren, ipv op 0), dus het werkt prima ;)
En voor de anderen: Zo zie je meteen waarom je het liefst niet die notatie (van Yonivh) moet gebruiken, maar die van BernardV. Deze korte discussie is het directe gevolg van de 'onduidelijkheid' van die code. Hij is 'moeilijker te lezen', iets wat je zo veel mogelijk wilt vermijden in je code.
BernardV
%Europe/Berlin %437 %2010, 11:29
Dat de code aftelt had ik gezien voor mijn tweede post. Niet bij de eerste ;)
Dacht even dat je bedoelde met "Het klopt niet wat je zegt" dat de tekst niet klopte ipv "de aftellende counter"
e.l.dam
%Europe/Berlin %459 %2010, 12:01
Ik snap jullie niet
private function removeChildren (holder):void {
var i:int = holder.numChildren;
while( i -- ) {
holder.removeChildAt( i );
}
}
doet toch gewoon
holder.removeChildAt(4);
holder.removeChildAt(3);
holder.removeChildAt(2);
holder.removeChildAt(1);
holder.removeChildAt(0);
?
of ben ik nu gaar?
BernardV
%Europe/Berlin %487 %2010, 12:41
Nee, je bent niet gaar... Dat klopt.
jaspermuts
%Europe/Berlin %499 %2010, 12:58
Ja, was mijn punt juist, Bernard zei dat dat niet werkte, maar ik heb het idee dat hij nu probeert te zeggen dat hij eral op was teruggekomen voor zn 2e punt.. maar dat kan ik er eigenlijk niet in zien :P
Rare Hoogeveners ook altijd, niewaar e.l.dam ?:P
BernardV
%Europe/Berlin %507 %2010, 13:10
@jaspermuts
Nee, dat wil ik niet zeggen.
Ik reageerde met mijn tweede post op de reactie van salvago met "Het klopt niet wat je zegt" ik dacht dus dat hij doelde op mijn uitleg waarom een optellende counter niet zou werken.
Toen ik de eerste post plaatste had ik het inderdaad over het hoofd gezien dat het een aftellende counter was.
Salvago
%Europe/Berlin %515 %2010, 13:22
Ik blijf het een beetje een rare aanname vinden, maar ach, dingen gebeuren. :P
BernardV
%Europe/Berlin %517 %2010, 13:24
Ach ja... misverstand...
Salvago
%Europe/Berlin %530 %2010, 13:43
Kan gebeuren hè :D
Wat zou er trouwens met de problemen van de OP gebeurd zijn? :P
Yonivh
%Europe/Berlin %552 %2010, 14:15
Wat een drukte hier. ;)
Ik ben er nog niet aan toe gekomen. Hij ligt wel hoog op de stapel. Ik gok dat het puur om het stoppen van het geluid gaat. Zodra ik ermee aan de gang ben gegaan laat ik het weten.
EDIT: Het is opgelost. Ik verwijder nu het geluid met:
SoundMixer.stopAll();
Werkt prima, bedankt iedereen!
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.