AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi was wenn zwei tasten gleichzeitig im FormKeyDown?
Thema durchsuchen
Ansicht
Themen-Optionen

was wenn zwei tasten gleichzeitig im FormKeyDown?

Ein Thema von ferby · begonnen am 11. Dez 2005 · letzter Beitrag vom 12. Dez 2005
Antwort Antwort
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#1

was wenn zwei tasten gleichzeitig im FormKeyDown?

  Alt 11. Dez 2005, 19:58
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
  Mit Zitat antworten Zitat
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?

  Alt 11. Dez 2005, 20:16
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
Oliver Hanappi
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?

  Alt 11. Dez 2005, 20:20
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.
Benjamin
  Mit Zitat antworten Zitat
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?

  Alt 11. Dez 2005, 20:38
Warum will ich eigentlich einen Timer verwenden, wenn man das eigentlich auch ins OnKeyDown setzen kann ??
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;
Oliver Hanappi
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#5

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?

  Alt 11. Dez 2005, 21:39
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
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#6

Re: was wenn zwei tasten gleichzeitig im FormKeyDown?

  Alt 12. Dez 2005, 00:49
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 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