AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem mit Floodfill?
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Floodfill?

Ein Thema von nuellz · begonnen am 23. Dez 2007 · letzter Beitrag vom 23. Dez 2007
Antwort Antwort
nuellz

Registriert seit: 13. Dez 2007
6 Beiträge
 
#1

Problem mit Floodfill?

  Alt 23. Dez 2007, 12:41
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...
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Problem mit Floodfill?

  Alt 23. Dez 2007, 13:45
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
42
  Mit Zitat antworten Zitat
nuellz

Registriert seit: 13. Dez 2007
6 Beiträge
 
#3

Re: Problem mit Floodfill?

  Alt 23. Dez 2007, 14:44
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?
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Problem mit Floodfill?

  Alt 23. Dez 2007, 14:50
wie gesagt, du zeichnest das hintergrundbild einmal in einen buffer, und dann beim neuzeichnen einfach immer aus dem buffer kopieren.
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Benutzerbild von Dunkel
Dunkel

Registriert seit: 26. Mär 2007
Ort: Klingenstadt
541 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Problem mit Floodfill?

  Alt 23. Dez 2007, 14:53
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.
Es ist zu wahr um schön zu sein...
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Problem mit Floodfill?

  Alt 23. Dez 2007, 15:39
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
42
  Mit Zitat antworten Zitat
nuellz

Registriert seit: 13. Dez 2007
6 Beiträge
 
#7

Re: Problem mit Floodfill?

  Alt 23. Dez 2007, 15:57
ok jetzt hab ichs.. oh man da hätt ich auch selbst drauf kommen können

Trotzdem Danke für die Hilfe!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 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