AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Billardspiel: Paintbox flackert trotz Doublebuffer

Billardspiel: Paintbox flackert trotz Doublebuffer

Offene Frage von "Blup"
Ein Thema von majornudelholz · begonnen am 17. Mär 2017 · letzter Beitrag vom 23. Mär 2017
Antwort Antwort
Benutzerbild von majornudelholz
majornudelholz

Registriert seit: 22. Nov 2015
15 Beiträge
 
Delphi XE7 Professional
 
#1

Billardspiel: Paintbox flackert trotz Doublebuffer

  Alt 17. Mär 2017, 16:59
Delphi-Version: XE7
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:
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;
... hier der Stoss ...
Delphi-Quellcode:
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 ... }
Die .pas ist als Anhang dabei...

Danke für jeden Tipp oder Hinweis, ich bin echt am verzweifeln!!
Angehängte Dateien
Dateityp: pas USpiel.pas (5,9 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#2

AW: Billardspiel: Paintbox flackert trotz Doublebuffer

  Alt 18. Mär 2017, 06:31
Probier mal Canvas.BeginScene und EndScene mit einzubauen.

Rolllo
  Mit Zitat antworten Zitat
Benutzerbild von majornudelholz
majornudelholz

Registriert seit: 22. Nov 2015
15 Beiträge
 
Delphi XE7 Professional
 
#3

AW: Billardspiel: Paintbox flackert trotz Doublebuffer

  Alt 18. Mär 2017, 19:14
Alles klar, ich belese mich dazu mal und versuche es!

Dank dir schon mal
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
481 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Billardspiel: Paintbox flackert trotz Doublebuffer

  Alt 22. Mär 2017, 22:10
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.
Dennis
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#5

AW: Billardspiel: Paintbox flackert trotz Doublebuffer

  Alt 23. Mär 2017, 08:32
Das OnPaint im Beispiel schein aber nicht der echte OnPaint Event zu sein, weil er keinen Canvas übergibt.

Ich würde auch empfehlen den richtigen OnPaint zu nehmen, und dann nicht direkt auf die Objekte zuzugreifen, sondern nur über den Canvas vom Parameter.

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Billardspiel: Paintbox flackert trotz Doublebuffer

  Alt 23. Mär 2017, 09:19
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Billardspiel: Paintbox flackert trotz Doublebuffer

  Alt 23. Mär 2017, 10:44
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:12 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