Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 08:24

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit Pathfinding
BeitragVerfasst: Do Aug 17, 2006 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Hi!
Ich hab mich an das erste Tutorial zu Pathdfinding gemacht.
Das ganze habe ich versucht im OrthoModus umzusetzen, mit einem Spielfeld das aus 32*32 Pixel großen Quadraten besteht. Um das Ziel heraus zu finden habe ich keine wirkliche Selektion genommen, sondern lese die Mauskoordinaten aus und reche sie um.

Code:
  1.  
  2. [...]
  3. var
  4.  MousePos: TPoint;
  5. [...]
  6.  
  7. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  8.   Y: Integer);
  9. begin
  10.  MousePos := Point(X * Screen.Width div Form1.ClientWidth,
  11.                    Y * Screen.Height div Form1.ClientHeight);
  12.  
  13.  Selected.X := round(MousePos.X / 32);
  14.  Selected.Y := round(MousePos.Y / 32);
  15. end;
  16.  


Die Prozedur, die die Pathmap erstellt und meine "Spielfigur", auch ein 32*32 Pixel großes, andersfarbiges Quadrat bewegen soll, sieht folgendermaßen aus:
Code:
  1.  
  2. procedure TForm1.BewerteTerrain(var Start, Ziel: TPoint);
  3. var
  4.  Pathmap: Array of Array of Integer;
  5.  i, j: Integer;
  6.  Fertig: Boolean;
  7.  LX, LY, HX, HY: Integer;
  8.  Weg: Integer;
  9.  amZiel: Boolean;
  10. begin
  11.  //Länge der Pathmap bestimmen:
  12.  SetLength(Pathmap, Length(Playground) + 2, Length(Playground[0]) + 2);
  13.  
  14.  //Ränder auf unbegehbar stellen:
  15.  for i := 0 to (Length(Pathmap)-1) do
  16.  begin
  17.   Pathmap[i, 0] := -1;
  18.   Pathmap[i, Length(Pathmap[0])-1] := -1;
  19.  end;
  20.  
  21.  for j := 0 to (Length(Pathmap[0])-1) do
  22.  begin
  23.   Pathmap[0, j] := -1;
  24.   Pathmap[Length(Pathmap)-1, j] := -1;
  25.  end;
  26.  
  27.  //Eintragen welche Felder begehbar sind und welche nicht:
  28.  for i := 1 to (Length(Pathmap)-2) do
  29.   for j := 1 to (Length(Pathmap[0])-2) do
  30.    if Playground[i-1, j-1].Block = True then
  31.     Pathmap[i, j] := -1
  32.    else
  33.     Pathmap[i, j] := -8;
  34.  
  35.  
  36.  //Start und Ziel eintragen (+1 weil die Pathmap ja in jede Richtung größer ist):
  37.  Pathmap[Start.X+1, Start.Y+1] := -10;
  38.  
  39.  Pathmap[Ziel.X+1, Ziel.Y+1] := 0;
  40.  
  41.  //Variablen auf Anfangswerte setzen:
  42.  LX := Ziel.X + 1;
  43.  LY := Ziel.Y + 1;
  44.  HX := Ziel.X + 1;
  45.  HY := Ziel.Y + 1;
  46.  
  47.  Weg := 0;
  48.  Fertig := False;
  49.  
  50.  //Die Schleife den eigentlichen Weg einzeichnet:
  51.  while not Fertig do
  52.  begin
  53.   dec(LX);
  54.   dec(LY);
  55.   inc(HX);
  56.   inc(HY);
  57.  
  58.   if LX < 1 then LX := 1;
  59.   if LY < 1 then LX := 1;
  60.   if HX > (Length(Pathmap)-2) then HX := Length(Pathmap) - 2;
  61.   if HY > (Length(Pathmap[0]) -2) then HY := Length(Pathmap[0]) - 2;
  62.  
  63.   for i := LX to HX do
  64.    for j := LY to HY do
  65.     if Pathmap[i, j] <= -8 then
  66.      if (Pathmap[i+1, j] = Weg)
  67.      or (Pathmap[i-1, j] = Weg)
  68.      or (Pathmap[i, j+1] = Weg)
  69.      or (Pathmap[i, j-1] = Weg) then
  70.       case Pathmap[i, j] of
  71.        -10: Fertig := True;
  72.       else
  73.        Pathmap[i, j] := Weg + 1;
  74.       end;
  75.  
  76.   inc(Weg);
  77.  end;
  78.  
  79.  amZiel := False;
  80.  
  81.  
  82.  //Die Schleife die die Figur bewegen soll
  83.  while not amZiel do
  84.  begin
  85.   i := Player.X + 1;
  86.   j := Player.Y + 1;
  87.  
  88.   dec(Weg);
  89.   Panel1.Caption := IntToStr(Weg);
  90.  
  91.   if Pathmap[i+1, j] = Weg then inc(Player.X)
  92.   else if Pathmap[i-1, j] = Weg then dec(Player.X)
  93.   else if Pathmap[i, j+1] = Weg then dec(Player.Y)
  94.   else if Pathmap[i, j-1] = Weg then inc(Player.Y)
  95.   else amZiel := True;
  96.  
  97.  
  98.  end;
  99.  
  100.  
  101.  
  102.  
  103.  //für mich zur Konrtolle:
  104.  Form1.StringGrid1.ColCount := Length(Pathmap);
  105.  Form1.StringGrid1.RowCount := Length(Pathmap[0]);
  106.  
  107.  for i := 0 to (Length(Pathmap)-1) do
  108.   for j := 0 to (Length(Pathmap[0])-1) do
  109.    Form1.StringGrid1.Cells[i, j] := IntToStr(Pathmap[i, j]);
  110.  
  111.  Form1.StringGrid1.Visible := True;
  112. end;
  113.  


Nach meinem Verständnis müsste das weiße Quadrat jetzt zu dem von mir vorgegeben Ziel springen. Tut es aber nicht wirklich. Wenn ich das erste mal klicke springt es über das Ziel (mit einem Quadrat Zwischenraum), das zweite mal passiert nichts, das dritte mal wieder nicht, usw. Wenn ma oft genug klickt springt es irgendwann mal wieder weiter, vorzugsweise weg von dem derzeit vorgegebenen Ziel.
Panel 1 (siehe 2. Schleife, die das Quadrat bewegen soll) zeigt den Wert an den Weg auch haben sollte, die Variable Weg scheint also korrekt zu sein.
Ich habe auch überprüft ob amZiel vielleicht nicht auf False zurück gestellt wird, aber am Anfang der Schleife ist es False.
Ich kann mir das ganze nicht erklären... Wisst ihr woran das liegen könnte?


Noch eine kleine Anmerkung - da es bei der Selection einfacher ist rendere ich die Vierecke von der oberen linken Ecke des Fensters aus, das dürfte aber eigentlich keinen Untschied machen, zumal Start und Zielpunkt richtig in die Pathmap eingetragen werden...


cya,
Deathball


edit: Ich hab noch ein bisschen in der Gegend rumgeklickt und teilweise springt das Quadrat neben das Ziel, also näher als oben beschrieben.
Jedoch scheint dies immer noch reiner Zufall zu sein wann und wie lange das ganze funktioniert...


edit2: Ich hab den Quellcode nochmal als .rar Archiv dran gehängt....


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]