Onkeypress in Procedure
Onkeypress in Procedure
Hallo Leute,
Ich will mit Lazarus ein Programm schreiben, dass ähnlich wie Ping Pong ist.
Soweit so gut, habe alles hingekriegt, nur leider kann ich keine Eingabe (Tastatur, Maus) machen, während die Procedure läuft. Diese soll jedoch solange laufen bis halt die Kugel nicht "gefangen" worden ist. Mein Informatik-Lehrer hat mir geraten dass ganze in die OnkeyPress-Procedure zu schreiben, aber leider ist die Variable Key dann ja immer die selbe (aktualisiert sich nicht).
Deshalb meine Frage, gibt es einen Befehl, der wie Onkeypress funktioniert und in einer Procedure die Tasten abfragt?
Schonmal Danke im voraus : )
Ich will mit Lazarus ein Programm schreiben, dass ähnlich wie Ping Pong ist.
Soweit so gut, habe alles hingekriegt, nur leider kann ich keine Eingabe (Tastatur, Maus) machen, während die Procedure läuft. Diese soll jedoch solange laufen bis halt die Kugel nicht "gefangen" worden ist. Mein Informatik-Lehrer hat mir geraten dass ganze in die OnkeyPress-Procedure zu schreiben, aber leider ist die Variable Key dann ja immer die selbe (aktualisiert sich nicht).
Deshalb meine Frage, gibt es einen Befehl, der wie Onkeypress funktioniert und in einer Procedure die Tasten abfragt?
Schonmal Danke im voraus : )
Re: Onkeypress in Procedure
Bau in deine Hauptroutine ein Application.Processmessages ein. Dann kannst du auf den Tastendruck reagieren.
Ich würde aber eher OnKeyDown oder OnKeyUp verwenden, denn du willst ja nichts schreiben.
Ich würde aber eher OnKeyDown oder OnKeyUp verwenden, denn du willst ja nichts schreiben.
Re: Onkeypress in Procedure
Ah vielen Dank, das hilft mir schon weiter. Aber wenn ich jetzt eine Taste drücke stoppt er die Procedure Button1.click und führt die andere aus. Gibt es eine Möglichkeit kurz die Procedure Keydown auszuführen und dann mit der Procedure Button... weiterzu machen?
Danke im Voraus
Danke im Voraus
Re: Onkeypress in Procedure
Genau das passiert doch.Moax hat geschrieben:Gibt es eine Möglichkeit kurz die Procedure Keydown auszuführen und dann mit der Procedure Button... weiterzu machen?
??
Re: Onkeypress in Procedure
Guck mal nach threads.
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!
it´s not a bug, it´s a feature!
-
- Beiträge: 476
- Registriert: Do 15. Nov 2007, 16:58
- OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
- CPU-Target: i386, x64
- Wohnort: Gera
Re: Onkeypress in Procedure
Das finde ich jetzt ein wenig übertrieben.felix96 hat geschrieben:Guck mal nach threads.
Ich würde einen TTimer für die Spielmechanik nehmen, dann kannst du ohne Verrenkungen OnKeyDown für die Tastatureingaben benutzen.
TTimer.Interval - legt die Zeit in ms fest wie schnell hintereinander das Ereignis TTimer.OnTimer aufgerufen wird.
TTimer.enabled - Start(true)/Ende(false)
TTimer.OnTimer - der Spielablauf z.B. bewege Ball um 3 Pixel, prüfe auf Wand bzw. noch im Spielfeld...
mfg Ingo
Re: Onkeypress in Procedure
der "normale" timer ist window message basiert (war er zumindest mal im delphi)
die windows messages kommen schon mal verspätet und/oder gehäuft an
ein flüssiger spiel ablauf also nicht gewährleistet
besser wäre TJvThreadTimer (thread basiert) thread priorität kann man auch höher setzen..
immer fix 3pixel bewegen ist auch "schlecht" man sollte/muss sich die strecke anhand der tatsächlich seit dem letzten aufruf verstrichenen zeit ausrechnen...
(die "idee" mit processmessages ist generell KAUM eine gute idee..)
die windows messages kommen schon mal verspätet und/oder gehäuft an
ein flüssiger spiel ablauf also nicht gewährleistet
besser wäre TJvThreadTimer (thread basiert) thread priorität kann man auch höher setzen..
immer fix 3pixel bewegen ist auch "schlecht" man sollte/muss sich die strecke anhand der tatsächlich seit dem letzten aufruf verstrichenen zeit ausrechnen...
(die "idee" mit processmessages ist generell KAUM eine gute idee..)
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Onkeypress in Procedure
Leute ... hier stellt jemand eine Frage für ein Schulprojekt im Informatik-Unterricht. Meint Ihr ernsthaft, da wäre TThread oder irgendwelche Dritt-Komponenten eine hilfreiche Antwort? Wollt Ihr vielleicht noch ein paar Vorschläge für Projektmanagement oder Quellcodeverwaltung machen? Hilft Neulingen sicher ungemein Fuss zu fassen und Spass zu haben ...
Also Moax, TTimer ist sicherlich eine ganz gute Lösung. Solltest du es weiterhin alles im OnClick des Buttons abarbeiten wollen, dann bau dir noch eine globale Variable "Cancel" oder so ein, die, sobald die True wird, deine Schleife unterbricht. Im OnKeyPress kannst du dann einfach diese Variable auf True setzen und wird dann durch das bereits beschrieben Application.ProcessMessages ausgelöst.
Also Moax, TTimer ist sicherlich eine ganz gute Lösung. Solltest du es weiterhin alles im OnClick des Buttons abarbeiten wollen, dann bau dir noch eine globale Variable "Cancel" oder so ein, die, sobald die True wird, deine Schleife unterbricht. Im OnKeyPress kannst du dann einfach diese Variable auf True setzen und wird dann durch das bereits beschrieben Application.ProcessMessages ausgelöst.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Onkeypress in Procedure
Für ein Ping Pong, habe ich hier ein ganz Gutes Beispiel gefunden:
http://www.delphipraxis.net/2635-image- ... assen.html" onclick="window.open(this.href);return false;
Schau dir das mal an. Vielleicht Hilft es dir etwas weiter.
Den ganzen Code in einer Click-Procedure ein zu bauen ist schlecht. Es gibt ein Paar Nachteile:
01: Du erstellst so eine Art "Endlos" schleife, die den MainThread deiner Anwendung aufhältst.
02: Dadurch können, keine anderen User-Inputs wie das drücken einer Taste abgefangen werden. Auch der Vorschlag von Theo ändert hier nichts. Dann werden zwar andere Botschaften verarbeitet, jedoch wird die Bewegung des Balls "Kurz" unterbrochen. Das kann zu unerwünschten Effekten führen.
Dein Problem ist nicht OnKeyPress sondern die Frage: Wie führt man "Sachen" (fast) gleichzeitig aus ?
Der Standard Timer reicht für deinen Fall vollkommen. Der ist zwar ungenau, aber das einfachste. Es gibt noch das onIdl Event von TApllication. Dafür findest du sogar eine Komponente.
Ein Thread wäre dafür zu übertrieben. Das würde eine reihe weitere Fragen aufwerfen. Ein Thread habe ich bei meinen Spielen auch noch nie verwendet.
Ich habe schon viele Spiele mit Canvas erstellt. Es geht also. Ich habe bisher auch nur "ein Timer" verwendet.
http://www.delphipraxis.net/2635-image- ... assen.html" onclick="window.open(this.href);return false;
Schau dir das mal an. Vielleicht Hilft es dir etwas weiter.
Den ganzen Code in einer Click-Procedure ein zu bauen ist schlecht. Es gibt ein Paar Nachteile:
01: Du erstellst so eine Art "Endlos" schleife, die den MainThread deiner Anwendung aufhältst.
02: Dadurch können, keine anderen User-Inputs wie das drücken einer Taste abgefangen werden. Auch der Vorschlag von Theo ändert hier nichts. Dann werden zwar andere Botschaften verarbeitet, jedoch wird die Bewegung des Balls "Kurz" unterbrochen. Das kann zu unerwünschten Effekten führen.
Dein Problem ist nicht OnKeyPress sondern die Frage: Wie führt man "Sachen" (fast) gleichzeitig aus ?
Der Standard Timer reicht für deinen Fall vollkommen. Der ist zwar ungenau, aber das einfachste. Es gibt noch das onIdl Event von TApllication. Dafür findest du sogar eine Komponente.
Ein Thread wäre dafür zu übertrieben. Das würde eine reihe weitere Fragen aufwerfen. Ein Thread habe ich bei meinen Spielen auch noch nie verwendet.
Ich habe schon viele Spiele mit Canvas erstellt. Es geht also. Ich habe bisher auch nur "ein Timer" verwendet.
MFG
Michael Springwald
Michael Springwald