PDA

Volledige versie bekijken : removeMovieClip() probleem.


meagain
%Europe/Berlin %473 %2005, 12:22
Er is me iets onduidelijk ivm de methode removeMovieClip(). De vele gelijkaardige threads helpen me ook al niet verder.

Ik heb een window_mc (movieclip) in mijn library. Klik je op de close_btn wordt er een functie op de _root aangeroepen:

function deleteMovieClip(t_mc:MovieClip){
//Heb hier al vanalles geprobeerd
_root.tmp1_mc.removeMovieClip();
}

De window wordt op de root aangemaakt als volgt:

show2_btn.onPress = function()
{
this._parent.createEmptyMovieClip("tmp1_mc", this._parent.getNextHighestDepth());
tmp1_mc.attachMovie("window_mc", "alert_mc", temp_mc.getNextHighestDepth());
}

En wanneer er op de close_btn vd net aangemaakte mc wordt geklikt:

close_btn.onPress = function()
{
_root.deleteMovieClip(this._parent);
}

Doe je het op deze manier, dan verwijder je alert_mc. De bedoeling is echter dat tmp1_mc wordt ge-delete ( _root.deleteMovieClip(this._parent._parent); ), maar dit lukt me op geen enkele manier ???

Waar zit ik fout ????

The_One
%Europe/Berlin %929 %2005, 23:18
Zou je ff je FLA kunnen passen, want het is nu een beetje gokken hoe je lagen in elkaar zitten. :)
[dus welke MC waar inzit :)]

meagain
%Europe/Berlin %848 %2005, 21:21
Zeker wil ik dat!

Dank je voor je reactie.

Het ziet er waarschijnlijk allemaal wat rommelig uit, maar probeer flash een beetje te begrijpen.

Je kan dus wel een window laten 'popuppen', slepen en sluiten, maar bij dat 'close'n blijft altijd nog een object hangen. Ik kan alleen maar de alert_mc verwijderen maar niet tmp_mc of temp1_mc.
Check maar even met "Toon objecten".

Dauntless
%Europe/Berlin %919 %2005, 23:04
Waarom niet gewoon:

close_btn.onPress = function()
{
this._parent.removeMovieClip();
}

? Of wil je echt die functie gebruiken?

(Zet ook een vierkantje op de hitframe van je sluit button... Nu moet je nogal goed mikken om juist te klikken ;) ).

meagain
%Europe/Berlin %457 %2005, 11:58
Ik maak dus een popup aan met:

this._parent.createEmptyMovieClip( "tmp1_mc", this._parent.getNextHighestDepth() );

Hier in toon ik een mc met:

tmp1_mc.attachMovie( "window_mc", "alert_mc", temp_mc.getNextHighestDepth() );

Wanneer ik nu op de close_btn vd popup druk wil ik dat tmp1_mc wordt gedeleted. Dat wil niet lukken. Alleen alert_mc kan worden removed.

Daar zit ik vast: Hoe verwijder ik een mc die aangemaakt werd met createEmptyMovieClip ??

theFlashWizard
%Europe/Berlin %862 %2005, 21:42
this._parent.createEmptyMovieClip( "tmp1_mc", this._parent.getNextHighestDepth() );
zet daar is onder:
this._parent.removeMovieClip();

wordt hij dan wel verwijdert?
(gewoon als test ff dit..)

en alle movieclips verwijder je gewoon met removeMovieClip..

The_One
%Europe/Berlin %919 %2005, 23:04
ik snap het echt niet!

Ik heb alles geprobeerd; met een interval, delete, removeMovieClip, paden veranderd, _level0
Maar niks helpt! Ik kan ook alleen _level0.tmp1_mc.alert_mc verwijderen :s

Mss dat iemand kan helpen, profs? Ik ben ook erg nieuwsgierig nu :)

syllaz
%Europe/Berlin %447 %2005, 11:44
Dit is waarschijnlijk een bug in flash. Dynamisch aangemaakte MC's kun je alleen removen als je ze eerst van depth wisselt.

dus zo:


myMC.swapDepths(10000);
myMC.removeMovieClip();


Zou moeten werken :)

mateo)
%Europe/Berlin %132 %2005, 04:11
dit is wel grappig. je code werkt gewoon. alleen ben je vergeten om een hit area in je close_window button te zetten, zodat je precies op het kruisje moet klikken. zet gewoon een vierkantje ter grootte van je button in het hit frame en alles werkt zoals het moet.

The_One
%Europe/Berlin %601 %2005, 15:25
Nope, alleen _level0.tmp1_mc.alert_mc wordt verwijderd.
meagain wil _level0.tmp1_mc verwijderd hebben...

