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.
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:
| 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); 2: Inc(TmpX); 3: Inc(TmpY); 4 : Dec(TmpX); End;
IF (TmpX>=0) AND (TmpX<=39) AND (TmpY>=0) AND (TmpY<=21) then BEGIN IF Map.ReadFieldStatus(TmpX,TmpY)<>Element then BEGIN Result:=True; X:=TmpX; Y:=TmpY; END; END; End;
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); FloodFillElement(X,Y,Element); X:=BackX; Y:=BackY; END else Inc(Direction); Until Direction>4; End; |
Viele Grüße