Registriert: Do Jan 02, 2003 13:38 Beiträge: 104 Wohnort: Bremen
Hiho liebe Freunde der Sonne,
das Wort am Donnerstag Abend habe ich. Es ist 18.35 und hier ist mein Problem:
Weniger ein Problem, mehr eine technische Frage Wenn ich für meinen kleinen 2D-weltraumshooter die bewgungen mit OnKeyDown und if key = vk_left und so abfrage, dann gibt es eine lästige Verzögerung wenn der Spieler die Taste gedrückt hält. Man kann so nicht vernünftig ausweichen.
Also wenn jemand Rat weiß, nicht zögern zu posten
Howi
_________________ -------------------------------------------------------
<br>Wer andern eine Brawurst brät,
<br>hat ein Bratwurst Bratgerät......
<br>
<br>So long, Howard ^^
<br>-------------------------------------------------------
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Probiers mal mit GetAsyncKeyState().Näheres dazu findest du in der Windows SDK-Hilfe.
Wenn man eine vernünftige Tastaturabfrage in nem Echtzeitcomputerspiel realisieren will, dann ist das eigentlich die einzige vernünftige Lösung.
Registriert: Sa Nov 02, 2002 18:06 Beiträge: 299 Wohnort: Dresden
Hmm, ich bei mir nich das Problem.Versuchs mal so:
Im Keydown
Code:
keys[Key] := true; //Keys ist array[0..255] of boolean
Im Keyup:
Code:
keys[Key] := false;
In einem bestimmten Zeitraum guckst du dann einfach nach, on eine Taste gedrückt ist und handelst dementsprechent. Ich hoffe du verwendest das nicht schon so.
_________________ "Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"
Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
Weil es unabhaengig von der Nachrichtenverarbeitung von Windows ist. GetAsyncKeyState liefert halt den Status bei der Abfrage und nicht, ob kurz vorher die Taste betätigt wurde.
Ablauf ist wie folgt:
1) Anwender drückt die Taste nieder
2) Windows stellt die WM_KEYDOWN in die Nachrichtenqueue ein
3) Mit DispatchMessage(msg) wird die diese Nachricht in der VCL an das aktive Formular/Fenster weitergeleitet
4) Anwender läßt die Taste los
5) Windows stellt die WM_KEYUP in die Nachrichtenqueue ein
6) Mit DispatchMessage(msg) wird die diese Nachricht in der VCL an das aktive Formular/Fenster weitergeleitet
Wenn der Schritt 3 und 6 nicht ausgeführt werden können, z. B. weil das Programm Daten berechnet oder anderweitig beschäftigt, landen mehrere dieser Nachrichten in der Nachrichtenqueue und werden dann auf einmal abgearbeitet. Dadurch kommt es zu diesem Effekt, das der Anwender die Taste losgelassen hat, das Schiff sich aber immer noch bewegt.
Dies ist sehr vereinfacht, aber die Abarbeitungen der Botschaften verläuft so.
... nur dann, wenn die Darstellung der Szene außerhalb der Botschaftswarteschlange erfolgt. Ich halte es für eleganter, die Szene im WM_PAINT Ereignis zu zeichnen, und dieses Ereignis immer dann auszulösen, wenn gerade nichts zu tun ist (entweder im IDLE Event oder in einer MessageHandling Schleife).
Dann "gibt" es keine asynchronen Ereignisse, und es ist auch kein Problem mehr, wenn das Fenster manchmal auch neu gezeichnet wird, ohne dass man in die Hauptschleife kommt (z.B. bei Größenänderungen)
Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
Warum sollte es eleganter sein auf die WM_PAINT - Nachricht zu reagieren?
Verschicke ich die Nachricht mit SendMessage, dann kann ich selber die Methode/Funktion zum neuzeichnen aufrufen.
Verschicke ich die Nachricht mit PostMessage, also asyncron, bin ich wieder abhaengig von der Botschaftsverarbeitung, insofern das in der Zwischenzeit keine Nachricht eingetroffen ist, die zuerst oder bevorzugt behandelt werden.
Klar, solange du IN deiner Programmschleife bist, macht es keinen großen Unterschied, da du dann ja ohnehin aus deiner Programmlogik entscheidest, ob das Fenster neu gezeichnet wird (oder eben nicht) (außer dass du dich halt in die Botschaftswarteschlange einordnest) - ich invalidiere zu diesem Zweck übrigens einfach den gesamten Fensterinhalt, und lasse Windows entscheiden, wann das Fenster nun tatsächlich neu gezeichnet wird.
Aber zieh' mal das Fenster größer, wenn du nicht auf WM_PAINT reagierst ...
Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
Ich würde sagen, es hängt von der Anwendung ab. In einem Spiel, in dem eine möglichst gleichmäßige FPS gefordert ist, bestimme ich lieber, wann was gezeichnet wird. Da Größenänderung eher selten sind, reagiere ich einfach die WM_SIZE - Nachricht.
Bei einem Editor, wie z. B. deinem MCAD, ist das Zeichnen in der WM_PAINT die bessere Lösung.
Aber das ist wohl ein Thema, das von jeden etwas anders gesehen wird.
KidPaddle
PS.: Bin gespannt auf die Version 2.0 von Dir. Die alte 1.4 ist schon klasse.
Mitglieder in diesem Forum: Google [Bot] und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.