Autor Beitrag
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: So 29.12.13 14:16 
Hallo,

EDIT: Ich habe das Problem nun selbst gelöst. Der Fehler lag darin, dass ich die alten Koordination nicht gespeichert hatte.

Ich habe für ein Spiel einen Editor gebaut. Im Editor kann man einzelne Elemente wie Figuren auf einem Schachbrett platzieren. Bisher war das Setzen der Elemente nur durch Klick auf die linke Maustaste möglich. Nun möchte ich, dass es möglich ist, einen Rahmen (z.B. einen Kreis) für ein Element zu zeichnen und dann durch Klick innerhalb des Kreises die gesammte Fläche mit dem Rahmen-Element zu füllen. Hierbei ist es egal, welche Elemente sich innterhalb des Kreises befinden.

Hier mein Code, der nun funktioniert. Vorher wurden nicht immer alle Felder ausgefüllt.

ausblenden volle Höhe 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:
//Überprüft, ob die Koordinaten eines Nachbarfeldes im gültigen Bereich liegen.
//Das Spielfeld ist ein Raster 0..39 X-Achse und 0..21 Y-Achse (Array of Byte)

Function GetNewCoord(Var X,Y:Integer; Element:Byte; Direction:Byte):Boolean;
Var TmpX,TmpY:Integer;
Begin
Result:=False;

TmpX:=X;
TmpY:=Y;

Case Direction of
1: Dec(TmpY); //Oben
2: Inc(TmpX);   //rechts
3: Inc(TmpY);    //unten
4 : Dec(TmpX);   //links
End;

IF (TmpX>=0AND (TmpX<=39AND (TmpY>=0AND (TmpY<=21then
   BEGIN
   IF Map.ReadFieldStatus(TmpX,TmpY)<>Element then //Liest den Status des Feldes
      BEGIN
       Result:=True;
       X:=TmpX;
       Y:=TmpY;
      END;
   END;
End;

//Füllt die vom Element begrenzte Fläche mit dem Element.
//X,Y ist der Ausgangspunkt

Procedure FloodfillElement(X,Y:Integer; Element:Byte);
Var BackX,BackY:Integer;
    Direction:Integer;
Begin
Direction:=1;
   Repeat
     BackX:=X;
     BackY:=Y;
     IF GetNewCoord(X,Y,Element,Direction) then
        BEGIN
          Map.SetFieldStatus(X,Y,Element,True); //Element setzen
          FloodFillElement(X,Y,Element);
          X:=BackX;
          Y:=BackY;
        END else
         Inc(Direction);
   Until Direction>4;
End;


Viele Grüße