![]() |
Problemme mit FormKeyDown
Hallo,
Ich verwende das FormKeyDown Erreignis für das Bewegen einer Spielfigur. Jetzt habe ich aber ein Problem: Wenn ich z.B: die Taste "w" drücke dann wird das FormKeyDown Erreignis ausgelößt. Halte ich die Taste "w" gedrückt so wird das FormKeyDown Erreignis immer wieder ausgelößt. Wenn ich jetzt die Taste "w" und danach die Taste "s" drücke und beide Tasten gedrückt halte wird noch immer das FormKeyDown Erreignis ausgelößt. Jetzt das eigentliche Problem: Wenn ich die Taste "s" loslase wird das FormKeyDown Erreignis nicht mehr ausgelößt, obwohl ich die Taste "w" weiterhin gedrückt halte. Wie kann ich das verhindern? Ferby |
Re: Problemme mit FormKeyDown
Hallo Ferby,
das von dir beschriebene Verhalten kannst du wohl nicht ändern, aber deine Reaktion darauf schon. Du musst neben OnKeyDown() auch das Ereignis OnKeyUp() auswerten. Weihnachtsgrüße vom marabu |
Re: Problemme mit FormKeyDown
Hi,
das habe ich schon befürchtet das es nur so geht... Ich habe mir noch eine Lösung gedacht: Ich frage ständig ab ob und welche Taste gedrückt wird und reagiere darauf. Die ständige Abfrage wollte ich mit einen Timer realisieren, leider war der im Test sehr schlecht, da auf unterschiedlich schnellen computer, bei unterschiedlicher auslastung sich die Spielfiguren unterschiedlich schnell bewegten. Das war vorher nicht der Fall. Gibt es Alternativen, (Den Delphi X Timer habe ich auch probiert... das selbe Problem) Wäre dankabr für Gedankenanstöße.... Ferby |
Re: Problemme mit FormKeyDown
Hallo,
also ich habe das alles jetzt doch mit einen Timer gemacht und es geht..... die Procedure mit der ich mein Schiff bewege schaut nun so aus:
Delphi-Quellcode:
procedure TForm2.timer_schiffTimer(Sender: TObject);
begin // Bewegen if (GetAsyncKeyState(VK_UP) <> 0) and (img_schiff.top>20) then img_schiff.Top:=img_schiff.Top-ges; if (GetAsyncKeyState(VK_DOWN) <> 0) and (img_schiff.top<600) then img_schiff.Top:=img_schiff.Top+ges; if (GetAsyncKeyState(VK_LEFT) <> 0) and (img_schiff.left>20) then img_schiff.Left:=img_schiff.Left-ges; if (GetAsyncKeyState(VK_RIGHT) <> 0) and (img_schiff.left<950) then img_schiff.Left:=img_schiff.Left+ges; end; Das Schießen konnte ich nicht auch in den Timer nehmen, der Grund: Wenn der Anwender einmal kurz auf die Taste drückt werden gleich 5-1 Schüsse ausgelößt. (Weil das Intervall des Timers so klein ist, aber das muss so klein sein um das Schiff zu bewegen) Deshalb habe ich jetzt den Schuss in das FormKeyDown Ereigniss geschrieben
Delphi-Quellcode:
Wenn ich eine Pfeiltaste gedrückt halte und auf die Leertaste drücke dann funktioniert alles so wie ich will: Das Raumschiff bewegt sich und schießt gleichzeitiig.
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin // Schießen if key=VK_SPACE then new_schuss; end; Wenn ich zwei Pfeiltasten drücke dann bewegt sich das Raumschiff schräg. Jetzt das komische an der Sache: Halte ich zwei Pfeiltasten gedrückt und drücke die Leertaste dann wird die Procedure new_schuss nur manchmal ausgelößt und zwar nur wenn ich die Obere und Rechte Pfeiltaste oder die Untere und Linke Pfeiltaste gedrückt halte. Wenn ich aber die Obere und Linke Pfeiltaste oder die Untere und die Rechte gedrückt halte und dann die Leertaste drücke dann wird new_schuss nicht ausgelößt... kann mir das wer erklären? FormKEyDown wird beim drücken der Leertaste ausgelößt, das habe ich schon ausproiert, aber key=VK_SPACE geht nicht..... Ich bin Ratlos.... Ferby |
Re: Problemme mit FormKeyDown
Hallo alle miteinander,
kann mir hier wirklich keiner Weiterhelfen? Ich habe noch was rausgefunden Halte ich die Obere und Rechte Pfeiltaste oder die Untere und Linke Pfeiltaste gedrückt und drücke dann zusätzlich die Leertaste dann ist GetAsyncKeyState(VK_SPACE) nicht 0, wie es sein sollte. Wenn ich aber die Obere und Linke Pfeiltaste oder die Untere und die Rechte gedrückt halte und dann die Leertaste drücke ist GetAsyncKeyState(VK_SPACE) 0, obwohl es nicht null sein sollte... warum? Kann mich wer aufklären??? Ferby |
AW: Problemme mit FormKeyDown
hi!
also ich glaub beim programmieren musst du noch einiges lernen :P (bin zwar erst 14 kenn mich aba schon recht gut damit aus) du solltest vor allem alles mit EINEM timer machen wenn du sowas programmierst!!! wenn du mit mehreren arbeitest kann es dazu kommen das dein PC ziehmlich stockt... (ich rede da aus eigener erfahrung ;) ) für die schüsse legst du dir einfach im private teil deines forms ne variable vom Typ Integer an (z.B. Reload) dann tust du diese Variable in deiner tiemr procedure einfach immer um eins erhöhen und wenn Reload größer ist als ein bestimmter Wert (könntest du auch in ne Variable schreiben) dann soll er schiesen und Reload wieder auf 0 setzten. Das ganze könnte dann in etwa so aus sehn:
Delphi-Quellcode:
Ich hoffe wirklichm dass du wenigstens schon weist was arrays oda sind, weil sonst kanns du immer nur einen schuss abfeuern der einer Variable abgespeichert wird (arrays haben im Prinzip mehrere Variablen in einer :P nur falls dus nicht weist)...
procedure TForm1.Timer1Timer(Sender: TObject);
begin Inc(Reload); // Oder halt: Inc(Reload, 1); if Reload >= ReloadMax then begin // Hier nen neuen Schuss erstellen Reload := 0; end; end; Ich hoffe ich hab dich mit dem allen jetzt nicht zu arg abgeschreckt... Viel Spaß weiterhin beim Programmieren! :thumb: (Jeder fängt mal klein an :) ) Ach und das ich nicht komplett vom Thema abweich in dem es hier eigentlich geht... :lol: Falls du noch keine gute Lösung für das KeyDown zeugs gefunden hast: du kannst dir im private Teil des Forms einfach für jede Taste die du benutzt (Also: Left, Right, etc) einfach eine Boolean anlegen, also ein Wahr-Falsch. Ich kann dir hier mal en Beipsiel geben:
Delphi-Quellcode:
und dann kannst du einfachen in deiner TimerProc schauen ob z.B. Left wahr ist
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin // Hier wird die Taste auf True gesetzt case Key of VK_LEFT: Left := True; VK_RIGHT: Right := True; VK_UP: Up := True; VK_DOWN: Down := True; VK_SPACE: Space := True; end; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin // und hier auf False wenn sie wieder hoch geht case Key of VK_LEFT: Left := False; VK_RIGHT: Right := False; VK_UP: Up := False; VK_DOWN: Down := False; VK_SPACE: Space := False; end; end; manmanman... soviel hab ich glaub ich nochnie geschrieben... Bin dir nicht böse wenn es dir zuviel wurde... :tongue: Stehe dir aber natürlich weiterhin für Fragen über Delphi offen Ich könnte dir noch viel mehr über das ganze erzählen, aber fürss erste eichts hoffenltich... Edit: ups jetzt fällt mir erst auf wie alt dieser Thread schon ist... was solls XD |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz