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!!