Avatar billede barf Nybegynder
29. august 2004 - 19:57 Der er 11 kommentarer og
1 løsning

Hjælp til kort

Jeg er igang med at lave et kort. Man kan zoome og bevæge kortet.

Kortet er opbygget på følgende måde:
Kortet er placeret i mc'et 'innerMap_mc'.
innerMap_mc's registreringspunktet er sat i centrum af kortet.
innerMap_mc er placeret i mc'et 'map_mc'.
map_mc's registreringspunktet  er sat i centrum af innerMap_mc
map_mc er masket så man kun kan se 600x600px af kortet af gangen.

Når man flytter sig rundt på kortet ændre jeg innerMap_mc's x og y koordinater.
Når man zoomer ændre jeg map_mc's xscale og yscale.


Mit spørgsmål går på:
Jeg vil gerne undgå at kortet bliver flyttet så meget eller zoomet så langt ud, at kortet ikke udfylde de 600x600px og man dermed kan se baggrunden.

Hvordan i alverden regner jeg det ud?
Avatar billede _k Nybegynder
29. august 2004 - 21:38 #1
Du lytter på innerMap_mc's _x- og _y-positioner, samt eventuelt dets _width, og konstruerer nogle if-sætninger der "låser" brugerinput såfremt de overskrider dine ønskede værdier.

Nu ved jeg af gode grunde ikke hvordan dit script for bevægelse på kortet ser ud, men if-sætningernes opbygninger kunne godt se sådan her ud:

if(innerMap_mc._x > 0 && innerMap_mc._y < 600 && innerMap_mc._y > 0 && innerMap_mc._y < 600) {
  if(innerMap._width > 600 && innerMap._heigth > 600) {
    // Ok, du må gerne scrolle kortet
  }
}
else {
  // Kortet låses
}

...du kan lave en onEnterFrame der tracer innerMap_mc's koordinater ud hvis de er svære at ramme. Du kan også bruge noget globalToLocal() eller localToGlobal() hvis det driller (de metoder er dog lidt tricky, så ha' tålmodighed med dem!)
Avatar billede barf Nybegynder
29. august 2004 - 22:43 #2
Ja, det er også det samme jeg er kommet frem til, men jeg kan simpelthen ikke finde frem til den rigtige udregning :(

Her er lidt flere oplysninger, som jeg håber kan hjælpe dig:
map_mc.innerMap_mc._width er altid den samme (2503px)
map_mc.innerMap_mc._height er altid den samme (2850px)
map_mc._x er altid den samme (300px)
map_mc._y er altid den samme (300px)


Min bevægelse script ser sådan her ud:
mListener.onMouseDown = function() {
    mouseDown = true;
    offsetX = _root._xmouse-map_mc.innerMap_mc._x;
    offsetY = _root._ymouse-map_mc.innerMap_mc._y;   
};
mListener.onMouseMove = function() {
    if (mouseDown) {
        var mouseX = _root._xmouse;
        var mouseY = _root._ymouse;
        map_mc.innerMap_mc.moveXY(mouseX-offsetX, mouseY-offsetY);
    }
}
MovieClip.prototype.moveXY = function(x, y) {
    this._x = Math.round(x);
    this._y = Math.round(y);
};
Avatar billede barklund Nybegynder
29. august 2004 - 23:19 #3
Ja, det var en glimrende udfordring. Men her er den - lavet i Flash MX 2004:

http://actionscript.dk/eksperten/dragzoommap/

Håber du kan bruge det :)

--
Morten Barklund
Avatar billede rohaje Nybegynder
29. august 2004 - 23:21 #4
MovieClip.prototype.moveXY = function(x, y) {
    this._x = Math.round(x);
    this._y = Math.round(y);
    if ((this._x>(this._width/2)-300)) {
        this._x = (this._width/2)-300;
    } else if (this._x<(-this._width/2)+300) {
        this._x = (-this._width/2)+300;
    }
    if ((this._y>(this._height/2)-300)) {
        this._y = (this._height/2)-300;
    } else if (this._y<(-this._height/2)+300) {
        this._y = (-this._height/2)+300;
    }
};
Avatar billede rohaje Nybegynder
30. august 2004 - 08:47 #5
ups, jeg havde ikke lige set at barklund havde lavet en løsning.
Avatar billede barf Nybegynder
30. august 2004 - 11:06 #6
Hvor er det godt! Begge jeres forslag virker perfekt! I må meget gerne smide et par svar.

Jeg gider ikke engang komme ind på hvor lang tid jeg selv har brugt på at prøve løse problemet :(


Totalt offtopic:
rohaje, jeg har været inde og se den tegnemaskine du har lavet til  http://www.rustfritbord.com/ (overvejer faktisk at bestille bordplade derfra) - den er virkelig imponerende, men har den ikke bare taget en evighed at programmere?
Avatar billede rohaje Nybegynder
30. august 2004 - 11:11 #7
jeg har arbejdet på den i min fritid on-off et års tid. Det var en hård fødsel.
Avatar billede rohaje Nybegynder
30. august 2004 - 11:26 #8
barklund skal have fuldt hus for sin løsning
Avatar billede barklund Nybegynder
30. august 2004 - 12:02 #9
Jeg smider et lille svar. Jeg løste det ved at sætte mig ned med et stykke papir og tegne lidt for at finde ud af, hvordan man fandt grænserne for, hvor langt papiret kan rykkes ved forskellige scales. Denne essentielle beregning ligger i correctXY() tror jeg funktionen hedder. Det øvrige er vel præcis, som du har lavet det.
Avatar billede barklund Nybegynder
30. august 2004 - 12:02 #10
Hov...
Avatar billede barf Nybegynder
30. august 2004 - 18:50 #11
Tak for hjælpen til jer begge!
Avatar billede barklund Nybegynder
30. august 2004 - 19:33 #12
Tark for points ;)
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