2 Tasten gleichzeitig und Timerproblem

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.
Antworten
Tim
Beiträge: 21
Registriert: Fr 2. Dez 2016, 16:47

2 Tasten gleichzeitig und Timerproblem

Beitrag von Tim »

Hallo allerseits,
bin neu hier, deshalb weiß ich nicht, ob ich im richtigen Forum gepostet habe...hoffe es :)

Hab 3 Probleme (ja so viele :/), die ich nach vielem rumprobieren nun doch nicht lösen konnte, sodass ich mich an euch wende:

1. Ich möchte Pong programmieren und muss dazu, um im Mehrspieler zu spielen, zwei Tasten gleichzeitig drücken können.

Code: Alles auswählen

 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
   IF Key = 13 then              //Enter
      Timer1.Enabled := True;
   IF Key = 27 then              //Escape Test
      Timer1.Enabled := False;
   IF Key =  87 then             //W
      IF ShapePaddle1.Top >= 10 then
         ShapePaddle1.Top:=ShapePaddle1.Top - schnell*3;
   IF Key = 83 then              //S
      IF ShapePaddle1.Top <= (Form1.Height-ShapePaddle1.Height-10) then
         ShapePaddle1.Top:=ShapePaddle1.Top + schnell*3;
   IF Key =  38 then             //Up Key
      IF ShapePaddle2.Top >= 10 then
         ShapePaddle2.Top:=ShapePaddle2.Top - schnell*3;
   IF Key = 40 then              //Down Key
      IF ShapePaddle2.Top <= (Form1.Height-ShapePaddle2.Height-10) then
         ShapePaddle2.Top:=ShapePaddle2.Top + schnell*3;
end


Der Code macht halt, dass getestet wird ob die Taste gedrückt wird und dann nochmals getestet wird ob das zu bewegende Paddle nicht über den Rand hinausgeht. (schnell ist hier die Variable für die Geschwindigkeit zum Bewegen des Paddles.
Wie kann ich es nun aber machen, dass zwei Tasten gleichzeitig gedrückt werden können?

2. Ihr kennt das doch bestimmt, wenn man eine Taste gedrückt hält, dass dann nicht gleich sofort ganz viele Buchstaben hintereinander geschrieben werden, sondern erst nach einer kurzen Pause. (Probierts mal in irgend einer Textzeile aus, damit ihr wisst was ich meine)
Nun, das gleiche passiert auch, wenn ich in dem oben geschriebenen Code die Taste länger gedrückt halte, sie bewegt sich einmal und dann erst nach einer ganz kurzen Unterbrechung wieder. Wie kann ich das beheben?

3. CookieClicker: (läuft schon prima, ist jetzt nur noch das Beheben von Bugs) Beim Klicken auf einen Button soll ein Text auf einem Label eingeblendet werden, und dieser soll automatisch nach 10s verschwinden. Ich habs mit nem Timer versucht:

Code: Alles auswählen

 
procedure TFormCookieClicker.BitBtnCursorClick(Sender: TObject);     //Anzeige Cursor
begin
   LabelSubtitel1.Caption := 'COST: ' + IntToStr(buycurs) + ' Cookies';
   LabelSubtitel.Caption := 'PRODUCES: 1 Cookie/10 seconds';
  Timer1.Enabled:=True;
end;
 
procedure TFormCookieClicker.Timer1Timer(Sender: TObject);   
begin
  LabelSubtitel1.Caption := ' ';
  LabelSubtitel.Caption :=' ';
  Timer1.Enabled:=False;
end
 

Problem: der Timer wird ja beim anmachen automatisch einmal durchlaufen, sodass kein Text sichtbar wird. Wie kann ich den beim ersten Mal pausieren und erst nach 10 sec ausführen?

Wenns Nachfragen gibt, dann immer her damit.

Tut mir aber bitte einen Gefallen, nämlich erklärt es VERSTÄNDLICH, ich bin SCHÜLER, der gerade das Programmieren als seine Leidenschaft entdeckt hat. (Alles, was ich zu oben genannten Problemen im Netz gefunden habe, war so weit viel zu weit über meinem Niveau :/)

Liebe Grüße und danke schon im Vorraus!
Tim

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Marsmännchen »

Hi,

sei mir gegrüßt, Anfänger, ich bin auch einer :mrgreen: . Von daher bin ich schon sehr gespannt, was die schlauen Kollegen hier zu deinem Keydown-Problem sagen.

Bezüglich Timer habe ich ein Workaround, da ich bei einem Spiel, dass ich grade schreibe, ein ähnliches Problem hatte: der Code soll erst nach einer gewissen Zeit ausgeführt werden:
1. Definiere eine Integer-Variable (aber bitte nicht im Timer-Event, sonst wird die jedesmal neu initialisiert). Besser auf Unit-Ebene. Und such dir eine passende Stelle, wo sie auf den Wert Null gesetzt wird, bevor der Timer startet (also z.b. direkt vor dem Timer.Enabled).
2. Das Timer-Intervall sollte 1000 sein (also Ausführung jede Sekunde einmal).
3. In der Timerprozedur zählst du die Variable um eins hoch.

Der Gag kommt jetzt: den Code, den du nach 10 Sekunden ausführen willst, umgibst du mit einem if-Block. Als Bedingung gibst du an: wenn meine Integer-Variable >= 10 ist. Also wird dieser Code erst ausgeführt, nachdem der Timer 10x die Variable hochgesetzt hat.

War das verständlich? Ansonsten bitte nachfragen.
Ich mag Pascal...

Tim
Beiträge: 21
Registriert: Fr 2. Dez 2016, 16:47

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Tim »

Danke, hat funktioniert! Genau so stell ich mir das vor mit der Verständlichkeit! :)

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Mathias »

