Avatar billede baitianlong Nybegynder
16. august 2002 - 14:32 Der er 20 kommentarer og
1 løsning

funktioner med bevægelse

Hej venner.

Jeg synes det kan være svært at skrive en funktion med bevægelse af objekter, fordi man ikke har tidslinien (enterFrame) som pause. Hvad gør man ved det ?

function flyt() {
  x = 1;
  while(x < 10) {
      _root.objekt._x -= 20;
      x++;
  }
}

Denne funktion flytter jo bare objektet 200 pixels ? Kan man putte en pause ind i whilen (f.eks en lille for-løkke, eller noget)

Fortæl mig lige lidt om det ((o;
Avatar billede mat Nybegynder
16. august 2002 - 17:33 #1
Nu ved jeg ikke om jeg har forstået dig ret, men du kan jo lave et "container-clip" der eksekverer dine functions i enterFrame hvis det er med den hyppighed de skal eksekveres.
Avatar billede baitianlong Nybegynder
16. august 2002 - 17:38 #2
Det jeg mener er, hvordan laver man en pause i en funktion ?

function flyt() {
  x = 1;
  while(x < 10) {
      _root.objekt._x -= 20;
      //VENT ET ØJEBLIK (0,5 sekunder eller to frames f.eks)
      x++;
  }
}
Avatar billede barklund Nybegynder
17. august 2002 - 15:25 #3
DET KAN MAN IKKE!

Og det er en meget vigtig ting at fatte, når man programmerer flash. Til flash5 er der lavet en engine, der kan håndtere sådanne ting. Den hedder FLEM og kan hentes fra http://chattyfig.figleaf.com

Til flash6 findes denne engine men er udokumenteret. Den hedder ASBroadCaster og ideen i dem begge er, at man kan skrive ting som:

myObject = new Object();
myObject.enterFrame = function() {
    // do enterframe stuff
}
MovieClip.addListener(myObject);

Det er ikke helt sådan, men ideen er der. Det der så sker er, at man kun har ét movieclip, der tjekker på enterFrame og blot når der er en ny frame kalder alle tilmeldte objekter med den pågældende funktion. Der er selvfølgelig og Key.addListener, Mouse.addListener og lidt til... Havde myObject en mouseDown-funktion, så ville den blive kaldt når den pågældende engine sendte denne event ud.

Skal en operation ske over flere frames, er du nødt til at hægte den op på en eller anden enterFrame-kald. Du kan lave et dummyClip til at fange den. Du kan også hente FLEM, der består af et dummyClip, som sørger for at holde styr på alle listeners...
Avatar billede baitianlong Nybegynder
17. august 2002 - 15:41 #4
Fint nok du kom Barklund. Jeg sidder og roder med denne funktion, der vælger tre tilfældige MC og viser dem...

function plade() {
    function findtal() {
        tal1 = random(12)+1;
        tal2 = random(12)+1;
        tal3 = random(12)+1;
        if(tal2 == tal3 or tal1 == tal3 or tal1 == tal2) {
            findtal();
        }
        if(tal1 != 1 && tal2 != 1 && tal3 != 1) {
            findtal();
        }
    }
    findtal();
    for(j = 1; j<13; j++)
        _root["plade" + j]._x = _root["plade" + j].startx;
    _root["plade" + tal1]._x = 137.5;
    _root["plade" + tal2]._x = 275;
    _root["plade" + tal3]._x = 412.5;
   
}

Men i stedet for de tre nederste linier, hvor de bare dukker op, skulle de køre ind på skærmen i stedet for. ?? Det bliver lidt tricky så !!
Avatar billede baitianlong Nybegynder
17. august 2002 - 16:25 #5
Jeg synes det er mystisk at man ikke kan gøre sådan her:

function flyt() {
    i = 0;
    while(i < 100) {
        for(x = 1; x < 500; x++); //hold pause
        _root.lort._x -= 2;      //flyt 2 pixels
        i ++;
    }
}

Nogen kommentarer ?
Avatar billede barklund Nybegynder
17. august 2002 - 16:54 #6
Mht. dit sidste indlæg så er der ikke en updateStage i flash som i fx director. Derfor vil dit movieclip ikke bevæge sig før hele scriptet i den pågældende frame er afviklet.

Dit øverste script ville jeg lave om til (du skal finde tre tilfældige forskellige tal fra 1-12, hvoraf et af dem er "1"?):

function plade() {
    var i, tal = new Array();
    for (i = 1; i <= 12; i++) tal[i] = i;
    tal.sort(function(a,b) {return random(3)-1);});
    for (i = 3; i < tal.length; i++)
        if (tal[i] == 1) {
            var r = random(3);
            var t = tal[r];
            tal[r] = tal[i];
            tal[i] = t;
            break;
        }
    }
    for(i = 1; i<=12; i++)
        _root["plade" + i]._x = _root["plade" + i].startx;
    _root["plade" + tal[1]].end_x = 137.5;
    _root["plade" + tal[2]].end_x = 275;
    _root["plade" + tal[3]].end_x = 412.5;
}

På dine "pladeN"'er har har du så en function der flytter fra _x til end_x - den er jo enkel nok... :o)

/Barklund
Avatar billede barklund Nybegynder
17. august 2002 - 21:47 #7
Der skal selvfølgelig være:

_root["plade" + tal[0]].end_x = 137.5;
_root["plade" + tal[1]].end_x = 275;
_root["plade" + tal[2]].end_x = 412.5;

Da 1-tallet er sikret blandt disse... :o)
Avatar billede baitianlong Nybegynder
17. august 2002 - 22:39 #8
og så på mc'erne...

onClipEvent(load) {
  startx = _x;
}
onClipEvent(enterFrame) {
  if (_x > end_x) {
      _x -= 10;
  }
}

Så skal jeg vel bare sætte de andres end_x til startx sådan her:

for(i = 1; i<=12; i++)
        _root["plade" + i]._x = _root["plade" + i].end_x = _root["plade" + i].startx;
_root["plade" + tal[0]].end_x = 137.5;
_root["plade" + tal[1]].end_x = 275;
_root["plade" + tal[2]].end_x = 412.5;


Så er det vel egentlig løst helt...?? med bevægelse og det hele
Avatar billede baitianlong Nybegynder
17. august 2002 - 23:26 #9
Dit script giver en ; fejl

Scene=Scene 1, Layer=ascript, Frame=1: Line 4: ';' expected
        tal.sort(function(a,b) {return random(3)-1);});

Og min egen sidste ide duer vist ikke ... Vi fortsætter i morgen
Avatar billede barklund Nybegynder
19. august 2002 - 09:12 #10
En parantes for meget:

tal.sort(function(a,b) {return random(3)-1;});

Og ja, din ide skulle være fin, tilføj blot en "end_x = _x" i "load" så de starter med at ligge stille...
Avatar billede baitianlong Nybegynder
19. august 2002 - 13:26 #11
Nogen gange kommer der kun 2 plader ud (og nogen gange kun 1)?? Det er da mystisk. Funktionen ser sådan ud:

function plade() {
    var i, tal = new Array();
    for (i = 1; i <= 12; i++) tal[i] = i;
    tal.sort(function(a,b) {return random(3)-1;});
    for (i = 3; i < tal.length; i++)
        if (tal[i] == 1) {
            var r = random(3);
            var t = tal[r];
            tal[r] = tal[i];
            tal[i] = t;
            break;
        }
    for(i = 1; i<=12; i++) {
        _root["plade" + i]._x = _root["plade" + i].startx;
        _root["plade" + i].end_x = _root["plade" + i].startx;
        }
_root["plade" + tal[0]].end_x = 137.5;
_root["plade" + tal[1]].end_x = 275;
_root["plade" + tal[2]].end_x = 412.5;
}

Og jeg har nu det her på pladerne:

onClipEvent(load) {
    startx = _x;
    end_x = _x;
}
onClipEvent(enterFrame) {
  if (_x > end_x) {
    _x -= 25;
  }
}


Der må stadig være en lille fejl i funktionen, Barklund !!??
Avatar billede barklund Nybegynder
19. august 2002 - 13:32 #12
Ret linie 3 til:

for (i = 0; i < 12; i++) tal[i] = i+1;

/Barklund
Avatar billede baitianlong Nybegynder
19. august 2002 - 14:13 #13
Mange tak for hjælpen, idéerne og forklaringerne, Barklund.

Jeg tror nok jeg blev klogere (o;

Smid lige et svar...
Avatar billede barklund Nybegynder
19. august 2002 - 14:18 #14
Virker det?
Avatar billede barklund Nybegynder
19. august 2002 - 14:20 #15
BTW så er jeg stadig kun halvfærdig med mit skydespil... Jeg håber, at jeg når det... :o)

Det bliver 3D, du går rundt som i doom-spil... Indtil videre kan man kun kigge lige ned af en gang og dreje 90 grader hver gang, men jeg skal nok få det sidste på plads... Det kan dog tage lang tid... :o)
Avatar billede baitianlong Nybegynder
19. august 2002 - 14:22 #16
Ja. Det var en fin ide du kom med med end_x i funktionen ((o; Så kom vi ud på mc'ernes enterFrame alligevel...
Avatar billede barklund Nybegynder
19. august 2002 - 14:23 #17
Ja, og det er netop det, der egentlig er noget rod, for de 12 movieclip vil ikke køre simultant! Deres enterFrames vil være lidt forskudt, dog samme frekvens. Derfor er det, at man kun børe have 1 movieclip med en enterFrame, som så sender denne event ud til en række andre movieclips og/eller objekter...
Avatar billede baitianlong Nybegynder
19. august 2002 - 14:24 #18
Det glæder jeg mig til at se. Gang i vektorberegningerne !?!

Dette er naturligvis også endnu et skydespil - man skal skyde "plade1" har du nok gættet ((o;
Avatar billede barklund Nybegynder
19. august 2002 - 14:26 #19
Næ... Det havde jeg faktisk ikke forbundet... :o)
Avatar billede barklund Nybegynder
19. august 2002 - 14:26 #20
Men lige netop derfor er konkurrencer som denne fed, for det sætter folk i gang med at udforske områder, de ikke har leget med før... Uanset folks niveau...
Avatar billede baitianlong Nybegynder
19. august 2002 - 14:27 #21
Ligesom indlæggene her - de kommer også i en sjov rækkefølge *GG*
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