2 Tasten zur selben Zeit drücken?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

2 Tasten zur selben Zeit drücken?

Beitrag von PascalHST »

Hallo, ich habe eine Multiplayer Spiel entwickelt, wozu nur 4 Tasten benötigt werden, 2 für jeden. DAs Problem alerdings ist, dass wenn der eine eine Taste drückt, der Gegner nichts machen kann solange Spieler 1 seine Taste gedrückt hält.
Hat dort jemand eine Lösung? WEnn ja bitte mit entsprechendem Code. Bin Anfänger in Pascal.

Code: Alles auswählen

procedure TForm1.FormKeyPress (Sender: TObject; var Key: char);                  {Steuerung}
begin
     if Ord(Key) = VK_ESCAPE  then                                               //ESC - Schließen
        Close;
     if Ord(Key) = VK_SPACE then                                                 //SPACE - Procedure "Start Game"
        StartGame;
     if Key in ['k', 'K'] then                                                   //Steuerung - Verschiebung Schläger in "Y +/-"
        DrawBatRight(FBatRightY + 10);
     if Key in ['i', 'I'] then
        DrawBatRight(FBatRightY - 10);
     if Key in ['s', 'S'] then
        DrawBatLeft(FBatLeftY + 10);
     if Key in ['w', 'W'] then
        DrawBatLeft(FBatLeftY - 10);
  end;      

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von theo »

Warum nimmst du nicht das Ereignis "OnKeyDown"?

Code: Alles auswählen

 
uses LCLType;
...
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
 Case Key of
  VK_K:Caption:='k';
  VK_L:Caption:='l';
 end;
end; 

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von PascalHST »

Danke :) wie geben ich dann an das zu taste x aktion x ausgeführt wird? auch wie in meinem beispielt mit der if aufforderung?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von Michl »

:shock: Hatte Dir doch theo schon gezeigt!

Code: Alles auswählen

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
  Case Key of
    VK_ESCAPE: Close;                         //ESC - Schließen
    VK_SPACE:  StartGame;                     //SPACE - Procedure "Start Game"
    VK_K:      DrawBatRight(FBatRightY + 10); //Steuerung - Verschiebung Schläger in "Y +/-"
    ...
  end;
end; 

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von PascalHST »

Ja okay, vielen dank :)

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von PascalHST »

Habs getestet, bekomme die Anmerkung, das "Shift" nicht verwendet wird, Shift sthet in der Procedure..
Und dann noch. "Warning: Am inherited method is hidden by"TForm1.KeyDown(TObject,var Word,TShiftState);"

Bis jetzt scheint es nicht zu funktionieren das beide gleichzeitig drücken können.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von Komoluna »

Du kannst einen TTimer verwenden, und die Unit LCLIntf einbinden.
dann schreib in die OnTimer Methode:

Code: Alles auswählen

Procedure Form1.Timer1Timer(Sender: TObject);
begin
  if GetKeyState(VK_Escape) < 0 then
    Close;
  if GetKeyState(VK_Space) < 0 then
    StartGame;
...
end;
Der Nachteil an dieser Methode ist, dass Tasten, die nicht dauernd ausgelöst werden sollen(Menütasten, ...) dauernd ausgelöst werden.
Man müsste dann die entsprechenden Tasten im FormKeyDown/Press Ereignis behandeln und aus der Timerroutine rausnehmen...

Edit: Das die Varaible "Shift" nicht verwendet wird ist nur ein Kompilerhinweis. Kannst du meistens ignorieren.

MFG

Komoluna
Zuletzt geändert von Komoluna am Do 12. Jun 2014, 15:27, insgesamt 1-mal geändert.
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Joz
Beiträge: 40
Registriert: Mo 27. Mai 2013, 13:16
OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
CPU-Target: AMD64
Wohnort: Berlin

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von Joz »

Die Meldung, dass Shift nicht verwendet wird, ist genau dann normal, wenn man Shift auch wirklich nicht benutzt ;)

Die Meldung, dass KeyDown eine vererbte Methode verbirgt, habe ich aber nie, prüfe doch mal, ob deine Methode überhaupt aufgerufen wird, indem du einfach bei jedem Tastendruck

Code: Alles auswählen

WriteLn('Taste ' + Chr(Key) + ' gedrückt')
ausführst (und davor das Laz-Terminal unter Ansicht→Debuggerfenster aktivierst).

Auch solltest du (sofern du es nicht schon tust oder es überhaupt eine Rolle spielt) darauf achten, dass FormKeyDown nur einmal aufgerufen wird, man also für jede (mutmaßlich kleine) Verschiebung des Schlägers einmal auf die Taste hauen muss, so wie du es schreibst.