Von daher bin ich schon sehr gespannt, was die schlauen Kollegen hier zu deinem Keydown-Problem sagen.

Du muss in einem Puffer merken, welche Tasten gedrückt wurden und welche losgelassen.
Mit dieser Methode, sollte man fast die Ganze Tastatur abfangen können, vorausgesetzt, die Hardware spielt mit (Gaming-Tastatur).
Windows, PrtSc etc. gehen nicht, aber Ctrl, Alt, etc. gehen.

Im Anhang hat es ein Beispiel, wie man das macht. Dies sollte kein grosses Problem mehr sein, in ein Pong umzuschreiben.

Bezüglich Timer habe ich ein Workaround, da ich bei einem Spiel, dass ich grade schreibe, ein ähnliches Problem hatte: der Code soll erst nach einer gewissen Zeit ausgeführt werden:
Ich schnalle das nicht, wie du das meinst. Der Benutzer will nicht jedes mal 1sec warten, bis die Tasten reagieren.
Dateianhänge
Pacman Steuerung.zip
(125.08 KiB) 170-mal heruntergeladen
Zuletzt geändert von Mathias am Fr 2. Dez 2016, 20:58, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Marsmännchen »

Mathias hat geschrieben:
Bezüglich Timer habe ich ein Workaround, da ich bei einem Spiel, dass ich grade schreibe, ein ähnliches Problem hatte: der Code soll erst nach einer gewissen Zeit ausgeführt werden:
Ich schnalle das nicht, wie du das meinst. Der Benutzer will nicht jedes mal 1sec warten, bis die Tasten reagieren.


Mein Workaround bezog sich nicht auf die Verzögerungen bei der Tastatureingabe (keine Ahnung wie man das löst), sondern auf die Frage, wie man den Timer dazu bringt, erst nach 10 Sekunden einen Code auszuführen.
Ich mag Pascal...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Mathias »

Mein Workaround bezog sich nicht auf die Verzögerungen bei der Tastatureingabe (keine Ahnung wie man das löst), sondern auf die Frage, wie man den Timer dazu bringt, erst nach 10 Sekunden einen Code auszuführen.

Jetzt sehe ich auch durch, wer kann lesen ist im Vorteil. :oops:

Aber jetzt weist du auch wie das mit den Tasten geht. :wink:

Ich hätte auch ein einfaches Pong gehabt, aber dies wäre dann zu einfach gewesen, :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Euklid »

