Avatar billede Shasim Novice
24. april 2006 - 11:43 Der 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?
Avatar billede barklund Nybegynder
24. april 2006 - 12:01 #1
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.
Avatar billede Shasim Novice
24. april 2006 - 12:03 #2
Ja så, jamen jeg var godt klar over at der var noget jeg ikke havde fattet :)

Kan du hjælpe mig med sådan et loop?
Avatar billede Shasim Novice
24. april 2006 - 12:30 #3
Her er et fattigt bud... kan man gøre sådan?

_root.udenfor.push(1);
var i;
for (i = 0; i < _root.indenfor.lenght; i++){
  if (_root.indenfor[i] == 1);
  _root.indenfor.pop();
}
Avatar billede barklund Nybegynder
24. april 2006 - 13:05 #4
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.
Avatar billede Shasim Novice
24. april 2006 - 13:14 #5
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?
Avatar billede barklund Nybegynder
24. april 2006 - 13:30 #6
Det kunne du også snildt bruge. Kommer helt an på, hvordan du skal bruge det i sidste ende. Måske endda en kombination af de to metoder kan bruges. :)
Avatar billede Shasim Novice
24. april 2006 - 13:34 #7
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.
Avatar billede Shasim Novice
24. april 2006 - 13:51 #8
HJÆLP! Hvad er det som jeg gør galt?

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.
Avatar billede barklund Nybegynder
24. april 2006 - 15:12 #9
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);
}
Avatar billede Shasim Novice
25. april 2006 - 08:29 #10
Tak... men det virker ikke - der bliver ikke ændret noget i indholdet af mine arrays.
Mine kald fra det enkelte mc ser sådan ud:

on (release) {
if ((drag)&&((this.hitTest(_root.mc2))||(this.hitTest(_root.mc3)))) {
    this._x = 250;
    this._y = 330;
    stopDrag();
    _root.fjern(indenfor, 1)
    _root.tilfoej(udenfor, 1)                   
}else{
    stopDrag();
    _root.fjern(udenfor, 1)
    _root.tilfoej(indenfor, 1)
    }
drag = false;
}
Avatar billede Shasim Novice
25. april 2006 - 12:02 #11
Nå, jeg kan vel fjerne de to _root.fjern -kald?
Avatar billede Shasim Novice
25. april 2006 - 14:16 #12
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?
Avatar billede barklund Nybegynder
25. april 2006 - 18:06 #13
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...
Avatar billede Shasim Novice
25. april 2006 - 19:13 #14
Okay... men jeg aner ikke rigtigt hvordan funktionerne så skal se ud... og hvordan jeg får hældt de rigtige værdier i mine arrays på den måde...
Avatar billede Shasim Novice
26. april 2006 - 09:52 #15
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.
Avatar billede Shasim Novice
26. april 2006 - 10:10 #16
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?
Avatar billede Shasim Novice
26. april 2006 - 13:01 #17
splice(i, 1) kan gøre det :)
Avatar billede barklund Nybegynder
26. april 2006 - 13:26 #18
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) :)

--
Morten Barklund
Avatar billede Shasim Novice
26. april 2006 - 13:37 #19
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...
Avatar billede barklund Nybegynder
26. april 2006 - 13:50 #20
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.

Det er i hvert fald en start :)

--
Morten Barkluhnd
Avatar billede Shasim Novice
26. april 2006 - 13:53 #21
Jamen hvordan læser man den første værdi i et array? Hvis jeg nu fx. vil sætte en variabels værdi = med den?
Avatar billede Shasim Novice
26. april 2006 - 13:56 #22
"mc"+_root.udenfor[1];
Avatar billede barklund Nybegynder
26. april 2006 - 14:00 #23
for eksempel :)
Avatar billede barklund Nybegynder
26. april 2006 - 14:00 #24
Nu er første element dog på position 0 og ikke position 1 :)
Avatar billede Shasim Novice
26. april 2006 - 14:04 #25
hmmm... mangler stadig dit svar, for at kunne give dig points. Må vist bare brokle videre - det løser sig vel stille og roligt.
Avatar billede barklund Nybegynder
26. april 2006 - 14:38 #26
Jeg kaster et svar :)
Avatar billede Shasim Novice
27. april 2006 - 08:28 #27
Nej du gjorde ej :)
Avatar billede barklund Nybegynder
27. april 2006 - 10:03 #28
Jojo, jeg kaster det bare et forkert sted hen - det røg over i et andet browservindue... eller noget... :)
Avatar billede barklund Nybegynder
27. april 2006 - 10:15 #29
Tark for points :)
Avatar billede Shasim Novice
27. april 2006 - 10:17 #30
Tak for hjælp :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester