Entwickler-Ecke

Sonstiges (Delphi) - Probleme mit grafischer Darstellung...


h00ligan - So 04.10.09 20:13
Titel: Probleme mit grafischer Darstellung...
Hallo.
Ich programmiere derzeit ein Programm, in dem ein Monster (TButton) einen vorgegebenen Weg durchlaufen soll. Hierbei werden Wegpunkte(TLabel) gesetzt. Das Laufen klappt auch wunderbar, jedoch macht die optische Gestaltung des Weges Probleme. Die Wegpunkte sind in einem Gitter angeordnet und bekommen nach dem Erstellen eine Weg-Textur. Außerdem wird dann die Weg-Textur zwischen zwei aufeinander folgenden Punkten gezeichnet. Das gesamte Gitter bekam vorher eine Gras-Textur.
Das Erstellen der Wegpunkte ist eigentlich kein Problem, jedoch braucht das Programm wahnsinnig lange um einen neuen Wegpunkt und den dazugehörigen Weg zu zeichnen, da z.B. vorher alle anderen Images usw. ungewollt aktualisiert werden. Die Geschwindigkeit des Programms lässt auch immer mehr nach, je nachdem wie viele Wegpunkte und damit auch Strecken erstellt und angezeigt wurden.
Ich weiß nicht ob das wirklich das Problem ist und bitte um Hilfe von erfahreneren Programmierern. Vielleicht kann sich ja mal jemand mein Programm oder Teile des Quellcodes anschauen. Danke schon mal im Voraus.

Der Fehler könnte in diesem Teil des Programms liegen:

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:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
procedure TForm1.ErstelleWegPunkt(x,y: integer);
var a : Integer;
begin
    if i > 1 then // Erster Wegpukt überall setzbar
    begin
      if (Wegpunkt[i-1].getX = x) OR (Wegpunkt[i-1].getY = y) then  // Stimmt eine Koordinate des vorherigen Wegpunktes mit der der neuen überein?
      begin
        Wegpunkt[i] := TWegpunkt.Create(x,y); // Erstellen des Wegpunktes(TLabel)
        Wegpunkt[i].Caption := ' ' + inttostr(i);
        BodenTexturZeichnen((x -20div size + 1, (y -20div size + 1'Weg'); // Zeichnen der Textur auf seinen Koordinaten
        
        listbox1.items.add(inttostr(i));                 // Nummer und Koordinaten ausgeben
        listbox2.Items.add(inttostr(Wegpunkt[i].getX));
        listbox3.items.add(inttostr(Wegpunkt[i].getY));

        if Wegpunkt[i].getX = Wegpunkt[i-1].getX then    // Stimmt die X-Koordinate überein?
        begin
          if Wegpunkt[i].getY > Wegpunkt[i-1].getY then  // Richtung überprüfen und Bodentextur zwischen beiden Wegpunkten zeichnen
          begin
            a := Wegpunkt[i-1].getY + 1;
            while a < Wegpunkt[i].getY do
            begin
              BodenTexturZeichnen((Wegpunkt[i].getX - 20div size + 1, (a- 20div size + 1'Weg');
              inc(a);
            end;
          end else
          begin
            if Wegpunkt[i].getY < Wegpunkt[i-1].getY then
            begin
              a := Wegpunkt[i-1].getY - 1;
              while a > Wegpunkt[i].getY do
              begin
                BodenTexturZeichnen((Wegpunkt[i].getX - 20div size + 1, (a - 20div size + 1'Weg');
                dec(a);
              end;
            end;
          end;
        end;

        if Wegpunkt[i].getY = Wegpunkt[i-1].getY then     // Stimmt die Y-Koordinate überein?
        begin
          if Wegpunkt[i].getX > Wegpunkt[i-1].getX then   // Richtung überprüfen und Bodentextur zwischen beiden Wegpunkten zeichnen
          begin
            a := Wegpunkt[i-1].getX + 1;
            while a < Wegpunkt[i].getX do
            begin
              BodenTexturZeichnen((a - 20div size + 1, (Wegpunkt[i].getY - 20div size + 1'Weg');
              inc(a);
            end;
          end else
          begin
            if Wegpunkt[i].getX < Wegpunkt[i-1].getX then
            begin
              a := Wegpunkt[i-1].getX - 1;
              while a > Wegpunkt[i].getX do
              begin
                BodenTexturZeichnen((a - 20div size + 1, (Wegpunkt[i].getY - 20div size + 1'Weg');
                dec(a);
              end;
            end;
          end;
        end;

        inc(i);              // i erhöhen
      end else
        showmessage('Das ausgewählte Feld ist nicht waagerecht oder senkrecht vom vorherigen erreichbar! Bitte wählen Sie ein anderes.');
    end else
    begin
      Wegpunkt[i] := TWegpunkt.Create(x,y);                            // Erstellen des Wegpunktes(TLabel)
      Wegpunkt[i].Caption := ' ' + inttostr(i);
      BodenTexturZeichnen((x -20div size + 1, (y -20div size + 1'Weg');   // Zeichnen der Textur auf seinen Koordinaten

      Monster.Left := Wegpunkt[i].getX;                       // Monster(TButton) auf den ersten Wegpunkt setzen
      Monster.Top := Wegpunkt[i].getY;
      Monster.Visible := true;

      listbox1.items.add(inttostr(i));                        //Nummer und Koordinaten ausgeben und anwählen
      listbox2.Items.add(inttostr(Wegpunkt[i].getX));
      listbox3.items.add(inttostr(Wegpunkt[i].getY));

      listbox1.itemindex := 0;
      listbox2.itemindex := 0;
      listbox3.itemindex := 0;

      inc(i);           // i erhöhen
    end;
end;

oder hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.BodenTexturZeichnen(X, Y : Integer; T : String);
begin
  Hintergrund.BringToFront;
  BodenTextur[X, Y] := TImage.Create(Nil);
  BodenTextur[X, Y].Parent := Self;
  BodenTextur[X, Y].Width := 39;
  BodenTextur[X, Y].Height := 39;
  BodenTextur[X, Y].Picture.Create;
  BodenTextur[X, Y].Picture.LoadFromFile(T + '.jpg'); //'stein'+IntToStr(random(4)+1)+'.bmp'
  BodenTextur[X, Y].AutoSize := true;
  BodenTextur[X, Y].Top := (Y-1) * size + 11;
  BodenTextur[X, Y].Left := (X-1) * size + 11;
  BodenTextur[X, Y].Refresh;
end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Moderiert von user profile iconNarses: Inline- in normalen Anhang umgewandelt.


Lannes - So 04.10.09 21:44

Hallo,


Delphi-Quelltext
1:
2:
3:
4:
5:
while a > Wegpunkt[i].getX do
  begin
    BodenTexturZeichnen((a - 20div size + 1, (Wegpunkt[i].getY - 20div size + 1'Weg');
    dec(a);
  end;

Mit dec(a) dekrementierst du um jeweils 1(Pixel), die Prozedure BodenTexturZeichnen erstellt also für jeden Pixel ein eigenes TImage, noch dazu wird jedesmal -immer die gleiche- Bild-Datei erneut von der Festplatte geladen.

Wie groß ist/wird den das Array BodenTextur[] das die TImages verwaltet?


h00ligan - Mo 05.10.09 15:43

hey danke

hat geholfen was du mir geschrieben hast:

habe jetzt in dem code jeweils dec(a) oder inc(a) in dec(a, size) und inc(a, size) geändert

jetzt läuft alles :)