Volledige versie bekijken : for (var i in this) in MovieClips
B-Mantis
%Europe/Berlin %922 %2007, 23:08
Hey mensen,
Ik wil graag alle variabelen in mijn MC bekijken:
for (var i in this) {
trace(i + ' = ' + this[i]);
}
in AS2 werkte dit altijd vrolijk en wel. Maar in AS3 lijkt het alleen met Objects te werken.
hoe kan ik dit wel effectief met MovieClips doen?
Dauntless
%Europe/Berlin %996 %2007, 00:55
Werkt hier perfect...
mc.first = "Hello";
mc.second = "World";
for (var i in mc) {
trace("mc."+i+" = "+mc[i]);
}
B-Mantis
%Europe/Berlin %050 %2007, 02:13
ok, ik zal even precies uitleggen wat ik heb (ik heb het bestand er ook bijgedaan, kun je eventueel zelf kijken) :
fla bestand met als documents class scripts.Main
in mijn scripts map staat het bestand Main.as :
package scripts {
import flash.events.Event;
import flash.display.MovieClip;
public class Main extends MovieClip {
public var var1: String = "Hello";
public var var2: int = 10;
public function Main() {
addEventListener(Event.ENTER_FRAME,enterFrame);
}
private function enterFrame(e:Event) {
for (var i in this){
trace(i);
}
}
}
}
er wordt helemaal niets getraced. De code wordt 100% zeker uitgevoerd. Een ander iets wat me niet lukt ik trouwens:
for (var i in root) {
trace(i)
}
ik vind het erg belangrijk om te kunnen zien wat er allemaal aanwezig is in mijn root. Maar ik neem aan dat het antwoord op deze vraag gelijk is aan het antwoord op de bovenstaande. Alsvast bedankt!
B-Mantis
%Europe/Berlin %462 %2007, 12:06
ok.. voor zover ik het nu begrijp krijg ik met
for (var i in this) alleen de variabelen die er tijdens het uitvoeren van het programma bijgezet zijn. Hoe kan ik alle bestaande variablelen tracen? En hoe kan ik alle movieclips/objecten/variabelen uit de root tracen?
Dauntless
%Europe/Berlin %465 %2007, 12:09
Waarom wil je dat eigenlijk juist doen? Voor te debuggen ?
En misschien krijg je wel iets los met ASSetPropFlags ?
B-Mantis
%Europe/Berlin %471 %2007, 12:19
Waarom wil je dat eigenlijk juist doen? Voor te debuggen ?
En misschien krijg je wel iets los met ASSetPropFlags ?
Inderdaag voor debuggen, ik wil namelijk weten of er geen objecten achterblijven als ik van de ene frame naar de andere ga. Ik heb namelijk een MC in een vroege frame staan zodat hij geladen wordt (en ik export in first frame kon uitzetten) maar hij blijkt, ondanks twee lege keyframes ertussen bestaan in latere frames (niet zichtbaar, maar als ik hem een trace commando geef traced hij inderdaad).
Ik heb trouwens geen idee wat ASSetPropFlags is. Ik kan het niet vinden in AS3 help
Dauntless
%Europe/Berlin %474 %2007, 12:22
Daar moet je naar googelen, het is een ongedocumenteerde functie (maar ik weet niet of hij nog bestaat in AS 3.0).
B-Mantis
%Europe/Berlin %720 %2007, 18:16
en nog een andere vraag:
Ik heb in keyframe 5 een MC staan. Die mc traced elke frame "still here"
frame 6 is leeg en frame 7 is een ander deel van mijn programma. Zodra ik in frame 7 kom blijft "still here" getraced worden. Ik moet dus die MC deleten. Ik heb echter geen idee hoe want hij is niet dynamisch gemaakt. Kunnen jullie me dit uitleggen? En is het niet heel vreemd dat die MC gewoon blijft bestaan? Betekend dit niet dat een animator die niets van AS afweet uiteindelijk zijn geheugen vol heeft staan met MC die niet eens zichtbaar zijn?
Danku!
Dauntless
%Europe/Berlin %924 %2007, 23:11
Kan je eens een voorbeeld .fla maken van de exacte situatie (inclusief AS).
Een mc die je aangemaakt hebt in de GUI kan je met AS verwijderen dmv het volgende:
myMC.swapDepths(this.getNextHighestDepth());
myMC.removeMovieClip();
B-Mantis
%Europe/Berlin %947 %2007, 23:44
oh mijn god.. serieus? Ik heb alles geprobeerd vanmiddag omdat ik dacht dat swapDepths() alleen in AS2 kon :|
Maar dit verklaart niet waarom de MC blijft bestaan als hij niet meer in de frames is. Zie bijgevoegd bestand:
in frame 1 staat een movieclip die elke frame iets traced.
in frame 2-9 is die movieclip er niet meer
in frame 10 stopt de playhead, de movieclip blijft echter tracen.
Dauntless
%Europe/Berlin %953 %2007, 23:52
Dat ligt geloof ik aan het feit dat alles nu met Event Handlers werkt. De handler blijft bestaan en je functie ook aangezien er een referentie is in de handler zelf...
Een mooie oplossing weet ik eigenlijk niet (zonder met AS de ENTER_FRAME te verwijderen)... Iemand anders misschien ?
Ps: Sorry, mijn fout, swapDepths() bestaat idd niet meer in AS3.0. Gebruik in de plaats 'setChildIndex()' of 'swapChildren()' of 'swapchildrenAt()'.
B-Mantis
%Europe/Berlin %974 %2007, 00:23
Gebruik in de plaats 'setChildIndex()' of 'swapChildren()' of 'swapchildrenAt()'.
ok. daar ben ik al even mee bezig geweest. Ik heb het vierkant 'ob1' genoemd en dit in frame 10 gezet:
trace(ob1) //return: null
trace(ob1.enterframe) //return:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at MCblijft_fla::MainTimeline/MCblijft_fla::frame10()
de return daarvan is in frame 1 : function Function() {}
volgens mij betekend dit dat ob1.enterframe ook null is. Toch? Welke reference is er nog dan?
TheDutch
%Europe/Berlin %328 %2007, 08:53
Een mooie oplossing weet ik eigenlijk niet (zonder met AS de ENTER_FRAME te verwijderen)... Iemand anders misschien ?
De garbage collection gaat pas zijn werk doen wanneer alle referenties naar het specifieke object verwijderd zijn. Dat is een feit daar kan je niet omheen :).
Dauntless
%Europe/Berlin %330 %2007, 08:55
De garbage collection gaat pas zijn werk doen wanneer alle referenties naar het specifieke object verwijderd zijn. Dat is een feit daar kan je niet omheen :).
Maar dan zou hij toch niet in andere frames mogen kijken?
TheDutch
%Europe/Berlin %331 %2007, 08:56
(maar ik weet niet of hij nog bestaat in AS 3.0).
Bestaat niet meer :).
Maar dan zou hij toch niet in andere frames mogen kijken?
Ik denk dat ik de vraag dan verkeerd begreep. Mijn veronderstelling was dat jullie het probleem hadden dat je een object niet uit het geheugen kunnen halen zonder ook het EnterFrame event te stoppen. Dit onderwerp heb ik verder ook niet gevolgd en aangezien het Flash CS3 is met timeline ga ik me er ook niet al te veel in storten, heb de timeline namelijk al eventjes geleden vaarwel gezegd toen ik Flex Builder ben gaan gebruiken :).
Ik wil graag alle variabelen in mijn MC bekijken
Ik heb even snel een klein scriptje voor je geschreven die dit perfect doet:
// Alle class informatie van de MovieClip
var classInfo:XML = flash.utils.describeType(yourMovieClip);
/// Alle class properties (read en write) van de MovieClip
var classProperties:XMLList = classInfo..accessor.(@access != "writeonly") + classInfo..variable;
// Trace de XML met class informatie van de MovieClip
trace(classInfo);
// Trace de XML List met de class properties van de MovieClip
trace(classProperties);
Wanneer je de XMLList nu parsed kan je er mee doen wat je wilt :).
Maar dan zou hij toch niet in andere frames mogen kijken?
Aangezien ik zo goed als niet meer met Flash CS3 werk en dus ook helemaal geen tijdlijn meer gebruik, weet ik weinig van AS 3 in combinatie met de tijdlijn en frames.
Ik zou er in moeten duiken om het helder te krijgen. Wellicht één dezer dagen, wanneer jullie er dan nog niet uit zijn :).
TheDutch
%Europe/Berlin %332 %2007, 08:59
Maar dan zou hij toch niet in andere frames mogen kijken?
Ik denk dat ik de vraag dan verkeerd begreep. Mijn veronderstelling was dat jullie het probleem hadden dat je een object niet uit het geheugen kunnen halen zonder ook het EnterFrame event te stoppen. Dit onderwerp heb ik verder ook niet gevolgd en aangezien het Flash CS3 is met timeline ga ik me er ook niet al te veel in storten, heb de timeline namelijk al eventjes geleden vaarwel gezegd toen ik Flex Builder ben gaan gebruiken :).
TheDutch
%Europe/Berlin %344 %2007, 09:15
Ik wil graag alle variabelen in mijn MC bekijken
Ik heb even snel een klein scriptje voor je geschreven die dit perfect doet:
// Alle class informatie van de MovieClip
var classInfo:XML = flash.utils.describeType(yourMovieClip);
/// Alle class properties (read en write) van de MovieClip
var classProperties:XMLList = classInfo..accessor.(@access != "writeonly") + classInfo..variable;
// Trace de XML met class informatie van de MovieClip
trace(classInfo);
// Trace de XML List met de class properties van de MovieClip
trace(classProperties);
Wanneer je de XMLList nu parsed kan je er mee doen wat je wilt :).
TheDutch
%Europe/Berlin %358 %2007, 09:35
Maar dan zou hij toch niet in andere frames mogen kijken?
Aangezien ik zo goed als niet meer met Flash CS3 werk en dus ook helemaal geen tijdlijn meer gebruik, weet ik weinig van AS 3 in combinatie met de tijdlijn en frames.
Ik zou er in moeten duiken om het helder te krijgen. Wellicht één dezer dagen, wanneer jullie er dan nog niet uit zijn :).
B-Mantis
%Europe/Berlin %589 %2007, 15:08
ik heb even een testje gedaan, en de uitkomst is vrij maf:
ik heb zowel de stage als het object, ob1, een enterframe function gegeven:
//stage:
function enterframe(e:Event) {
trace("stage sais: "+ob1.enterframe);
}
trace("stage sais: "+ob1.enterframe); //zodat het in frame 1 ook gebeurt
//ob1:
function enterframe(e:Event) {
trace("object sais: "+ob1.enterframe);
}
nou krijg ik output:
stage sais: function Function() {}
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at MCblijft_fla::MainTimeline/enterframe()
object sais: [object sayhi_1]
object sais: function Function() {}
//en de laatste drie worden herhaald. Dit betekend waarschijnlijk dat ob1 null is geworden, maar zijn functies niet. Hij bestaat dus nog wel, maar zijn displayobject niet meer. Echter, ik kan zijn functie niet deleten, want de stage krijgt geen toegang tot de variabelen van een null object.
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.