Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi flackerfreies repaint (https://www.delphipraxis.net/98124-flackerfreies-repaint.html)

dajuhsa 21. Aug 2007 22:52


flackerfreies repaint
 
Liste der Anhänge anzeigen (Anzahl: 1)
SALVETE !!
also ich arbeite an einem Spiel, wo man einen bunten Ball steuern kann (s. Anhang)
alles ohne Komponenten sondern mit Canvas.StretchDraw
Wie man sieht hinterlässt der Ball eine Spur die ich gerne vermeiden möchte aber wenn ich vor dem Zeichnen Repaint mache,
flackert es ständig :wall: (bei Refresh etwas weniger), hat vielleicht jemand ne idee wie ich das lösen könnte? :gruebel:
Steuerung:
A, <- um nach links zu rollen
D, -> um nach rechts zu rollen
Esc zum Beenden.
Bitte seht es euch mal an
Schonmal Danke für eure Hilfe

turboPASCAL 21. Aug 2007 23:05

Re: flackerfreies repaint
 
:gruebel: Hier im Forum suchenflackern ?

dajuhsa 21. Aug 2007 23:09

Re: flackerfreies repaint
 
sagen wir mal ~5 mal in der sekunde:
-Bildschirm wird weiß
-Bildschirm zeigt Ball
-Bildschirm wird weiß

sorry falls das falsch rüberkam

jim_raynor 21. Aug 2007 23:20

Re: flackerfreies repaint
 
Ein Offscreen-Bild dürfte dir helfen. Heisst du zeichnest nicht direkt in die Canvas der Form sondern in ein Bitmap und anschließend zeichnest du das gesamte Bitmap auf die Form.

DelphiKlaus 22. Aug 2007 06:46

Re: flackerfreies repaint
 
Hallo,

u.U. ist es auch möglich, mit DoubleBuffered zu arbeiten. Damit wird das Bild erst im Hintergrund aufbereitet und wenn es fertig ist, dargestellt. Erfordert keine Programmänderungen außer dem Hinzufügen einer Zeile Komponente.DoubleBuffered := True

dajuhsa 22. Aug 2007 11:15

Re: flackerfreies repaint
 
Liste der Anhänge anzeigen (Anzahl: 1)
also ich habe:
MainBit: TBitmap
-wird zu programmstart createt und ein Bild aus ressource reingeladen (der ball)(und im ondestroy wieder free)
SpinBit: TBitmap
-Da wird das MainBit gedreht reingezeichnet und das SpinBit dann mit StretchDraw auf die Form.Canvas(der gedrehte ball)
Doublebuffered steht schon längst auf true :|
Delphi-Quellcode:
procedure TForm1.Render;
begin
  PlrBitSpin := TBitmap.Create;
  try
    RotateBitmap(PlrBitSpin, PlrBitMain, Winkel, clWhite,
                 false, true);
    Canvas.StretchDraw(
      rect(Position.X-25, Position.Y-25, Position.X+25, Position.Y+25),
      PlrBitSpin
                      );
  finally
    PlrBitSpin.Free;
  end;
end;
Delphi-Quellcode:
procedure TForm1.Run;
begin
  Timer := GetTickCount;
  while GetAsyncKeyState(VK_ESCAPE)=0 do
  begin
    while Timer + Interval > GetTickCount do // Zeitbremse
      Application.ProcessMessages;          // Pseudo-Timer
    Input;                                  // Reagiert auf 'a' und 'd'
    Winkel := Winkel + Speed;               // Ball dreht sich
    Position.X := Position.X + Speed;       // Ball bewegt sich
    if Position.X < 0 then Position.X := 0;
    if Position.X > screen.Width then Position.X := screen.Width;
    Render;                                 // Ball zeichnet sich
  end;
  Close;
end;
nur mal als ansatz. wenn ihr mehr braucht zeig ich euch auch gern alles.

[Edit] @Jim: wie soll das gehen :gruebel: mit Bitmap.Canvas komm ich nicht weiter, könntest du mir bitte eventuell ein bisschen code opfern? [/Edit]
Edit :oops: : bin jetz n bisschen weiter aber wie man sieht blitzt es immer noch und man sieht noch zu viel weiß. helft mir bitte


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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