Tim hat geschrieben:Hallo allerseits,
bin neu hier, deshalb weiß ich nicht, ob ich im richtigen Forum gepostet habe...hoffe es :)


Hallo Tim, willkommen im Forum der deutschsprachigen Lazarusgemeinschaft! :)

Für Deine ersten beiden Probleme...

1. Ich möchte Pong programmieren und muss dazu, um im Mehrspieler zu spielen, zwei Tasten gleichzeitig drücken können.

[...]

2. Ihr kennt das doch bestimmt, wenn man eine Taste gedrückt hält, dass dann nicht gleich sofort ganz viele Buchstaben hintereinander geschrieben werden, sondern erst nach einer kurzen Pause. Wie kann ich das beheben?


...gibt es eine gemeinsame Lösung, und die sieht wie folgt aus:

Code: Alles auswählen

var
  Form1: TForm1;
  rechts,unten:boolean;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
  if key=82 then rechts:=true;
  if key=85 then unten:=true;
end;
 
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if key=82 then rechts:=false;
  if key=85 then unten:=false;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if rechts=true then Label1.Left:=Label1.Left+1;
  if unten=true then Label1.Top:=Label1.Top+1;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  rechts:=false;
  unten:=false;
end


Der Timer ist auf ein recht kurzes Intervall eingestellt. Die Variablen rechts und unten werden auf "true" gesetzt, sobald die jeweilige Taste gedrückt wird und auf "false", sobald die jeweilige Taste wieder losgelassen wird.
Im OnTimer-Ereignis wird das Label dann jeweils um 1 nach rechts bzw. nach unten verschoben - wenn notwendig auch gleichzeitig.

Würde Dir das weiterhelfen?

Viele Grüße, Euklid

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Euklid »

Mathias hat geschrieben:Aber jetzt weist du auch wie das mit den Tasten geht. :wink:


... da war wohl einer schneller als ich, hehe :wink:

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Mathias »

Der Timer ist auf ein recht kurzes Intervall eingestellt. Die Variablen rechts und unten werden auf "true" gesetzt, sobald die jeweilige Taste gedrückt wird und auf "false", sobald die jeweilige Taste wieder losgelassen wird.
Dies ist im Grunde genau das gleiche, wie in meinem Beispiel, bei 4 Tasten wie im Pong, geht dies noch, werden es aber mehr sein, wirst du recht viele Boolean brauchen und wird unübersichtlicher.

Code: Alles auswählen

if key=82 then rechts:=true;

Da finde ich diese schreibweise besser,

Code: Alles auswählen

if key=VK_R then rechts:=true;

wird wohl Geschmackssache sein. :wink:


.. da war wohl einer schneller als ich, hehe :wink:

Ich hatte es schon fertig auf der Platte. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Tim
Beiträge: 21
Registriert: Fr 2. Dez 2016, 16:47

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Tim »

Vielen vielen Dank für die Tipps, hat alles super funktioniert und alle Probleme sind gelöst worden!
Ich bin es eigentlich aus anderen Foren (nicht nur beim Programmieren) gewohnt, tage-, ja sogar wochenlang auf eine Antwort zu warten und bin deshalb echt beeindruckt, wie schnell man hier eine Antwort bekommt... Respekt!

PS: Das mit dem VK_R funktioniert bei mir nicht...es kommt die Fehlermeldung "Error: Identifier not found." (Aber macht nichts, es funktioniert ja auch anders :))

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von Mathias »

Ich bin es eigentlich aus anderen Foren (nicht nur beim Programmieren) gewohnt, tage-, ja sogar wochenlang auf eine Antwort zu warten

Wen man hier länger nichts hört, dann ist meisten das Thema untergegangen. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: 2 Tasten gleichzeitig und Timerproblem

Beitrag von shokwave »

Tim hat geschrieben:PS: Das mit dem VK_R funktioniert bei mir nicht...es kommt die Fehlermeldung "Error: Identifier not found." (Aber macht nichts, es funktioniert ja auch anders :))

Da musst du nur die Unit "LCLType" einbinden, dann sollte es gehen.
mfg Ingo

Antworten