Abend,
in meinem Spiel dessen Trailer ich erst gezeigt hab, will ich machen das sich das Wasser ausbreitet wenn es auf keinen Widerstand stößt. Wie für normale Blöcke, verwende ich auch für die Wasserblöcke einen Grid. Also habe ich Funktionen geschrieben die eine freie Fläche mit einem Wert befüllt, bis an allen Seiten ein Widerstand ist. Also wie der Farbeimer in Paint.
Im Video könnt ihr sehen, dass das sehr lange dauert und mache Zellen nicht befüllt werden. Allerdings ist der Grid in meinem Example auch 1024 x 768 groß, pro Pixel eine Zelle. Ich denke für kleinere Grids sind meine Skripte gut brauchbar,die Präzesion kann man noch erhöhen was dann länger dauert aber eben bei kleineren Grids noch schnell genug gehen dürfte.
DIe Funktionsweise:
Ich habe drei Skripte geschrieben. SKript 1 füllt die Fläche mit einem Quadtrat, bis dieses am Rand anstößt. Dann werden umliegende Zellen Blockweise gefüllt wenn diese an dem Quadrat angrenzen. Im zweiten Skript mache ich das so, dass ich das feine Hauptgrid in gröbere Blöcke aufteile. Pro Block prüfe ich mit ds_grid_get_sum ob er leer ist, wenn ja befüll ich ihn. Dann werden die übrigig gebliebenen Blöcke an mein drittes Skript übergeben, dass die leeren Stellen pixelgenau füllt.
Also ich Teile die zubefüllende Fläche quasi in Planquadrate auf wo ich schau ob ein Quadrat in der Summe dem Wert entspricht der geändert werden darf. Dann kann ich das ganze Quadrat füllen und muss nur noch die Qaudrate die übrig bleiben pixelgenau prüfen und befüllen lassen. Eigentlich wollte ich ja googlen wie so eine Fill-Funktion in Paint oder Photoshop gemacht wurde, ob es da einen tollen Algorithmus gibt. Aber ich wollte es selber lösen, bin aber mit dem Ergebnis noch unzufrieden. Große Flächen sind nicht unbedingt ein Problem, da ich das "Grobe" ja mit dem Quadrat ausfüllen lasse. Aber bei großen Flächen mit einer komplexen Form dauert das Ganze dann schon ganz schön lang.
Vielleicht hat einer von euch ja die Idee, wie man das schneller und effektiver programmieren kann.