24. april 2006 - 11:43Der er
29 kommentarer og 1 løsning
Array, eller måske noget helt andet?
Hej
Jeg har 10 klip, som jeg skal holde styr på, så jeg ved om de er trukket inden for et bestemt område, eller udenfor.
Derfor har jeg lavet 2 arrays, hvor jeg popper og pusher tallene 1-10 afhængigt af hvor de er blevet sluppet, men det vil ikke rigtigt virke efter hensigten... Jeg får lagt kopier af tallene i samme array så der f.eks. står (1, 2, 3, 2), og jeg synes heller ikke det virker rigtigt med at få fjernet tallet fra det andet array når det bliver lagt i det ene.
Er der nogen som kan hjælpe på vej, eller evt. fortælle mig om det er en helt forkert måde at forsøge at holde styr på sådan en flok klip?
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Du kan jo ikke poppe et bestemt tal ud - pop fjerner altid det bagerste. Skal du finde et bestemt tal og fjerne det, skal du loope igennem og splice det ud.
ikke voldsomt dynamisk og du kan jo ikke bruge pop, da du stadig ikke siger, hvad det er den skal poppe. Du skal bruge splice (i, 1) for at slette 1 felt på position i.
Lav en funktion til det, som tager movieclipnummeret som argument. Så skal du ikke kopiere scriptet 10 gange på hvert movieclip.
Jeg ved godt det ikke går med pop... så splice (i, 1) skal stå i stedet for _root.indenfor.pop() ? Er et array overhovedet den rigtige løsning til den slags her? Eller kunne jeg bare bruge true/false på de enkelte klip for om de er inde eller ude?
Jeg er nok nødt til at få styr på array-metoden. Jeg skal også kunne finde ud af hvilket mc der har den laveste værdi af dem som er ude, for at sætte det på en bestemt position. Hvordan gør man det? Roder videre med funktioner til at tilføje/fjerne fra arrays.
function fjern(arraynavn, vaerdi){//fjern værdi hvis den findes i array var i; for (i = 0; i < arraynavn.lenght; i++){ if (arraynavn[i] == vaerdi); arraynavn.splice(i, vaerdi); trace("Succes fjern"); } } function tilfoej(arraynavn, vaerdi){//Tilføj værdi hvis den ikke findes i array var i; for (i = 0; i < arraynavn.lenght; i++){ if (arraynavn[i] != vaerdi); arraynavn.push(vaerdi); trace("Succes tilfoej"); } }
Hvis jeg sætter min trace udvendigt på if'en, kan jeg se at funktionskaldet virker, men det er også alt.
lenght? Det hedder length. Og du har ikke matchet dine {}. Og din tilføj virker jo ret mærkeligt - den sammenligner med hvert element, og hvis hver enkelt element ikke er magen til den nye, så tilføjer den en til. Altså, har du tre elementer og vil tilføje et fjerde, så bliver det tilføjet tre gange. Du kan jo lave din unik-tilføj ved at bruge din fjern:
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, vaerdi); } } } function tilfoej(arraynavn, vaerdi){//Tilføj værdi hvis den ikke findes i array fjern (arraynavn, vaerdi); arraynavn.push(vaerdi); }
Efter en del fumlen, virker det nu lidt. Når 3 klip trækkes ind i området sker der dette ved en trace i tilfoej:
1 indenfor 2,3 udenfor 1,2 indenfor udenfor 1,2,3 indenfor udenfor
Altså går den 1. godt, den 2. skidt, og den 3. godt. Når jeg så trækker lidt videre med dem, skiftevis inde og ude, så er det kun den 3. der viser rigtigt hele tiden. De 2 andre "ignorerer" 3'eren...?
Kaldet ser sådan ud nu: _root.fjern(_root.indenfor,1) _root.tilfoej(_root.udenfor,1) _root.trukketFraStart = false; }else{ //rammer rigtigt stopDrag(); _root.fjern(_root.udenfor,1) _root.tilfoej(_root.indenfor,1) }
Og funktionerne sådan:
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, vaerdi); } } } function tilfoej(arraynavn, vaerdi){//Tilføj værdi hvis den ikke findes i array fjern(arraynavn, vaerdi); arraynavn.push(vaerdi); trace(indenfor+" indenfor"); trace(udenfor+" udenfor"); }
Håber virkelig du gider hjælpe lidt mere - skal der flere points til?
Jeg ville nok lave det hele, så der slet ikke var noget script på dine knapper, men det hele lå på tidslinjen som:
var indenfor = new Array(); var udenfor = new Array(); function træk() { // noget script } function slip() { // noget andet script } knap1.onPress = knap2.onPress = knap3.onPress = træk; knap1.onRelease = knap2.onRelease = knap3.onRelease = slip;
Det tror jeg er lidt nemmere til at starte med og lidt mere overskueligt...
Nu har jeg fået lagt to nye træk og slip funktioner i roden, som jeg kalder fra mine mc med en vaerdi. Array problemet er uforandret, og i tilgift virker min hitTest ikke længere, fordi jeg ikke ved hvordan jeg tester om et mc har ramt et andet mc i mit indenfor-array. Så med andre ord stadig kaos.
Nu forstår jeg hvad der går galt i mine arrays, men ved ikke hvordan jeg skal løse det. Hvis udgangspunktet er 1, 2, 3 i arrayet, og jeg sender vaerdien 2 afsted til fjern, som bliver kørt for at tjekke om vaerdien findes allerede, fjerner den i bekræftende fald. tilfoej vil lægge den til i enden af arrayet. Nu står der 2, 3, 1, og splice(i, vaerdi) vil fjerne det som ligger på 2. pladsen i arrayet? Er det ikke sådan?
Uark, splice skal absolut ikke være (i, vaerdi) - det er helt forkert. Det skal være (i,1) som jeg også skrev oprindeligt (men ikke lagde mærke til, at du ændrede undervejs) :)
Ja, sådan kan man få megen tid til at gå :) Men jeg er glad for at det nu endelig virker. Tak for hjælpen, og læg et svar.
Tror du at jeg kan liste lidt mere hjælp ud af dig? Jeg har nu problemet at jeg trækker mine klip fra en bestemt start position, og der må kun være ét klip ad gangen. Dvs. at når et klip støder sammen med andre eller bliver sluppet udenfor området, så skal det hoppe tilbage på startpladsen, og hvis der allerede står et nyt klip klar dér, skal dette forsvinde. For at finde ud af hvilket klip, der var det næste i rækken, ville jeg kigge i udenfor-arrayet, men ved ikke hvordan. Start-klippets navn skal jo sammensættes af _root."streng"+næste_værdi_i_udenfor, hvis du forstår...
Du kunne jo have et array af movieclips i stedet for et array af tal - alt andet vil være det samme, hvis du bare erstatter 1, 2, 3, ... med this på alle funktionerne.
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.