![]() |
Delphi-Version: XE7
Billardspiel: Paintbox flackert trotz Doublebuffer
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Community!
Ich arbeite derzeit an einem Spiel, das "Billard" heißt. Name ist Programm, man soll damit Billard, als 2D-Spiel spielen können. Die Physik ist nicht das Problem, die Stöße, etc. laufen super! Das Problem ist die Anzeige/Visualisierung des ganzen. Meine Idee war es, eine TImage Komponente als Hintergrund/Spielfeld zu nehmen und eine TPaintBox Komponente um die Kugel(-bewegungen) darstellen zu können. Leider flackert die PaintBox erheblich und stört das optische Erscheinungsbild. Dies liegt meiner Theorie nach daran, dass ich die PaintBox immer, vor erneutem zeichnen, leere (mit PaintBox.Refresh)... Auch die Beschriftungen von Komponenten (LabeledEdit) verschwinden während der Laufzeit und dort ist dann nur ein weißer Kasten zu sehen... Weiß einer was da falsch laufen könnte? Es ist auch komisch, dass es schon flackert, bevor ich die Prozedur, wo das onpaint Ereigniss enthalten ist, aufrufe. Jetzt meine Frage: gibt es eine andere Möglichkeit, die PaintBox zu leeren? Bzw eine Mögichkeit das "flackern" abzustellen? Doublebuffer ist bereits in der Form auf true gesetzt. ... das PaintBox 'OnPaint' Ereignis ....
Delphi-Quellcode:
... hier der Stoss ...
procedure TFormBillard.PtBxSpielfeldPaint(Sender: TObject);
var I,x1,y1,x2,y2: Integer; begin // PtBxSpielfeld.Refresh; with PtBxSpielfeld.Canvas do begin Pen.Color := clBlack; Brush.Color := clRed; // Brush.Style := for I := 1 to 16 do begin if I = 8 then Brush.Color := clBlue; if I = 15 then Brush.Color := clBlack; if I = 16 then Brush.Color := clWhite; x1 := Round(Physik.x(i) - rKugel); y1 := Round(Physik.y(i) - rKugel); x2 := Round(Physik.x(i) + rKugel); y2 := Round(Physik.y(i) + rKugel); PtBxSpielfeld.Canvas.Ellipse(x1,y1,x2,y2); end; end; end;
Delphi-Quellcode:
Die .pas ist als Anhang dabei...
procedure TFormBillard.Stoss(Sender: TObject);
var btnsel, Frames : Integer; StartQueryIn, StartQueryIn2, StartQueryOut : Cardinal; begin if (xStoss <> 0) or (yStoss <> 0) then begin // Zeit initialisieren QueryTimeCount := 0; //Auslenkunk Physik.anstoss(-xStoss, -yStoss); //Äußere Schleife Zeit messen StartQueryOut := GetTickCount; //Schleife starten (Auslenkungbewegun mit Physik) while Physik.abbruch = false do begin //Beginn Zeitmessen innere Schleife StartQueryIn := GetTickCount; //Frame über Zeit berechnen Physik.frame_berechnen(QueryTimeCount/1000); // wenn mehr als 33 ms vergangen -> 30 FPS if (GetTickCount - StartQueryIn2 > 33.3) then begin //Anzeige aktualisieren -> Werte aus Physik anzeigen PtBxSpielfeldPaint(Sender); StartQueryIn2 := GetTickCount; end; //Stopp Zeitmessen innere Schleife QueryTimeCount := GetTickCount - StartQueryIn; end; //Auswertung, überprüfen {und so weiter ... } Danke für jeden Tipp oder Hinweis, ich bin echt am verzweifeln!! |
AW: Billardspiel: Paintbox flackert trotz Doublebuffer
Probier mal Canvas.BeginScene und EndScene mit einzubauen.
Rolllo |
AW: Billardspiel: Paintbox flackert trotz Doublebuffer
Alles klar, ich belese mich dazu mal und versuche es!
Dank dir schon mal :) |
AW: Billardspiel: Paintbox flackert trotz Doublebuffer
Bei einem normalen TCanvas in VCL braucht man das eigentlich nicht, sofern der code in der OnPaint geschrieben ist. Korrigiert mich, wenn ich da falsch liege.
|
AW: Billardspiel: Paintbox flackert trotz Doublebuffer
Das OnPaint im Beispiel schein aber nicht der echte OnPaint Event zu sein, weil er keinen Canvas übergibt.
Ich würde auch empfehlen den ![]() Rollo |
AW: Billardspiel: Paintbox flackert trotz Doublebuffer
Normalerweise hilft es auch sehr wenn man alles erst auf ein Bitmap zeichnet und dann nur das Bitmap in einem Rutsch auf das Canvas malt.
|
AW: Billardspiel: Paintbox flackert trotz Doublebuffer
Liegt die Paintbox auf einem anderen WinControl, z.B. einem Panel?
Dann muss DoubleBuffered nicht nur für die Form gesetzt werden, sondern für alle Wincontrols auf denen die Paintbox liegt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz