Autor Beitrag
luckyluc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Mo 13.12.10 17:57 
Hey!
Ich möchte ein Spiel programmieren, das snake ähnelt. das problem was ich im moment habe, ist, dass die steine die beim programm start zu sehen sind jedoch flackern, d.h sie sollen eigentlich nur einmal erzeugt werden jedoch werden die im moment noch immer wieder neu gezeichnet (was nicht so sein sollte). ich denke diese steinezeichen schleife müsste in formcreate rein, doch dann werden gar keine steine mehr gezeichnet. Hat jmd. eine Idee? Außerdem flackert im hintergrund immer ein rechteckiger kasten, was auch nicht sein sollte.
Danke!


Moderiert von user profile iconMartok: Topic aus Sonstiges (Delphi) verschoben am Di 21.12.2010 um 21:48
Einloggen, um Attachments anzusehen!
Milchbubi
Hält's aus hier
Beiträge: 8
Erhaltene Danke: 2

Win XP, Win 7
Delphi 7 PE, Delphi 10 Pro.
BeitragVerfasst: Mo 13.12.10 18:19 
hallo

Könntest du bitte das ganze Projekt hochladen dann ist es für mich einfacher.

versuche es aber mal mit:

Form1.DoubleBuffered := true;

in der FormCreate prozedur.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 13.12.10 23:26 
Das Problem ist, dass du nicht OnPaint der PaintBox benutzt. Dort sollte alles gezeichnet werden. Wenn ein Neuzeichnen notwendig ist, kannst du das mit Invalidate auslösen.

Dafür benutzt du am besten eine Hintergrundbitmap, an der du alle Änderungen machst. Diese kannst du dann in OnPaint einfach auf die PaintBox kopieren.

Das Flackern rührt einfach davon her, dass du einzelne Teile direkt auf der PaintBox neu zeichnest.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mo 13.12.10 23:40 
Ich denke mal, das könnte helfen: www.michael-puff.de/...ffScreenBitmap.shtml ;)

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.12.10 00:46 
Aber vorsicht: www.delphipraxis.net...kern-von-delphi.html Beitrag 8 ist der entscheidende.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.12.10 00:55 
Es sollte mit BeginPaint bzw. GetUpdateRect aber möglich sein, festzustellen welcher Bereich aktualisiert werden muss. Wenn man dann nur diesen aus der Hintergrundbitmap kopiert (und bei eigenen Updates auch nur den betreffenden), sollte das Problem nicht auftreten (nehme ich an).

Vielleicht probiere ich das auch mal aus, ich hab da ein geeignetes Projekt als Kandidat.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.12.10 01:27 
Moment, aber du blittest ja das gesamte Bitmap auf das Fenster. Also, wenn man diesen Code verwendet: www.michael-puff.de/...ffScreenBitmap.shtml

Ich habe das hier noch mal zusammengefasst: www.michael-puff.de/...ubleBuffer-RDP.shtml
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.12.10 01:34 
Ich mache es nicht so, ich kopiere nur den geänderten Ausschnitt.

Allerdings mache ich es bisher so, dass ich zwar mit InvalidateRect arbeite (bei einem eigenen Control allerdings), aber nicht beim Zeichnen die aktuelle Zeichenregion beachte. Ich denke, wenn ich das auch noch mache, ist das trotz OffscreenBitmap auch bei RDP passend.
luckyluc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Di 21.12.10 22:15 
@jaenicke:
ich verstehe nicht, wie ich das jetzt umsetzten soll: was ist onpaint? (sorry, aber die delphihilfe gibt mir darüber nicht wirklich aufschluss). und wie soll das kopieren von der hintergrundbitmap in onpaint funktionieren? Hast du da vlt. ein Beispielcode für mich, damit ich das von dir beschriebene in einen quelltext umsetzten kann?
Danke!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 21.12.10 22:37 
Michael hat sein Beispiel dazu ja schon verlinkt und user profile iconDude566 vorher auch schon:
www.michael-puff.de/...ffScreenBitmap.shtml

OnPaint ist das Ereignis der (in diesem Fall) PaintBox, das ausgelöst wird, wenn die PaintBox neugezeichnet werden muss.