Edit: Komolunas Version gibt es natürlich auch, aber es gibt eben auch die Nachteile.
Ich mach das in Spielen immer folgendermaßen:

Code: Alles auswählen

  TGameKey = (gkLeft, gkTop, gkRight, gkDown, …);
  TGameKeys = set of TGameKey;
 
procedure TForm1.FormKeyDown
  Case Key of
    VK_LEFT: GameKeys += [gkLeft];
    VK_Up: GameKeys += [gkTop];
    VK_RIGHT: GameKeys += [gkRight];
    VK_DOWN: GameKeys += [gkDown];
 
procedure TForm1.FormKeyUp
  Case Key of
    VK_LEFT: GameKeys -= [gkLeft];
    VK_Up: GameKeys -= [gkTop];
    VK_RIGHT: GameKeys -= [gkRight];
    VK_DOWN: GameKeys -= [gkDown];
…und frage dann in der Frameroutine einfach einfach meine Tasten ab.

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von PascalHST »

Okay, da war jetzt viel Fachsprache bei, mal sehen ob ich durchsehe :D
Danke aufjedenfall schon mal.

Code: Alles auswählen

  TGameKey = (gkLeft, gkTop, gkRight, gkDown, …);
  TGameKeys = set of TGameKey;
 
procedure TForm1.FormKeyDown
  Case Key of
    VK_LEFT: GameKeys += [gkLeft];
    VK_Up: GameKeys += [gkTop];
    VK_RIGHT: GameKeys += [gkRight];
    VK_DOWN: GameKeys += [gkDown];
 
procedure TForm1.FormKeyUp
  Case Key of
    VK_LEFT: GameKeys -= [gkLeft];
    VK_Up: GameKeys -= [gkTop];
    VK_RIGHT: GameKeys -= [gkRight];
    VK_DOWN: GameKeys -= [gkDown];
Was verstehe ich unter KeyDown/Up? Bedeutet es Taste drücken/loslassen?!
Ansonsten würde es für mich keinen sinn machen :o
Was soll das in den [..] bedeuten?
Sorry bin Anfänger, behandel es grade nur in der Schule.
Zuletzt geändert von Lori am Fr 13. Jun 2014, 15:51, insgesamt 1-mal geändert.
Grund: richtigher Highlighter

Joz
Beiträge: 40
Registriert: Mo 27. Mai 2013, 13:16
OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
CPU-Target: AMD64
Wohnort: Berlin

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von Joz »

Hätte vielleicht vorher nach deinem Kenntnisstand fragen können ^^
FormKeyDown wird aufgerufen, wenn eine Taste gedrückt wird, FormKeyUp, wenn eine losgelassen wird. Du kannst dir in diesen Methoden die Informationen über gedrückte Tasten in Variablen speichern, so dass du darauf auch außerhalb dieser Handler Zugriff auf diese Informationen hast.
Das sollte eigentlich mein Beispielcode aussagen. GameKeys ist hier ein Feld, das sich für jede im Spiel verwendbare Taste merkt, ob sie gedrückt ist. Diese Info wird jedesmal geändert, wenn eine Pfeiltaste gedrückt oder losgelassen wird.

Methoden, die die Spiellogik beeinhalten und in jedem Spiel-Frame aufgerufen werden, haben so einfacheren Zugriff auf die Tastatur.
Wird denn in deinem Spiel mit jedem Tastendruck etwas verschoben oder hängt es davon ab, wie lange man sie gedrückt hält?

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von Komoluna »

ich finde meine Methode da aber wesentlich einfacher:
einfach prüfen ob GetKeyState(VK_Escape) < 0 ist damit greift man wirklich auf die Tastatur zu.

Das entsprich ungefär der abfrage ob sich gamekeyxy in dem array befindet, nur die Up/Down routinen entfallen.
also wesentlich einfacher. und man kann halt alle VK_... Konstanten benutzen.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: 2 Tasten zur selben Zeit drücken?

Beitrag von PascalHST »

Wird denn in deinem Spiel mit jedem Tastendruck etwas verschoben oder hängt es davon ab, wie lange man sie gedrückt hält?
Es ist Pong, sprich die Schläger Rechts und links werden verschoben, bei gedrückter Taste. Das ganze ist im Multiplayer, sprich es muss mir möglich sein 2 Tasten gleichzeitig zu drücken, damit beide schläger gleichzeitig bewegt werden können.

Antworten