Autor Beitrag
knittel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Mi 13.04.11 10:31 
Hallo allerseits,
Ich entwickle grad einen Map Editor für mein Spiel. Dabei soll es Wegpunkte geben die der KI als Weghilfe dienen soll. Ich zeichne die Map mit Andorra 2D und die Punkte darauf mit der Andorra 2D Canvas.

Hier ist meine Zeichen Prozedur in der die Wegpunkte und die Verbindungen gezeichnet werden sollen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure DrawPoints();
var i, j: integer;
begin
with Form1.AdDraw.Canvas do
  begin
  // Set Canvas
  Pen.Color := NewColor;
  Brush.Style := absolid;
for i:= 0 To Length(MapInfo)-1 do
  begin
  // Hier liegt das Problem:
  for j:= 0 To Length(MapInfo[i].ConnectedTo)-1 do
    Line(MapInfo[i].X + 174 + 4, MapInfo[i].Y + 14,
         MapInfo[MapInfo[i].ConnectedTo[j]].X + 174 + 4, MapInfo[MapInfo[i].ConnectedTo[j]].Y + 14);
  // Andere Zeichen prozeduren. Hier läuft alles gut.
  if MapInfo[i].PlayerPoint <> 0 then
    Textout(MapInfo[i].X + 174 - 1, MapInfo[i].Y + 14 - 8, IntToStr(MapInfo[i].PlayerPoint))
  else
    Rectangle(MapInfo[i].X + 174 + 2, MapInfo[i].Y + 14 - 2,
              MapInfo[i].X + 174 + 6, MapInfo[i].Y + 14 + 2);
  end;

  // Reset Canvas
  Pen.Color := BlackColor;
  Brush.Style := abclear;
  end;
end;


(Ignoriert die Additionen am Ende (+174, u.a.), die sind lediglich zur Korrektur da, weil die Map nicht in der oberen linken Ecke liegt.)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type TMapPoint = record
  X, Y: Word; // Position
  PlayerPoint: Byte; // 0 = Waypoint
  ConnectedTo: array of Byte;
  end;


Das ConnectedTo speichert den Index der Wegpunkte mit denen dieser Punkt verbunden ist. Wenn MapPoint A auf MapPoint B zeigt, zeigt MapPoint B auch automatisch auf MapPoint A. Somit wird die Linie doppelt gezeichnet! Dies ist zwar nicht wichtig für den Anwender allerdings für die letztendliche Benutzung der Map.

Auf jeden Fall wenn ich einen der Mappoint (B) bewege, passiert folgendes:
Eine Linie wird von Punkt A zu Punkt B gezeichnet und
Eine Linie wird von Punkt A zu Punkt Bs ursprünglicher Position gezeichnet.

Wie kann ich dieses Problem beheben?
(Da Ich ähnliche Probleme in einer anderen Anwendung habe, schliesse ich daraus das die Andorra Canvas irgendwie die Informationen des vorherigen Bildes mitbenutzt um den neuen Frame zu zeichen.)
Danke im voraus.

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Mi 13.04.11 11:20 
Ich glaube nicht, dass dein Problem am Zeichnen liegt.
Sondern eher, an der Array.
Schätze mal, beim "verschieben" wird der alte Eintrag nicht gelöscht oder geupdated.
Daher wird ein mal eine Linie gezeichnet die richtig ist, und ein mal eine zum alten Punkt.
Gib dir doch mal deine Liste aus mit den Punkten und schau ob wirklich nur dieser eine Wegpunkt drin ist, oder ob der nicht doch doppelt drin ist.
knittel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Mi 13.04.11 11:46 
Wenn der Wegpunkt doppelt drin wäre, müsste ja auch dieser Punkt gezeichnet werden. Schließlich habe ich ja im Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
for i:= 0 To Length(MapInfo)-1 do
  begin
  [...]
  if MapInfo[i].PlayerPoint <> 0 then
    Textout(MapInfo[i].X + 174 - 1, MapInfo[i].Y + 14 - 8, IntToStr(MapInfo[i].PlayerPoint))
  else
    Rectangle(MapInfo[i].X + 174 + 2, MapInfo[i].Y + 14 - 2,
              MapInfo[i].X + 174 + 6, MapInfo[i].Y + 14 + 2);
  end;


Somit Zeichne ich ja alle Wegpunkte die vorhanden sind. Allerdings wird nur eine Linie gezeichnet, kein Endpunkt. Verschiebe ich einen Punkt 2Mal ist wieder die neue und die ganz alte zu sehen. Die dazwischen nicht.

Daher glaube ich nicht das das Problem am Array liegt.

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Mi 13.04.11 16:02 
Du malst hier die Punkte, aber nicht die punkte wo "connectedTo" drauf zeit.
Ich vermute mal, dass ConnectedTo (Da es ne array ist) 2 einträge hat und deshalb den ersten warum auch immer malt, aber nicht als punkt anzeigt.
Check doch das einfach mal, wenn's das nicht ist, können wir es wenigstens ausschließenn ;)