Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 03:53

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Tasten-Abfrage
BeitragVerfasst: Do Jan 30, 2003 18:35 
Offline
DGL Member
Benutzeravatar

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>-------------------------------------------------------


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 30, 2003 18:38 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 30, 2003 18:44 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2.  
  3. keys[Key] := true; //Keys ist array[0..255] of boolean
  4.  
  5.  

Im Keyup:
Code:
  1.  
  2.  
  3. keys[Key] := false;
  4.  
  5.  

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"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 30, 2003 19:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
GetAsyncKeyState ist aber besser. 8)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 30, 2003 20:05 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Zitat:
GetAsyncKeyState ist aber besser.  8)

Wieso??? :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 30, 2003 20:23 
Offline
DGL Member

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.

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 31, 2003 18:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
... 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)

Grüße,

Mars

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 01, 2003 14:27 
Offline
DGL Member

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.

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 01, 2003 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
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 ...

Grüße,

Mars

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 01, 2003 16:16 
Offline
DGL Member

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. :wink:

KidPaddle

PS.: Bin gespannt auf die Version 2.0 von Dir. Die alte 1.4 ist schon klasse.

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]