2016-05-21 19 views
-1

Ich arbeite an einem Tetris-Spiel und muss es in einem WinAPI-Fenster zeichnen. Ich zeichne die Karte mit der Funktion FillRect() und lösche den Bildschirm mit einer selbstdefinierten Funktion, die auch FillRect() verwendet, um den Bildschirm zu löschen. Es funktioniert großartig, aber das Flackern bringt mich um! Ich habe alles versucht, was in meiner Macht steht. Ich habe versucht, das Fenster in der WM_PAINT-Nachricht neu zu streichen, aber es wirft ein anderes Problem auf, es malt nicht das Brett, das es vorher tat. Ich habe versucht, mein Board wieder mit der gleichen Prozedur zu malen, die ich verwendet habe, um das Fenster zu malen, aber ich kann nicht herausfinden, wie es geht. Ich habe die RECT-Struktur mit selbstdefinierten Koordinaten an die Paint-Funktion übergeben leerer Bildschirm. Irgendwelche Vorschläge würden sehr geschätzt. Sagen Sie mir, ob diese Frage noch geklärt werden muss.Win32 App flackert beim Versuch, neu zu zeichnen. Irgendwelche Vorschläge?

+0

'Sleep' macht das gleiche in einer Konsolenanwendung wie hier - blockiert den aktuellen Thread für einige Zeit. – chris

+0

Warum sollte 'Sleep()' nicht für Ihre Anwendung funktionieren? Benötigen Sie stattdessen einen Timer, um den GUI-Thread laufen zu lassen? –

+0

Vielleicht müssen Sie Ihren Code von der Geschäftslogik trennen, um zu steuern, wo Blöcke sind und Benutzereingaben akzeptieren? (verschiedene Themen) –

Antwort

1

Sleep() ist nicht spezifisch für die Konsole. Es ist nur die Standard-Windows-API, um die Ausführung des aktuellen Threads für eine bestimmte Zeit zu unterbrechen.

Sie sollten wahrscheinlich in Windows Timers schauen. Ein anderer praktikabler Ansatz und oft nützlich für Anwendungen mit geringer Latenz wie Spiele ist es, die Zeit bei jeder Iteration der Ereignisschleife einfach zu messen und das Spiel dadurch weiterzuentwickeln. Sie sollten dafür High Resolution Time Stamps verwenden, da die normale Systemwanduhrzeit springen kann, wenn die Systemuhr von der Internetnetzwerkzeit angepasst wird; Auch die Wanduhrzeit hat einen merklichen Jitter.

+0

Danke für diesen Vorschlag. Ich muss in Timers schauen, da ich zum ersten Mal an der win32-App arbeite. Ein weiteres Problem, das mich verwirrt, ist der Clearing-Bildschirm. Ich bin gegangen und habe eine eigene Funktion erstellt, indem ich mit FillRect() ein Rechteck gezeichnet habe, das ein weißes Rechteck von Fensterbreite und -höhe zeichnet, aber es flackert so stark, dass das Spiel nicht mehr spielbar ist. Jeder Vorschlag dazu wäre auch hilfreich und bitte gehen Sie nicht auf etwas Komplexes ein. –

+0

@UzairRiaz: Es gibt zwei wichtige Dinge zu beachten, wenn Sie ein Spiel für Windows schreiben: Wenn es Grafik schwer ist und viele Animationen tut: Verwenden Sie nicht das GDI! Es ist langsam und mühsam für das Schreiben von Spielen; Verwenden Sie stattdessen DirectX oder OpenGL. Der andere wichtige Punkt ist, dass Sie Ihr Fenster ohne Hintergrund-Pinsel-Set erstellen müssen (unabhängig davon, ob Sie GDI, DX oder GL verwenden), um genau dieses Flimmern zu vermeiden. - * Natürlich wäre das Beste, die Win32-API nicht direkt zu verwenden und stattdessen auf ein Spielanwendungs-Framework wie SDL oder SFML zu vertrauen. * – datenwolf

+0

Irgendwelche Vorschläge, wie ich ein Fenster ohne Hintergrundpinsel erstellen könnte? Ich habe versucht, mit der hbrBackground-Eigenschaft meines Fensters zu basteln, konnte aber nicht genau herausfinden, was zu tun ist. –

Verwandte Themen