03. maj 2006 - 11:35Der er
35 kommentarer og 1 løsning
Arrays igen
Hej
Jeg har et array (indenfor), som indeholder navnene på de af mine klip som er blevet brugt. Jeg vil gerne registrere disse klips _x, så jeg til sidst kan overføre klippenes egenskaber i korrekt rækkefølge fra venstre til nogle nummererede dyn. tekstfelter. Hvordan kan jeg gøre det?
Sådan tilføjer og fjerner jeg i mine nuværende arrays:
function fjern(arraynavn, vaerdi) { //fjern værdi hvis den findes i array var i; for (i=0; i<arraynavn.length; i++) { if (arraynavn[i] == vaerdi) { arraynavn.splice(i, 1); } } } function tilfoej(arraynavn, vaerdi) { //Tilføj værdi hvis den ikke findes i array fjern(arraynavn, vaerdi); arraynavn.push(vaerdi); arraynavn.sort(); }
Jo, det tror jeg også, for det skal bruges på et print af det som brugeren har lavet, så det vil være fint om sorteringen kan foregå når man trykker på "Udskriv".
Men hvordan gør jeg det? De klip, som er i indenfor har nogle egenskaber, som skal listes i en rækkefølge, så det klip der ligger længst til venstre bliver til mc1 osv osv. og dets egenskaber skal overføres til et dyn. tekstfelt. Undskyld gentagelserne, men er ikke sikker på at jeg kan forklare mig godt nok:)
Well, så opretter du bare et array af objekter, bruger Array.sortOn (kig i manualen) og sorterer arrayet efter den egenskab, du ønsker. Så kan du efterfølgende løbe det igennem og hente teksterne i den rigtige rækkefølge.
Altså, jeg kigger efter hvilke klip, der er i mit indenfor-array, og aflæser alle _x positionerne, og... ja... hvad så? Putter dem i et nyt array? Sorterer dem efter den laveste værdi? Og hvordan ved jeg så hvilke værdier der passer sammen i det nye array og mit indenfor-array? Altså hvilket klip indeholder oplysningerne om de egenskaber som klippet på et_eller_andet._x ?
Lav et nyt array af objekterne med egenskaber, sorter det, udskriv dem:
var objekter = new Array(); var o, m; for (i = 0; i < indenfor.length; i++) { m = _root["mc_"+indenfor[i]); // movieclip som indenfor[i] peger på o = new Object(); // objekt med data om m o.x = m._x; o.label = m.et_tekstfelt.text; objekter.push(o); } // nu har vi et array af objekter med x og label objekter.sortOn("x", Array.NUMERIC); // nu er de sorteret efter stigende x-egenskab for (i = 0; i < objekter.length; i++) { trace("første objekt er på x="+objekter[i].x+" og har teksten: "+objekter[i].label); }
Jeg bøvler lidt... Hvis de oplysninger jeg skal have gemt om hvert objekt skal hentes i variabler i roden (var ctStr_mc1 = 0.01;), skal jeg så skrive f.eks.: o.str = _root["ctStr_"+m];
Og hvordan når jeg så skal have skrevet denne værdi i et tekstfelt på min udskrift... har jeg ikke helt fattet endnu... kan jeg så linke til o.str i mit variabel-felt i tekstfelts-properties?
Det virker ikke rigtigt... den når aldrig frem til trace:
function optaelMc(){ var objekter = new Array(); var o, m; for (i = 0; i < indenfor.length; i++) { m = _root["mc"+indenfor[i]]; // movieclip som indenfor[i] peger på o = new Object(); // objekt med data om m o.x = m._x; o.label = m.et_tekstfelt.text; //o.str = _root["ctStr_"+m]; objekter.push(o); } // nu har vi et array af objekter med x og label objekter.sortOn("x", Array.NUMERIC); // nu er de sorteret efter stigende x-egenskab for (i = 0; i < objekter.length; i++) { trace("første objekt er på x="+objekter[i].x+" og har teksten: "+objekter[i].label); } }
Nej, du skal aldrig bruge variabel-feltet på tekstfelter. Aldrig. Altid instancenavn. Hvis du så vil have overført variablerne til tekstfelter, så gør du det i den sidste løkke.
Men ja, metoden til at hente er god nok - dog peger "m" på et movieclip, så det giver ikke rigtig mening - brug "i" i stedet.
Det er for rodet med alt det bytten ud af instancenavne og variabler hver gang jeg skal lægge en kommentar her - der sker bare fejl. Her er scriptet som jeg forsøger at få til at fungere, men det virker som sagt ikke, for jeg kan ikke trace: var ctStr_brill1 = 0.01;
function optaelBrill(){ var objekter = new Array(); var o, m; for (i = 0; i < indenfor.length; i++) { m = _root["brill"+indenfor[i]]; // movieclip som indenfor[i] peger på o = new Object(); // objekt med data om m o.x = m._x; //o.label = m.et_tekstfelt.text; o.str = _root["ctStr_"+[i]]; objekter.push(o); } // nu har vi et array af objekter med x og label objekter.sortOn("x", Array.NUMERIC); // nu er de sorteret efter stigende x-egenskab for (i = 0; i < objekter.length; i++) { trace("første objekt er på x="+objekter[i].x+" og har teksten: "+objekter[i].str); } }
[i] ser lidt mærkeligt ud - et array med i som eneste element? Okay, det vil virke, da toString heraf bare vil give "i", men det er lidt fjollet. Og du skal jo nok endda hente den i indenfor. :)
Lad os indsætte lidt traces:
function optaelBrill(){ var objekter = new Array(); var o, m; for (i = 0; i < indenfor.length; i++) { m = _root["brill"+indenfor[i]]; // movieclip som indenfor[i] peger på o = new Object(); // objekt med data om m o.x = m._x; //o.label = m.et_tekstfelt.text; o.str = _root["ctStr_"+indenfor[i]]; trace("Jeg har fundet "+indenfor[i]+" ("+m+") og teksten "+_root["ctStr_"+indenfor[i]]); objekter.push(o); } // nu har vi et array af objekter med x og label objekter.sortOn("x", Array.NUMERIC); trace("antal fundne er "+objekter.length); // nu er de sorteret efter stigende x-egenskab for (i = 0; i < objekter.length; i++) { trace("første objekt er på x="+objekter[i].x+" og har teksten: "+objekter[i].str); } }
Det var Omit trace action der var slået til... Her er output af dine traces efter jeg har placeret 2 mc'er i indenfor:
Jeg har fundet 1 (_level0.brill1) og teksten undefined Jeg har fundet 2 (_level0.brill2) og teksten undefined antal fundne er 2 første objekt er på x=233 og har teksten: undefined første objekt er på x=290 og har teksten: undefined
Ja, men det gør de nu, altså værdierne ligger i mine variabler, som hedder ctStr_brill1 = 0.01; osv. Hvis jeg tracer variablen efter ændring af en værdi, så går det godt nok.
Håber du fangede konceptet i et array af objekter og brugen heraf. Det er ganske anvendeligt. Og muligvis kan du få noget ud af at investere i http://globe.dk/?action=detail&vare=FG227-7 :)
Ahhh... fornuftigt at snige lidt reklame for din udmærkede bog ind her :) Jeg er sikker på den er alle pengene værd. Jo, jeg fattede konceptet, som er rigtigt smart, og håber jeg er i stand til at huske principperne til næste gang jeg skal bruge noget lignende. Mangler nu kun at få mine værdier udskrevet i de dyn. tekstfelter. Det skulle gøres i den sidste løkke?
Øv jeg har stadig problemer... Når jeg forsøger at trace flg.: o.str = _root["ctStr_brill"+indenfor[i]]; o.farve = _root["farve_brill"+indenfor[i]]; trace(indenfor[i]+". brill. fra venstre er en: "+objekter[i].str+" "+objekter[i].farve); så får jeg bare: 1. brill. fra venstre er: undefined undefined
Og det havde jeg så ikke alligevel :) Nu gentager den bare den længst til venstre ligeså mange gange som den finder noget i indenfor. Hvis jeg smider min trace i den første løkke, så får jeg jo ikke sorteret efter x. Og hvis jeg putter den i den anden løkke, så bliver der ikke talt op.
Sådan, nu funger det efter hensigten: for (i=0; i<objekter.length; i++) { trace(indenfor[i]+". brill. fra venstre er en: "+objekter[i].str+", "+objekter[i].farve); trace(indenfor[i]+". brill. er på x ="+objekter[i].x); _root.dyn_ct_txt.text = _root.dyn_ct_txt.text+(indenfor[i]+". brill. fra venstre er: "+objekter[i].str+", "+objekter[i].farve+" ");
Det eneste jeg kan finde på at spørge om nu er: Kan man indsætte et linjeskift i et dyn. tekstfelt?
indenfor[i] peger absolut ikke på det samme element, som objekter[i] - de to arrays er helt uafhængige, da det ene jo er sorteret og det andet ikke er. Så ovenstående er noget rod. Hvis du vil have nummeret med, skal det tilføjes til objekter.
Men ja, du kan indsætte et linjeskift med \n eller newline:
function optaelBrill(){ var objekter = new Array(); var o, m; for (i = 0; i < indenfor.length; i++) { m = _root["brill"+indenfor[i]]; // movieclip som indenfor[i] peger på o = new Object(); // objekt med data om m o.x = m._x; o.nummer = indenfor[i]; o.str = _root["ctStr_"+indenfor[i]]; o.farve = <<hvor du nu henter farven>>; objekter.push(o); } // nu har vi et array af objekter med x og label objekter.sortOn("x", Array.NUMERIC); trace("antal fundne er "+objekter.length); // nu er de sorteret efter stigende x-egenskab for (i = 0; i < objekter.length; i++) { _root.dyn_ct_txt.text = objekter[i].nummer+". brill. fra venstre er: "+objekter[i].str+", "+objekter[i].farve+"\n"; } }
Hmmm... det kan jeg godt se, men hvis jeg bruger dit eksempel bliver output'et i det dynamiske tekstfelt: 2. brill. fra venstre er: 0.01, cognac 1. brill. fra venstre er: 0.01, WSI
Det er de rigtige egenskaber der listes set fra venstre, men der er byttet om på 1. og anden. Det virkede altså før... mener jeg....?
Det er jo fordi at klippene uanset deres tidligere nummer skal vises som stående på 1. pladsen fra venstre, 2. pladsen osv. osv. Så måske er det jo netop rigtigt ikke at sortere på det?
Ja, nemlig :) Tusind tak for al din ulejlighed. Nu tror jeg nok jeg er igennem. Tak Tak! Vil helt sikkert købe din bog :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.