meagain
%Europe/Berlin %803 %2005, 20:16
Inderdaad, Syllaz' tip verhelpt het probleem.
Met dank!

@Mateo

Je hebt alleen de indruk het window of de popup werd ge-delete-d, maar het was de movie die in de movieclip werd ge-attach-ed die verdween. De close_btn was inderdaad slecht gemaakt.

Ben
%Europe/Berlin %897 %2005, 22:31
Heeft te maken met de getNextHighestDepth. Als je die gebruikt om een mc te attachen krijgt hij depth boven 100000 (oid) en daardoor kan removeMovieClip etc. er niets meer mee. Is onderkend door MM dacht ik ergens een keer... alleen nooit opgelost :)

SaphuA
%Europe/Berlin %325 %2005, 08:49
Waarom maak je niet gewoon een variable 'd' waarvoor je elke x de depth gebruikt? En elke keer als je een window attached, doe je er 1 bovenop.

En nog een klein dingetje, waarom gebruik je this._parent op een button, als je gewoon _root kunt gebruiken? Ik raad je aan om het gebruik van _parent te minimalizeren, omdat je vaak na een week vergeet naar welke MC het ookalweer linkte en dan moet je dat weer helemaal uit gaan zoeken. Maar als je vanuit de _root werkt is het veel makkelijker terug te vinden.

~Sph

Ben
%Europe/Berlin %337 %2005, 09:06
Waarom maak je niet gewoon een variable 'd' waarvoor je elke x de depth gebruikt? En elke keer als je een window attached, doe je er 1 bovenop.

En nog een klein dingetje, waarom gebruik je this._parent op een button, als je gewoon _root kunt gebruiken? Ik raad je aan om het gebruik van _parent te minimalizeren, omdat je vaak na een week vergeet naar welke MC het ookalweer linkte en dan moet je dat weer helemaal uit gaan zoeken. Maar als je vanuit de _root werkt is het veel makkelijker terug te vinden.

~Sph

Euh sorry, maar hier moet ik even op reageren. Ben het nl. met bijna elk ding wat je hier zegt oneens.

- Gebruik van een variabele x voor een depth is naar mijn idee handig als je 100 clips wilt attachen. Maar als je 1 clip wilt attachen in een omgeving waar je verder (je = te attachen movie) niet veel info over kan verwachten, is getNextHighestDepth naar mijn idee altijd beter. Als je je druk maakt over de snelheid, kun je ten minste de depth counter laten starten op getNextHighestDepth. Geen last meer van spontaan overschreven mc's dan.

- Gebruik ALTIJD _parent als het kan in plaats van _root. Sterker nog... gebruik NOOIT _root tenzij het niet anders lukt. Eenmaal _root referenties opgenomen in je code betekent dat je nooit meer de posities van een mc kunt veranderen en/of gebruiken in een andersoortig mc. Hoewel hij niet zo hard NEE tegen _root zegt, kun je lezen wat Grant Skinner bijv. over het gebruik van _root zegtzegt (http://www.gskinner.com/blog/archives/2005/03/to__root_or_not.html) .

SaphuA
%Europe/Berlin %648 %2005, 16:34
Ben,
Aangezien het niet duidelijk was of meagain bij deze 2 windows blijft (wat mij lijkt van niet) leek het mij een logischere gedachte om het mogenlijk te maken meer windows toe te passen. getNextHighestDepth is crappy/buggy en wordt vrij weinig gebruikt, en daarom is een variable een betere optie.

In een klein project als deze maakt het niet uit of je _root gebruikt, het maakt de code zelfs een stuk overzichtelijker. Ik heb het document waar je naar linkt doorgelezen, en alle van de aangewezen punten zijn niet van toepassing in het huidige werk van meagain. Het is toch veel fijner om _root.var te gebruiken ipv this._parent.var?

Ben
%Europe/Berlin %668 %2005, 17:02
Ik snap je punt, en heb er ook geen bezwaar tegen oid :). Waar ik het niet mee eens ben is het feit dat er shortcuts aan een gebruiker wordt voorgelegd, die de achterliggende gedachte erachter (misschien) niet begrijpt. Op die manier worden de verkeerde dingen aangeleerd. Je kunt beter in het begin teveel op een te uitgebreide manier doen, waardoor je weet hoe het wel moet en daarna wat shortcuts/tweaks uitvoeren. Dan enkel de tweaks leren en niet weten wat ze zouden moeten tweaken.

