Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit Floodfill? (https://www.delphipraxis.net/105512-problem-mit-floodfill.html)

nuellz 23. Dez 2007 11:41


Problem mit Floodfill?
 
Hallo,

ich hab irgendwie ein sehr seltsames Problem (Für mich zumindest^^)

Ich bin dabei ein Spiel zu programmieren, das so eine Mischung aus "Worms" und den normalen "Cannon"-Spielen ist. Es stehen also zwei Spieler in einer 2D Landschaft und können sich ein bisschen bewegen und sich gegenseitig beschießen. Zunächst wurde die Landschaft entweder aus einer externen Bitmap-Datei in das Spielfeld geladen oder selbst "gemalt". Jetzt hab ich jedoch zusätzlich die Möglichkeit eingebaut eine zufallsgenerierte Landschaft einzubauen. Hierfür werden zufällige Punkte erzeugt und miteinander verbunden, es entsteht also eine zackige Kurve - soweit sogut. Später hab ich aber den Bereich unter der Kurve mit FloodFill auch noch gefärbt wie es sich eben gehört :) . Als ich das Spiel dann ausprobiert hab, hat das Spiel plötzlich extrem gelaggt. Die Spieler und Geschosse bewegen sich durch ganz normale Timer und haben sich immer flüssig bewegt, seit dem FloodFill Befehl nicht mehr. Es liegt definitiv an diesem Befehl - wenn ich den rausnehme und nur die Kurve zeichne läuft es wunderbar. Dabei wird die Prozedur mit dem Floodfill während der Spieler/Geschossbewegung gar nicht mehr aufgerufen? Ist mit völlig unverständlich, aber vielleicht kann mir ja hier wer helfen^^.

Hier noch der Code:

Delphi-Quellcode:


   paintbox1.canvas.brush.color:=farbe;
   paintbox1.Canvas.pen.style:=psclear;
   paintbox1.Canvas.Rectangle(0,0,paintbox1.width+1,paintbox1.height+1);
 
        //Hier wird das Spielfeld (Paintbox1) erstmal komplett mit "farbe" übermalt (farbe ist die defininierte Hintergrundfarbe,
        //auf die die Geschosse nicht reagieren, bei allen anderen Farben explodieren sie)

    paintbox1.canvas.Pen.style:=pssolid;
    paintbox1.canvas.Pen.color:=clblack;


   paintbox1.canvas.moveto(0,paintbox1.height-350+random(310));
   //Anfangspunkt wird gesetzt

   for j:=1 to trunc(paintbox1.width/80) do paintbox1.canvas.lineto(j*80,paintbox1.height-350+random(310));
   //Die Linie wird gezeichnet

   paintbox1.canvas.lineto(paintbox1.width+1,paintbox1.height-350+random(310));
   //Die linie wird bis zum Endpunkt gezeichnet

   paintbox1.canvas.brush.color:=clblack;

   paintbox1.Canvas.FloodFill(3,paintbox1.height-3,clblack,fsborder); // <-- Dieser Befehl macht alles langsam :(


     timers.enabled:=true;
     timersr.enabled:=true;

 // Timer, die die Spieler von oben fallen lassen, bis sie auf Landschaft "treffen" werden gestartet, laufen aber nicht flüssig
Ich weiß, dass das alles nicht so sauber programmiert ist, aber das ist mein erstes größeres Projekt und ich bin völlig ohne Logik rangegangen... Trotzdem kann ich mir nicht erklären, warum es auf einer Landschaft die so generiert ist, nicht genauso läuft wie auf jeder x-beliebigen Landschaft, da diese Prozedur die Landschaft ja nur einmal erstellt - und zwar schnell! und dann nie wieder aufgerufen wird...

oki 23. Dez 2007 12:45

Re: Problem mit Floodfill?
 
Hi,

wo rufst du denn die Zeichenmethode auf.
Du sagst, dass das nur einmal getan wird. Da ich aber den Zugriff auf deine Timer im Code sehe, vermute ich hier mal was anderes. Noramlerweise sollte die Verwendung eines Hintergrundbildes den Ablauf nicht bremsen. Aber das wird es nicht sein. Da du kein Bitmap zeichnest sondern deinen Hintergrund zur Laufzeit erstellst, mußt du ihn logischerweise jedesmal neu zeichnen wenn sich deine Sprites bewegen. Sonst wird er ja verwischt. Also denke ich mal, dass du das Zeichnen in der Paint-Procedure aufrufst. Dann wird nach jeder Bewegung deiner Figuren (Sprites) auch dein Hintergrund neu gezeichnet.

Gruß oki

nuellz 23. Dez 2007 13:44

Re: Problem mit Floodfill?
 
Ja das klingt irgendwie logisch...^^ Aber warum entsteht dieses Problem nur bei der zufallsgenerierten Landschaft? Ist der Floodfill-Befehl irgendwie besonders ressourcenverschwendend, so dass es laggt wenn er so oft aufgerufen wird? Bei den anderen Möglichkeiten wird der Hintergrund ja auch jede Tausendstel Sekunde neugezeichnet ohne dass es hängt!?

Und eigentlich viel wichtiger: Was kann ich dagegen tun? :)

dominikkv 23. Dez 2007 13:50

Re: Problem mit Floodfill?
 
wie gesagt, du zeichnest das hintergrundbild einmal in einen buffer, und dann beim neuzeichnen einfach immer aus dem buffer kopieren.

Dunkel 23. Dez 2007 13:53

Re: Problem mit Floodfill?
 
Stichwort: Offscreen-Bitmap. Zeichne Dein zufälliges Spielfeld ein mal (beim generieren) in ein temporäres Bitmap und verfahre dann mit diesem wie mit der externen Bitmap-Datei.

btw.: jede tausendstel Sekunde wird das Bild neu gezeichnet? IMHO reichen auch 25-60 Bilder pro Sekunde, das frisst nicht ganz so viel Prozessor-Leistung.

oki 23. Dez 2007 14:39

Re: Problem mit Floodfill?
 
Zitat:

Zitat von dominikkv
wie gesagt, du zeichnest das hintergrundbild einmal in einen buffer, und dann beim neuzeichnen einfach immer aus dem buffer kopieren.

So siehts aus.

Schönes Fest und Gruß

oki

nuellz 23. Dez 2007 14:57

Re: Problem mit Floodfill?
 
ok jetzt hab ichs.. oh man da hätt ich auch selbst drauf kommen können :wall:

Trotzdem Danke für die Hilfe! :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz