[Delphi] Losse Image bewegen...

Pagina: 1
Acties:

  • Delpix
  • Registratie: September 2001
  • Laatst online: 27-11-2021

Delpix

Alanis Fan

Topicstarter
Gister ben ik eens een simpel programma gaan maken waarmee je een stadsbus kan aansturen (ik vervelde me...) Die stadsbus is gewoon een losse Timage die over het scherm word bewogen door een TTimer. Maar als die image beweegt treed er flikkering op. Ik heb ook eens gelezen hoe je dat verkomen kan maar ik kan dit niet meer terugvinden.

Hoe kan ik dus die (irri) flikkering voorkomen?

...beter bekend als AMFan


  • Engineer
  • Registratie: Juni 2001
  • Laatst online: 04-05 00:03

Engineer

Software

.

[ Voor 100% gewijzigd door Engineer op 13-10-2018 15:41 ]


Verwijderd

Op woensdag 16 januari 2002 14:58 schreef Delpix het volgende:
Gister ben ik eens een simpel programma gaan maken waarmee je een stadsbus kan aansturen (ik vervelde me...) Die stadsbus is gewoon een losse Timage die over het scherm word bewogen door een TTimer. Maar als die image beweegt treed er flikkering op. Ik heb ook eens gelezen hoe je dat verkomen kan maar ik kan dit niet meer terugvinden.

Hoe kan ik dus die (irri) flikkering voorkomen?
TImage en daarbij behorende Canvas zijn nogal traag.

Met de BitBlt en GetDC API's kun je al verbluffende resultaten krijgen. Of je hier de flikkering mee weg krijgt is mij niet duidelijk maar waarschijnlijk gaat het een stuk beter.

Je kan dan bijv. een Bitmap op een DeviceContext plakken. Voor het opnieuw tekenen op een andere positie laat je het plaatje op de oude positie opnieuw tekenen (met bijv. XOR o.id.) en daarna teken je het nieuwe plaatje zodat je een animatie effect krijgt.

Mocht het nog steeds flikkeren/knipperen dan raad ik je aan om met DirectX of OpenGL aan de slag te gaan.

Verwijderd

Je doet
Image1.Visible := False;

En dan heel vaak
form1.canvas.draw(200-x,10,Image1.Picture.Bitmap);

Dan even zorgen dat je plaatje aan de achterkant dezelfde kleur heeft als de achter grond van je form zodat je geen sporen achter laat en dan rijd ie al een stuk soepeler.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 08:06

Tomatoman

Fulltime prutser

Probeer eens of
code:
1
MijnImage.ControlStyle := MijnImage.ControlStyle + [csOpaque];

wat uitmaakt.

En kijk eens of je Repaint kunt vervangen door Update.
Call Repaint to force the control to repaint its image immediately. If the ControlStyle property includes csOpaque, the control paints itself directly. Otherwise, the Repaint method calls the Invalidate method and then the Update method so that any visible portions of controls beneath the control will be repainted as well.
Update werkt sneller dan Invalidate, want het client-gebied wordt niet eerst uitgewist met een wit of grijs vlak.

Wat ook nog uitmaakt, is je Image component vervangen door een bitmap, die je in runtime creëert. Dat scheelt overhead.

Een goede grap mag vrienden kosten.


Verwijderd

code:
1
MijnImage.ControlStyle := MijnImage.ControlStyle + [csOpaque];

En kijk eens of je Repaint kunt vervangen door Update.

Update werkt sneller dan Invalidate, want het client-gebied wordt niet eerst uitgewist met een wit of grijs vlak.
Ik denk niet dat je met een image wilt blijven slepen, dit blijf je zo wel doen, blijft toch flikkeren al kan je het zo wel wat reduceren.
Wat ook nog uitmaakt, is je Image component vervangen door een bitmap, die je in runtime creëert. Dat scheelt overhead.
Of je gebruikt gewoon de bitmap die al door je image wordt aangemaakt, zolang je die maar zelf met canvas.draw of met copyrect op een canvas pleurt gaat dat vrij flikker vrij.

  • Delpix
  • Registratie: September 2001
  • Laatst online: 27-11-2021

Delpix

Alanis Fan

Topicstarter
thx voor de reacties. Ik zal vanavond eens wat uitproberen.

...beter bekend als AMFan


Verwijderd

Plaats een TPaintBox op je form en zorg dat je hier alles op paint. Maak ook een buffer (gewoon een TBitmap) en teken hier alles op. Als alles getekend is doe je:
code:
1
  PaintBox1.Canvas.Draw(0,0,BufferBitmap);

Zo niet knipperdeknipper!

Verwijderd

Nog een oplossing; knippervrij maar resource vretend.

Plak een formulier boven op een ander formulier, iets als:
code:
1
2
3
4
5
  procedure TForm1.ButtonClick(Sender: TObject);
  begin
    Form2:=TForm2.Create(Self);
    Form2.Parent:=Self;
  end;

Zorg er nu voor dat de nieuwe Form het plaatje bevat en dat deze geen border en -icons heeft. Als je het formulier nu beweegt met behulp van Left en Top krijg je een animatie effect.

Btw: je kan zo'n formulier zelfs transparant maken.

  • Delpix
  • Registratie: September 2001
  • Laatst online: 27-11-2021

Delpix

Alanis Fan

Topicstarter
Op donderdag 17 januari 2002 12:15 schreef Ingollus het volgende:
Plaats een TPaintBox op je form en zorg dat je hier alles op paint. Maak ook een buffer (gewoon een TBitmap) en teken hier alles op. Als alles getekend is doe je:
code:
1
  PaintBox1.Canvas.Draw(0,0,BufferBitmap);

Zo niet knipperdeknipper!
Zo heb ik het opgelost, ja (al dan niet met een paintbox maar met de form canvas). Rijdt de bus eindelijk knippervrij.

;)

eigen best een simpele oplossing...dat ik daar niet aan dacht... :Z

...beter bekend als AMFan

Pagina: 1