Dit bovenstaande is dan mbt de getNextHighestDepth. _Root ben ik (sorry) toch wat stelliger in. Hoewel de goeroe's zeggen dat _root heel soms zijn nut heeft (en ik het zelf ook wel eens gebruik hoor daar niet van), blijf ik erbij dat het gewoon 'good practice' om "_root is evil" als uitgangspunt te nemen. Door _root te gebruiken, leg je met een simpel woordje code al gelijk zoveel beperkingen op je swf op voor mogelijk gebruik in de toekomst..... en _parent typt toch net zo makkelijk als _root? Ik zou dan liever zeggen, zorg ervoor dat je je swf zo opbouwt dat dingen vanzelf altijd terug zijn te vinden met pointers ipv direct maar voor _root kiezen.

My 2 cents.

SaphuA
%Europe/Berlin %676 %2005, 17:13
Aight aight heb je ook wel gelijk in :)
Ben een games-coder, die denken wat eenvoudiger ;)

meagain
%Europe/Berlin %764 %2005, 19:20
@Saphua & Ben:

Dank voor jullie leerzame discussie.

Ik ben, wat flash betreft, nog steeds lerende. De bedoeling is een class te maken die bijhoudt welke window(s) 'open' staan, welke de focus heeft, welke 'uitgeklapt' is, moeten ze 'modal' verschijnen, etc...

Over dat 'modal' verschijnen; ik heb geen functie binnen flash gevonden die een movie en al zijn componenten disabled. Heb het nu zo opgelost dat bij het openen v/e modal window vanaf de _root ( :I ) alle componenten 'disabled' worden en na het sluiten opnieuw 'enabled'. Persoonlijk vind ik het een slechte manier, maar vrees dat er niets anders opzit ???

SaphuA
%Europe/Berlin %795 %2005, 20:06
Probeer je zoiets al dit te maken?

Mijn toekomstige site (Note: Alles copyrighted! :D)

meagain
%Europe/Berlin %813 %2005, 20:31
Inderdaad, maar dan ook met de mogelijkheid de windows te sluiten/openen, Een modal opgeroepen window moet een waarde teruggeven aan de applicatie, etc...

Mooi gedaan!

ps Eender waar je in de window klikt krijgt ze de 'voorgrond'. Hoe doe je dat??

SaphuA
%Europe/Berlin %837 %2005, 21:05
Haha Belgisch is zo'n grappige taal :D

Anywayz, mijn versie verschilt niet veel van wat jij wilt. Alleen bij jou kun je de windows verwijderen.

Dan zijn er twee dingen waar je aan moet denken;
Heb je altijd een vast aantal windows beschikbaar? (Bijv. 4 knoppen en voor elke knop 1 window) of is dat verschillend? (4 knoppen die allen altijd windows blijven openen)

Als het eerste het geval is kun je het op mijn manier doen, dan krijgt elk window een aparte naam ed. en in plaats van het verwijderen zet je ze gewoon op ontzichtbaar, veel eenvoudiger dat het verwijderen ervan.
Dan gaat het veranderen van de depths als volgt;

function swapDepth() {
for (var i = 1; i<Count+1; i++) {
if (i>this.getDepth()) {
this.swapDepths(i);
}
}
}

Hierbij loopt de code door all windows heen (1 t/m count), en waneer een window boven het huidige window zit; swapt hij zijn depths. Hierdoor wordt alles wat een hogere depth heeft dan de huidige window netjes een plaatsje naar beneden verschoven zodat het huidige window naar boven kan.

Als je voor de 2e manier gaat (windows worden altijd geattaached per druk op een knop), dan wordt het wat lastiger. Je moet dan namenlijk bijhouden welke windows er allemaal nog zijn. Het probleem is dat de verschillende die je dan krijgt in namen en depths omdat je de 'middelste' windows kan removen. Dan krijg je bijv;
window1 (depth1), window9 (depth9), window16 (depth16), window135 (depth135)

Dauntless
%Europe/Berlin %845 %2005, 21:17
Haha Belgisch is zo'n grappige taal :D
Belgisch is geen taal...

En in principe kan je hem ook gewoon switchen met swapDepths(count); (in het voorbeeld van SaphuA)... Het enige verschil is dat ze van plaats switchen ipv allemaal 1 naar achter gaan en de laatste eerst komt...

SaphuA
%Europe/Berlin %852 %2005, 21:28
Belgisch is geen taal...
Ohja vergeet ik steeds...

Vlaams is zo'n grappige taal :D

meagain
%Europe/Berlin %656 %2005, 16:45
Wat is er nou zo grappig aan mijn Vlaams ??
:mad:
;)