Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problemme mit FormKeyDown (https://www.delphipraxis.net/59617-problemme-mit-formkeydown.html)

ferby 25. Dez 2005 23:53


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

marabu 26. Dez 2005 10:09

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

ferby 26. Dez 2005 23:16

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

ferby 3. Jan 2006 17:50

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:
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  // Schießen
  if key=VK_SPACE then new_schuss;
end;
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.

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

ferby 7. Jan 2006 00:33

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

Possseidon 15. Nov 2011 19:48

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

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:
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;
und dann kannst du einfachen in deiner TimerProc schauen ob z.B. Left wahr ist

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 09:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz