Avatar billede andersnielsen Nybegynder
29. marts 2003 - 22:40 Der er 26 kommentarer

Random movement i labyrint...

Nogen der kan hjælpe med noget konkret kode til hvordan man får x ens antal movieclips til at bevæge sig random rundt i en mindre labyrint?

Det skal fungere pacman-agtigt, hvor x antal movieclips til at starte med er i midten og lidt efter lidt bliver de 'sluppet løs'.

Hver gang, der så er valgmuligheder skal movieclippet random tage en af mulighederne - men må aldrig vende om.

Håber det er forståeligt, ellers må I jo spørge løs :-)

På forhånd tak for hjælpen...
Avatar billede andersnielsen Nybegynder
30. marts 2003 - 00:57 #1
Hmm - ingen, der kan hjælpe herinde? :(
Kan da vist ikke passe.

Skal nok smide flere point hvis det skal være... ikke det der skal gøre forskellen :-)
Avatar billede barklund Nybegynder
30. marts 2003 - 17:12 #2
Vi har bare holdt weekend - pointene er skam fine nok :)

Jeg har lavet en pacman spil engang i Flash 5 - mit andet spil faktisk. Ret tåbelig kode, men ideen jeg ville anvende i dag er den samme.

Lav et array af alle dine intersections samt alle dine brikker. For hver brik husker du dens nuværende retning. For hver intersection angiver du dens x og y position i de tilstedeværende retninger.

Når du så på hver enterFrame løber alle brikker igennem, så tjekker du for hver, om de befinder sig ovenpå en intersection. Gør den det, så fjerner du brikkens modsatte retning (går den vest, så fjerner du øst...) og tager der efter en tilfældig af de tilbageværende retninger. Når alle brikker har eventuelt har fået sat en ny retning, så flytter du dem i henhold til deres retning.

/Barklund
Avatar billede barklund Nybegynder
30. marts 2003 - 17:12 #3
Ok, jeg lyver... jeg lavede det i Flash 4 - og det er ikke spor sjov :)
Avatar billede pyroman Nybegynder
01. april 2003 - 17:05 #4
I dine vejkryds lægger du nogle usynlige MC'er hvorpå følgende kode:

onClipEvent(enterFrame){
  for(i=1; i<=antalPacmans;i++){
    if(this.hitTest(_root["pacman"+i])){
      _root["pacman"+i].decide(left, right, up, down);
    }
  }
}

Jeg har ikke så meget tid så jeg vender tilbage senere med resten af koden...

*.Pyroman
Avatar billede andersnielsen Nybegynder
01. april 2003 - 20:52 #5
> Pyroman
Glæder mig meget :-)

> Barklund
Jeg forstår det ikke helt. Skal måske bruge noget kode-eksempel.
Men hvis det kode pyroman har lovet til senere er noget jeg kan bruge (tror jeg da det er :-) - så er det jo ikke nødvendigt.

Mvh :-)
Avatar billede barklund Nybegynder
01. april 2003 - 21:13 #6
For eksempel:

brik = new Array();
brik[0] = {m: _root.brik1, dir: "n"};
brik[1] = {m: _root.brik2, dir: "r"};
kryds = new Array();
kryds[0] = {x: 100, y:150, dirs: ["u","r","l","d"]};
kryds[1] = {x: 150, y:150, dirs: ["u","l","d"]};

_root.onEnterFrame = function() {
    var b, k, rest_dirs;
    for (b = 0; b < brik.length; b++) {
        for (k = 0; k < kryds.length; k++) {
            if (intersect(brik[b].m,kryds[k].x)) {
                rest_dirs = remove(kryds[k].dirs, brik[b].dir);
                brik[b].dir = rest_dirs[random(rest_dirs.length)];
            }
        }
    }

    // flyt brikker i henhold til dir...
}
function intersect(b, k) {
    var i = 10;
    var x1 = b._x, y1 = b._y;
    var x2 = k.x, y2 = k.y;
    return (x1-i > x2 && x1+i < x2 && y1-i > y2 && y1+i < y2);
}
function remove(ds,d) {
    var i, ret = new Array();
    for (i = 0; i < ds.length; i++) {
        if (!((ds[i] == "u" && d == "d") ||
              (ds[i] == "d" && d == "u") || 
              (ds[i] == "r" && d == "l") ||
              (ds[i] == "l" && d == "r"))) {
          ret.push(ds[i]);
        }
    }
}
Avatar billede barklund Nybegynder
01. april 2003 - 21:13 #7
Men det er ikke noget, som du bare kan bruge... Det skal selvfølgelig tilpasses din labyrint...
Avatar billede andersnielsen Nybegynder
02. april 2003 - 00:01 #8
Hvad er variablerne b, k, m og ds?
Hvad bruger du arrayet 'ret' til?
Avatar billede barklund Nybegynder
02. april 2003 - 00:25 #9
b og k er lokale variabler til at tælle igennem hhv. alle brikker og alle kryds...

m er en variabel for hver brik som holder en reference direkte til det pågældende movieclip.

ret er et lokalt array, som genereres i funktionen remove() - det indeholder elementerne i ds minus det modsatte element til d...
Avatar billede andersnielsen Nybegynder
02. april 2003 - 10:38 #10
Hmm - nok bare mig, der tåger, men kan ikke rigtigt få det til at virke.
Har du ikke et .fla dokument hvori det virker? :-)

Det vil jeg sætte pris på - så går det lidt bedre for mig, tror jeg ;-)

/Anders
Avatar billede pyroman Nybegynder
02. april 2003 - 18:12 #11
Jeg kan umiddelbart heller ikke se logikken i dit script barklund, hvor er den funktion der skal vælge vej?
Avatar billede barklund Nybegynder
02. april 2003 - 18:43 #12
valget af vej sker i "brik[b].dir = ..." og så en random af alle tilgængelige veje undtagen den jeg kom fra.

Jeg kan prøve at lave en lille demo, men det kræver jo en smule... Måske får jeg det lavet her til aften...
Avatar billede andersnielsen Nybegynder
02. april 2003 - 21:09 #13
Barklund >>
Glæder mig :-)

Pyroman >>
Du snakkede om, at du ville vende tilbage med resten af koden - hvordan går det med det? ;-)

/Anders
Avatar billede pyroman Nybegynder
03. april 2003 - 20:51 #14
Jo men så kom barklund jo, og ja - har du stadig brug for det eller håber du på barklunds script, mit er nok lidt mindre smart (fylder lidt mere), men jeg kan bedre finde rundt i det end alle de der array-funktioner...
Avatar billede andersnielsen Nybegynder
03. april 2003 - 21:16 #15
Tror stadig jeg har brug for det - har også mine problemer med de arrays ;-)

Men altså har du ikke tid til det eller noget, så må jeg prøve videre med Barklunds - det virker garanteret. Jeg er bare ikke så suveræn til det stuff :-)

Så altså - håber stadig på lidt kode fra dig ;-)

/Anders
Avatar billede storslem Nybegynder
04. april 2003 - 12:39 #16
Spændende... følger lige med her. ((o;
Avatar billede pyroman Nybegynder
07. april 2003 - 20:04 #17
Bare så du ikke helt glemmer mig, så har jeg først lige fået tid til at lave noget i denne uge - så hav lidt tålmodighed : )
Avatar billede andersnielsen Nybegynder
07. april 2003 - 22:31 #18
skal godt nok snart til at bruge det, men jeg har tålmodighed lidt endnu :-)
Avatar billede pyroman Nybegynder
08. april 2003 - 13:45 #19
Okay nu har jeg lavet noget der i hvert fald virker fint på min...

Du laver et MC med navnet 'pacman' og et mc med en usynlig kvadrat der er lidt større end din pacman.
Først hiver du et antal kvadrater ind som kryds og sørger for at de alle står lige overfor de andre nærmeste.

På din pacman:

onClipEvent (load) {
    speed = 2;
    directionArr = new Array();
    deciding = false;
    function decide(allowedDirections) {
        deciding = true;
        directionArr = allowedDirections.split("-");
        direction = directionArr[chooseRandom()];
        if (direction == "left") {
            _x -= speed+1;
        } else if (direction == "right") {
            _x += speed+1;
        } else if (direction == "up") {
            _y -= speed+1;
        } else if (direction == "down") {
            _y += speed+1;
        }
    }
    function chooseRandom() {
        randChoice = random(directionArr.length);
        if (directionArr[randChoice] == mirrorDirection) {
            chooseRandom();
        } else {
            return randChoice;
        }
    }
}
onClipEvent (enterFrame) {
    if (direction == "left") {
        mirrorDirection = "right";
        _x -= speed;
    } else if (direction == "right") {
        mirrorDirection = "left";
        _x += speed;
    } else if (direction == "up") {
        mirrorDirection = "down";
        _y -= speed;
    } else if (direction == "down") {
        mirrorDirection = "up";
        _y += speed;
    }
}

Her skal du så bare ændre speed til din egen værdi...


På hvert kryds

onClipEvent(enterFrame){
    if(_root.pacman._x <= _x+_root.pacman.speed &&
      _root.pacman._x >= _x-_root.pacman.speed &&
      _root.pacman._y <= _y+_root.pacman.speed &&
      _root.pacman._y >= _y-_root.pacman.speed &&
      !_root.pacman.deciding){
        _root.pacman._x = _x;
        _root.pacman._y = _y;
        _root.pacman.decide("directions");
    }
}

I denne kode skal du ændre argurmentet i den sidste funktion (_root.pacman.decide("directions");). Her skal du istedet for directions skrive de tiladte retninger ("up", "down", "left" og "right") adskildt af en bindestreg(Det er ligemeget med rækkefølgen).
eksempel:

_root.pacman.decide("left-right-up");

Det burde være det - Den er ret overskuelig... : )
Avatar billede pyroman Nybegynder
08. april 2003 - 13:47 #20
Forresten så gælder denne her kode kun for et MC, hvis du vil have flere så skal du i hvert kryds indsætte en for-løkke...
Avatar billede pyroman Nybegynder
14. april 2003 - 15:43 #21
Hva' kan du bruge det til noget?
Avatar billede andersnielsen Nybegynder
14. april 2003 - 20:14 #22
Jeg har ikke haft tid til at kigge, men det gør jeg nok enten i morgen eller onsdag og så skal jeg nok give besked :-)
Avatar billede andersnielsen Nybegynder
15. april 2003 - 09:22 #23
Jeg kan ikke rigtigt få det til at virke.
Fra start bevæger pacman sig jo ikke - men det har jeg så sat den til. Men derfor sker der stadig ikke noget, når den kører henover mit kryds - den fortsætter bare lige igennem...

Hvordan kan det være? :(
Avatar billede andersnielsen Nybegynder
15. april 2003 - 09:24 #24
jeg trækker mine ord i mig igen nu virkede det i hvert fald i den fil jeg lavede hvori der ikke var andet end din kode :-)
Avatar billede andersnielsen Nybegynder
15. april 2003 - 09:50 #25
Hmm - det virker kun ved det ene kryds - når den går videre til kryds nummer to skifter den ikke længere retning.

Er det det, du snakker om, med at man skal indsætte en for-løkke, eller var det når der var flere pacmans (gik jeg ud fra..)

/Anders
Avatar billede pyroman Nybegynder
16. april 2003 - 10:30 #26
Hmmm det lyder mærkeligt, jeg havde lavet det med en pacman og ni kryds og der kunne han godt gennem dem alle sammen.

Ja for-løkken er til flere pacmans - kan godt vise dig det lidt senere men har ikke tid nu
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