2 Tasten gleichzeitig und Timerproblem

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.

2 Tasten gleichzeitig und Timerproblem

Beitragvon Tim » 2. Dez 2016, 20:11 2 Tasten gleichzeitig und Timerproblem

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
Tim
 
Beiträge: 21
Registriert: 2. Dez 2016, 16:47

Beitragvon Marsmännchen » 2. Dez 2016, 20:24 Re: 2 Tasten gleichzeitig und Timerproblem

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...
Marsmännchen
 
Beiträge: 293
Registriert: 4. Mai 2014, 20:32
Wohnort: Berlin
OS, Lazarus, FPC: Ubuntu 16.04, FPC 3.0.2, Lazarus 1.6.4 | 
CPU-Target: 64bit
Nach oben

Beitragvon Tim » 2. Dez 2016, 20:45 Re: 2 Tasten gleichzeitig und Timerproblem

Danke, hat funktioniert! Genau so stell ich mir das vor mit der Verständlichkeit! :)
Tim
 
Beiträge: 21
Registriert: 2. Dez 2016, 16:47

Beitragvon Mathias » 2. Dez 2016, 20:52 Re: 2 Tasten gleichzeitig und Timerproblem

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Mathias am 2. Dez 2016, 20:58, insgesamt 1-mal geändert.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4329
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Marsmännchen » 2. Dez 2016, 20:57 Re: 2 Tasten gleichzeitig und Timerproblem

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...
Marsmännchen
 
Beiträge: 293
Registriert: 4. Mai 2014, 20:32
Wohnort: Berlin
OS, Lazarus, FPC: Ubuntu 16.04, FPC 3.0.2, Lazarus 1.6.4 | 
CPU-Target: 64bit
Nach oben

Beitragvon Mathias » 2. Dez 2016, 21:04 Re: 2 Tasten gleichzeitig und Timerproblem

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4329
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Euklid » 2. Dez 2016, 21:08 Re: 2 Tasten gleichzeitig und Timerproblem

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
 
Beiträge: 2760
Registriert: 22. Sep 2006, 09:38
Wohnort: Hessen

Beitragvon Euklid » 2. Dez 2016, 21:11 Re: 2 Tasten gleichzeitig und Timerproblem

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


... da war wohl einer schneller als ich, hehe :wink:
Euklid
 
Beiträge: 2760
Registriert: 22. Sep 2006, 09:38
Wohnort: Hessen

Beitragvon Mathias » 2. Dez 2016, 21:20 Re: 2 Tasten gleichzeitig und Timerproblem

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4329
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Tim » 3. Dez 2016, 00:02 Re: 2 Tasten gleichzeitig und Timerproblem

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 :))
Tim
 
Beiträge: 21
Registriert: 2. Dez 2016, 16:47

Beitragvon Mathias » 4. Dez 2016, 17:04 Re: 2 Tasten gleichzeitig und Timerproblem

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4329
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon shokwave » 5. Dez 2016, 11:36 Re: 2 Tasten gleichzeitig und Timerproblem

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
shokwave
 
Beiträge: 420
Registriert: 15. Nov 2007, 16:58
Wohnort: Rudolstadt
OS, Lazarus, FPC: Win10 (L 1.6 FPC 3.0.0) | 
CPU-Target: i386,x64
Nach oben

• Themenende •

Zurück zu Allgemeines



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried