PDA

Volledige versie bekijken : movieclip reference


alonsomoseley
%Europe/Berlin %518 %2005, 13:26
Ik heb in mijn movie 8 movieclips met instance name button_01 t/m button_08.

hoe kan ik met actionscript een reference maken naar deze buttons?
zoiets als:
for (lev1 = 0; lev1 < 8; lev1++)
{
var ref=attach("button_0"+lev1);
}

kan zoiets [?]

theFlashWizard
%Europe/Berlin %561 %2005, 14:28
attach is voor het ophalern uit de library..

maar stel je wilt 3 buttons (button1,button2,button3) laten afspelen dmv play:
for(i=1;i<=3;i++){
var mc = this["button"+i]
mc.play()
}

alonsomoseley
%Europe/Berlin %772 %2005, 19:33
Hoi Flash Wizard,

bedankt voor je antwoord.
Het werkt helaas nog niet.
ik heb deze code
-------------
var bname="button_0"+counter;
var button=this[bname];
button.caption.text=level1.childNodes[lev1].attributes[attr];
---------------

maar dit werkt niet. Terwijl de volgende regel wel werkt:
button_01.caption.text=level1.childNodes[lev1].attributes[attr];

vreemd he! :-)

sfsd
%Europe/Berlin %881 %2005, 22:09
var button=this[bname];
Wat wil je hiermee bereiken?
het lijkt me dat in bovenstaand script

button_01.caption.text=level1.childNodes[lev1].attributes[attr];
hetzelfde is als
bname.caption.text=level1.childNodes[lev1].attributes[attr];

this[bname] is een referentie naar het object bname in de huidige movieclip, volgens mij moet je dat iets anders noteren, het is in ieder geval niet de simpelste manier om deze waarde te achterhalen. button=bname is wel simpeler toch.

Of begrijp ik het niet goed?

Om een referentie naar de buttons te maken kan je ook eval gebruiken.
Bijvoorbeeld:
var buttonText=new String("button"+lev1);
button=eval(buttonText);
als het goed is refereert button dan naar de juiste button. [als het script op hetzelfde niveau als de button staat. dus bijvoorbeeld in de _root]

alonsomoseley
%Europe/Berlin %373 %2005, 09:58
"eval" was precies wat ik zocht!
daarmee kan ik dynamisch verwijzen naar elementen op mijn tijdlijn.
Bedankt voor jullie hulp!

theFlashWizard
%Europe/Berlin %540 %2005, 13:58
eval("string"+var)
is bijna altijd gelijk aan
this["string"+var]
en dat laatste is nieuwer en dus vaak beter

alonsomoseley
%Europe/Berlin %550 %2005, 14:13
ik gebruik nu ook this[].
Ik was vergeten om mijn movieclip te "definen". Dat was denk ik het probleem.
Ik ben nieuw in actionscript en vind het niet altijd even handig werken.
Ik ben c# developer en maak al snel aannames dat het hier hetzelfde werkt als in c#.

Maar het is wel erg leuk!

theFlashWizard
%Europe/Berlin %559 %2005, 14:25
instancename vergeten?
aha.. dan kan je zeker wel scripten.. :)
actionscript is zekers veel leuker.. hier kun je visueel veel meer / makkelijker leuke dingen mee doen.. :)

alonsomoseley
%Europe/Berlin %569 %2005, 14:39
Het gaat helaas maar langzaam voor mij :-)
Ik heb eigenlijk wat hulp nodig met dit projectje. Is het gebruikelijk om hier een zipje te plaatsen met een project zodat anderen er naar kunnen kijken? Of via een PM ofzo?

theFlashWizard
%Europe/Berlin %571 %2005, 14:42
eigenlijk is het gebruikelijk te melden waar je niet uitkomten je daarbij aangeeft wat je al geprobeert hebt met script en soms (liefst een kleine) fla. Wat het beste is als je het geen waar je niet uikomt eerst in het klein te proberen.. dan heb je zelf meer overzicht en dan zien wij sneller ook de fout omdat we niet een hele fla moeten doorzoeken.

alonsomoseley
%Europe/Berlin %582 %2005, 14:58
Aha! nou, door jullie hulp ben ik al een stuk verder en heb nu een gericht probleem.
Ik laat even de code zien:
_XML=new XML();
_XML.ignoreWhite = true;
_XML.onLoad = function()
{
var root = this.firstChild;
if (root.hasChildNodes())
{
for(var i=0;i<root.childNodes.length;i++)
{
var currentnode=root.childNodes[i];
var menutitemname=currentnode.attributes.naam;
button=eval("button_0"+i);
button.caption.text=menutitemname
button.id=i;
button.xmlchilds=currentnode.childNodes;
button.onRollOver = function()
{
ShowSubMenu(this.xmlchilds,this._x,this._y,this.i) ;
}
}
}
}
_XML.load('baimenu.xml');

function ShowSubMenu(xmlnodes,xpos,ypos,parentid)
{
for(var i=0;i<xmlnodes.length;i++)
{
var xmlnode=xmlnodes[i];
var menutitemcaption=xmlnode.attributes.naam;
newmenuitemname="SubMenuItem" + parentid + "-" + i;
var mcMenu:MovieClip = this.attachMovie("SubMenuItem", newmenuitemname, parentid*10+i);
mcMenu._x = xpos+108;
mcMenu._y = ypos-25 + i * 34;
this[newmenuitemname].id=(parentid*10)+i;
this[newmenuitemname].caption.text = menutitemcaption;
}
}


en de XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<menu>
<menuitem naam="Nieuws" id="1">
<menuitem naam="nieuws levelaa" />
<menuitem naam="nieuws levelab" />
<menuitem naam="nieuws levelac" />
</menuitem>
<menuitem naam="Organisatie" id="2">
<menuitem naam="nieuws levelba" />
<menuitem naam="nieuws levelbb" />
</menuitem>
<menuitem naam="Ontdek" id="3" />
<menuitem naam="Flatgebouw" id="4" />
<menuitem naam="Activiteiten" id="5" />
<menuitem naam="Links" id="6" />
<menuitem naam="Bos" id="7">
<menuitem naam="nieuws levelca" />
<menuitem naam="nieuws levelcb" />
</menuitem>
<menuitem naam="Archief" id="8" />
</menu>

Het probleem is nu dat ik van alle subitems elke keer alleen de laatste zie.

http://www.knockananna.com/download/subitems.gif

enig idee hoe dat komt?

theFlashWizard
%Europe/Berlin %591 %2005, 15:11
ik moet toegeven dat ik het niet zosnel zie in al het script maar je kan zelf vaak al heel ver komen door vars te tracen.. ( trace(var) )
als je een var traced krijg je de waarde tijdens het afspelen van de movie in je output venster..
krijg je nou undifened dan weet je dat hij de var onder die naam of op die plek of op dat moment nog niet vind..
en moet je een stapje terug gaan totdat je de var wel krijgt.. zo kun je zo'n btje alles checken. en loop je vanzelf tegen het probleem aan :)

je kan bijv kijken of xmlnodes.length wel klopt:

trace(xmlnodes.length)

alonsomoseley
%Europe/Berlin %594 %2005, 15:16
Ik ben erachter!

button.id=i;
button.xmlchilds=currentnode.childNodes;
button.onRollOver = function()
{
ShowSubMenu(this.xmlchilds,this._x,this._y,this.i) ;

ik geef this.i mee, het moet this.id zijn.

Het werkt nu ook allemaal.
Het enige dat ik nu nog moet doen is iets maken wat het submenu laat verdwijnen bij een rollout. Ik vermoed dat ik movieclips ook wel weer kan removen :)

theFlashWizard
%Europe/Berlin %596 %2005, 15:18
mooi :)
tracen gaat nog wel vaker van pas komen ;) (als je die gebruikt hebt)
removeMovieClip() ;)
check flash help voor meer uitleg

alonsomoseley
%Europe/Berlin %613 %2005, 15:43
ik trace me suf :)
maar ff zonder gein, ik zou willen dat flash een compiler en debugger aan boord had die dit soort dingen eruit kan filteren voordat je het project kunt starten.

bedankt voor je hulp! Ik moet nog meer doen voor dit project en hoop dat je me nog verder kan helpen met een container (met scrollbars) die text labels gaat bevatten. Die container moet verticaal kunnen groeien als de labels erin text bevatten die groter is dan de schermhoogte.

maar ik zal eerst ff speuren of zoiets al beschreven is.

theFlashWizard
%Europe/Berlin %616 %2005, 15:48
dat heeft ie wel.. alleen niet echt n super goede..
maar hoe kan een computer weten welke var namen niet overeen komen?
alleen de maker weet welke welke hoort te zijn..

wel kan je dingen strict aangeven:
var mcMenu:MovieClip
dan geeft hij een foutmelding wanneer het geen MovieClip is bijv.. zo kan dat met bijna alle soorten objecten..

je bedoelt denk ik een scrollpane..
maar die kan je alleen aant begin n vulling geven.. en dus niet meer naderhand dingen aan toevoegen..

alonsomoseley
%Europe/Berlin %624 %2005, 15:59
Ik had al ff lopen stoeien met die scrollpane maar ik snap niet hoe je daar een label "in" kan gooien.

Wat ik wil is een scrollpane waar op een vaste plaats een titel, plaatje en bodytext imkomt. En als de bodytext groter wordt, heb ik scrollbarrs nodig.

theFlashWizard
%Europe/Berlin %626 %2005, 16:02
hmm hetgeen dat je dan wil scrollen is niet alleen text dan? want dan zou je natuurlijk genoeg hebbe aan n gewone scrollbar