Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi was wenn zwei tasten gleichzeitig im FormKeyDown? (https://www.delphipraxis.net/58730-wenn-zwei-tasten-gleichzeitig-im-formkeydown.html)

ferby 11. Dez 2005 20:58


was wenn zwei tasten gleichzeitig im FormKeyDown?
 
Hallo,

Ich programmiere gerade ein Spiel in der ich mit den Pfeiltasten ein Raumschiff bewegen kann und mit der Leertaste schiße.
So in etwa:

Delphi-Quellcode:
  // Bewegen
    if (key=VK_UP) and (img_schiff.top>20) then img_schiff.Top:=img_schiff.Top-3;
    if (key=VK_DOWN) and (img_schiff.top<600) then img_schiff.Top:=img_schiff.Top+3;
    if (key=VK_LEFT) and (img_schiff.left>20) then img_schiff.Left:=img_schiff.Left-3;
    if (key=VK_RIGHT) and (img_schiff.left<950) then img_schiff.Left:=img_schiff.Left+3;

    // Schiessen
    if (key=VK_SPACE) then new_schuss;
Solange ich immer nur eine Taste gedrück halte funktioniert alles super...
aber wenn ich vorwärtsfahren und schiessen gleichzeitig will, also die Tasten VK_LEFT und VK_SPACE gleichzeitig gedrückt habe dann schießt er entweder oder fährt. Was muss ich machen damit, wenn ich VK_LEFT und VK_SPACE gleichzeitig drücke, das beide Erreignisse, also new_schuss und img_schiff.Left:=img_schiff.Left-3 ausgelößt werden?

Danke,
Ferby

idontwantaname 11. Dez 2005 21:16

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?
 
Eine Lösung mit OnKeyDown kann ich dir leider nicht anbieten,
aber eine mit MSDN-Library durchsuchenGetAsyncKeyState. Dazu bräuchtest
du einen Timer (am besten mit niedrigem Interval ;-)), die
Timer-Prozedur müsste dann so aussehen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if(GetAsyncKeyState(VK_LEFT) <> 0) then Move_Left;
  if(GetAsyncKeyState(VK_RIGHT) <> 0) then //...
end;
Hoffe, dass ich helfen konnte,
idontwantaname :hi:

BenjaminH 11. Dez 2005 21:20

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?
 
Ich kann dafür eine mit OnKeyDown anbieten.
Du hast OnKeyDown und OnKeyUp beim Down machst dus z.B. so, dass beim OnKeyDown irgendeine Boolsche Variable, je nach Taste(spontan fällt mir da ein Array[Word] of Boolean ein, aber das wird nicht sehr schnell ;-) ), auf True gesetzt wird und beim Up auf False.
Du kannst dann überprüfen, welche Tasten gedrückt sind, indem du einfach die Werte der Variablen abfragst.

idontwantaname 11. Dez 2005 21:38

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?
 
Warum will ich eigentlich einen Timer verwenden, wenn man das eigentlich auch ins OnKeyDown setzen kann ?? :wall:
So geht es ja auch ;)
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if(GetAsyncKeyState(VK_RIGHT) <> 0) then
    Button1.Left := Button1.Left + 1;
  if(GetAsyncKeyState(VK_SPACE) <> 0) then
    Button1.Caption := IntToStr(StrToIntDef(Button1.Caption, 0)+1);
end;

ferby 11. Dez 2005 22:39

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?
 
Hallo,

das mit den TImer funktioniert nicht da die geschwindigkeit der Figur von den Hintergrundrocessen abhängig ist.



Diese Methode:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if(GetAsyncKeyState(VK_RIGHT) <> 0) then
    Button1.Left := Button1.Left + 1;
  if(GetAsyncKeyState(VK_SPACE) <> 0) then
    Button1.Caption := IntToStr(StrToIntDef(Button1.Caption, 0)+1);
end;


funktioniert auch nicht ganz so wie ich mir das vorstelle. Ich kann zwar in 2 richtungen gleichzeitgi fahren aber wenn ich z.b die linkpfeiltaste gedrück halte und einmal die Leertaste drücke und wieder loslasse dann bewegt sich das schiff nicht mehr, obwohl ich ja noch die linke pfeiltaste gedrückt halte.

Kann mir da wer weiter helfen?

mfg,
Ferby

Oxmyx 12. Dez 2005 01:49

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?
 
Kannst es ja mal mit GetKeyboardState versuchen. Also irgendwie so:

Delphi-Quellcode:
var
  keys: array[0..255] of Byte;
begin
  GetKeyboardState(@keys);

  if Boolean(keys[VK_RIGHT]) then ....
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 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 by Thomas Breitkreuz