Kürzesten Weg gehen! [logisches Problem]

daddz

Mitglied
Moin,

Also ich spiele zurzeit ein wenig mit der SDL rum und bin nun auf ein logisches Problem gestoßen.
Ich habe also ein Bild, das sich auf Mausklick an die Stelle des Klicks bewegt.
Allerdings ist dann die Mitte des Bildes genau an der Stelle des Klicks und nicht wie üblich die obere linke Ecke.
Nun zum Problem:
Das Bild bewegt sich immer erst an der einen Achse entlang und dann an der anderen bis es am Zielpunkt ankommt. Ich möchte aber, dass es den kürzesten weg nimmt..also quer durch.
So sieht der momentane Bewegungscode aus:
Code:
case SDL_MOUSEBUTTONDOWN: 
      bool moveDone = false;
      while(!moveDone) {
          if(tuxY > event.motion.y) {
              tuxY--;
          }
          if(tuxX < event.motion.x) {
              tuxX++;
          }
          if(tuxY < event.motion.y) {
              tuxY++;
          }
          if(tuxX > event.motion.x) {
              tuxX--;
          }
          if(tuxX == event.motion.x && tuxY == event.motion.y) {
              moveDone = true;
          }
          tux->SetPos(tuxX-halfwidth, tuxY-halfheight);
	  SDL_FillRect(screen, NULL, bgColor);
          tux->Draw(screen);
          SDL_Flip(screen);
     }
     break;
tuxX und tuxY sind jeweils die X- und Y-Koordinaten.
Nun ich komm einfach nicht drauf wie ich das Bild direkt zum Punkt bewege und nicht über Umwege ( könnte auch sein, dass meine Blockade an der Uhrzeit liegt ).
Ich hoffe ihr könnt mir helfen! Danke schonmal!

greetz
daddz
 
moin


Du ermittelst wie auf dem Bild die entfernung auf der x-Achse und die auf der y-Achse-
Z.B. x = 90 und y = 50
Nun teilst du x durch y Ergebnis = 1,8.
Jetzt bewegst du das Bild 1 Pixel auf der y-Achse weiter und 1,8 Pixel auf der x-Achse und das solange bis das Bild an der Position ist, an der es sein soll. Das ganze dann in zwei Schleifen packen.

Jetzt kann man natürlich nicht 1,8 Pixel weiter gehen, aber nach dem 5. mal (5*1,8=9) stimmt es dann wieder.

Ich hoffe du hast verstanden wie ich es machen würde, mein Bild veranschaulicht das ja ;-)


mfg
umbrasaxum
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    3,1 KB · Aufrufe: 78
Zuletzt bearbeitet:
Hmm....ich steh grad irgendwie voll auf dem Schlauch...zieht mich mal bitte weg von hier! :rolleyes:
Hab ein bisschen rumprobiert versteh aber nicht ganz wie ich das umsetzen soll!
Code:
Code:
case SDL_MOUSEBUTTONDOWN: 
      bool moveDone = false;
      while(!moveDone) {
          int diffX = event.motion.x;
          int diffY = event.motion.y;
                    
          int newX = diffX / diffY;
                                       
          if(tuxY > event.motion.y) {
              tuxY--;
          }
          if(tuxX < event.motion.x) {
              tuxX += newX;
          }
          if(tuxY < event.motion.y) {
              tuxY++;
          }
          if(tuxX > event.motion.x) {
              tuxX -= newX;
          }
          if(tuxX == event.motion.x && tuxY == event.motion.y) {
              moveDone = true;
          }
          tux->SetPos(tuxX-halfwidth, tuxY-halfheight);
          SDL_FillRect(screen, NULL, bgColor);
          tux->Draw(screen);
	  SDL_Flip(screen);
     }
     break;

...nur leider stürzt das Programm ab wenn ich irgendwo hinklicke!
greetz
daddz
 
Zuletzt bearbeitet:
newX , diffX und diff Y als float oder double machen und bei bedarf (jeweils nach Berechnung) umcasten;
diffY != 0 muss auch noch sein
 
Ach stimmt...die müssen float sein. Darum gehts wahrscheinlich nicht! :rolleyes: warum merk ich das nicht selbst...ojee.

greetz
daddz
 
Also es versucht schon den Absturz..ich habs mal auf meine ürsprüngliche Version zurückgeändert und es geht wieder. Ich bekomms einfach nicht zum laufen! :(

greetz
daddz
 
moin


Hast du es mal im Debugger laufen lassen?
Ich denke das es daran liegt:
Code:
if(tuxX == event.motion.x && tuxY == event.motion.y) {
              moveDone = true;
          }
Es könnte gut sein das moveDone nie erreicht wird, und es somit eine unendlich Schleife gibt!


mfg
umbrasaxum
 
moin


Du weisst ja am Anfang wie weit die Entfernung auf der X-Achse ist.
Diese Entfernung merkst du dir, nun überprüfst du ob newX größer ist als die Zeilentfernung, wenn ja wird abgebrochen, wenn nein weiter machen.

Am Ende könntest du das Bild noch genau auf die Ziel Koordinaten ausrichten, da es zu abweichungen kommen kann.


mfg
umbrasaxum
 
Zurück