Key abfragen ohne OnKeyDown/Up/Press Events

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Winni »

Hi!

Dann ist bei deiner Lazarus-Installation etwas schief gegangen.

Winni

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

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von theo »

Winni hat geschrieben:
So 11. Dez 2022, 01:18
Dann ist bei deiner Lazarus-Installation etwas schief gegangen.
Oder er hat eine ältere Version.
"Maximize compatibility of project files"
https://wiki.lazarus.freepascal.org/Laz ... re_changed
https://wiki.lazarus.freepascal.org/fixlp

Aber den Quellcode lesen kann er ja sowieso.

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Aloxen »

Soner hat geschrieben:
Sa 10. Dez 2022, 15:29

if ((GetKeyState(VK_E) and $8000) <> 0) then Form4.ShowModal;
Was heißt denn das $8000 und warum größer und kleiner 0? Ich habe es immer nur mit <0 gearbeitet.

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

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von theo »

Aloxen hat geschrieben:
So 11. Dez 2022, 10:39
Was heißt denn das $8000
Kannst du durch KF_UP ersetzen. Entspricht im Effekt wohl OnKeyUp.

Ich persönlich würde es aber auch so machen wie im Beispiel von Winni.

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Aloxen »

Verzeihung dass ich erst jetzt antworte, ich hatte kleine Schwierigkeiten in der Physik und Kollision ;)
Also GetKeyState VK_ESCAPE and $8000 <> 0 hat nicht funktioniert. Da war das gleich Problem wie wenn ich es ohne das $8000 in den IdleHandler geschrieben hätte.
Da ihr jetzt alle so versteift auf das Application.ProcessMessages seid möchte ich es so machen wie @Winni es vorgeschlagen hat. Ich habe es wie folgt in meinem Programm implementiert:

Code: Alles auswählen

//UpdateGame wird einmal am Anfang nach dem setzten aller Startwerte ausgeführt (OnFormCreate)
procedure TForm1.UpdateGame;  
begin
  repeat
    ogc.Invalidate;
    Application.ProcessMessages;
  until false;//Zunächst erstmal ohne Stopp um zusehen ob es funktioniert
end;
Im OpenGL Tutorial wurde im Timer bzw IdleHandler immer mit ogc.Invalidate neu gezeichnet. Deshalb habe ich das hier in dem auch so gemacht. ogc ist vom Typ TContext.

Wenn ich das Programm starte kommt nichts... Wirklich Garnichts. Kein Bild, nichtmal ein Fenster. Im Taskmanager ist das Programm offen und verbraucht 10% CPU aber es kommt auch nach mehreren Minuten kein Bild. Ich nehme an dass das nicht beabsichtigt ist. Ich habe auch mit Form1.repaint versucht und dann in die Onpaint von Form1 ogc.Invalidate geschrieben aber das führt zum gleichen Ergebnis.
Was genau läuft hier falsch und was heißt Invalidate? Vllt liegt es einfach daran dass ich das nicht verstehe und wieder mal einen Anfängerfehler gemacht habe

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von af0815 »

ProzessMessages ermöglicht nur, das die MessageQueuce abgearbeitet wird. Das hat ermöglicht das die Timerevents oder den IdleHandler laufen zu lassen. Es versteift sich keiner darauf, nur darf die MessageQueuce nicht langfristig blockiert werden. Auch manche BS werfen Prozesse raus, die das blockieren, weil sie sagen der Prozees steckt fest.

Invalidate ruft normalerweise den Handler zum Neuzeichnen über Events auf. Beim normalen Managment ist das OnPaint. Für OpenGL wird es etwas gleiches geben.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Winni »

Hi!

Ohne application.processMessages kann man herrlich Windows-Rechner stilllegen.

Range checking ausschalten

Code: Alles auswählen

For i := 0 to Maxint do
   begin
   for k := 0 to Maxint do
     begin
     inc(k);
     end;
     inc(i);
   end; 
Der Job blockiert herrlich den Windows Multitasking Mechanismus und legt den Rechner still. Unter Linux ist nur dieser Job "frozen". Im Herzen der zwei loops muss eben application.processmessages stehen, sonst bewegt sich nicht mal die Maus.

Winni

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Aloxen »

@Winni ich habe doch aber Application.ProcessMessages in meinem Loop drinnen. Warum zeichnet es trotzdem nicht?

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Aloxen »

Ich habe das im Internet gefunden. Muss ich da noch Applications.ProcessMessages reinschreiben?

Code: Alles auswählen

// The amount of time we want to simulate each step, in milliseconds
// (written as implicit frame-rate)
timeDelta = 1000/30
timeAccumulator = 0
while ( game should run )
{
  timeSimulatedThisIteration = 0
  startTime = currentTime()

  while ( timeAccumulator >= timeDelta )
  {
    stepGameState( timeDelta )
    timeAccumulator -= timeDelta
    timeSimulatedThisIteration += timeDelta
  }

  stepAnimation( timeSimulatedThisIteration )

  renderFrame() // OpenGL frame drawing code goes here

  handleUserInput()

  timeAccumulator += currentTime() - startTime 
}

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Aloxen »

Ich habe im Debugger geschaut, die ogcDraw wird durch den Loop nicht ausgelöst. Irgendwie scheint ogc.invalidate nicht das zu bringen was ich möchte. Kann mir jemand sagen warum?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Winni »

Hi!

Sprachen mit geschweiften KLammern sind nicht Gegenstand dieses Forums.

Wenn Du den loop nicht aufrufst, wird er auch nicht ausgeführt. Du musst uns schon ein bischen Code zeigen.

Winni

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Aloxen »

Okay keine geschweiften Klammern ;)
Ich habe bisher jetzt dass:

Code: Alles auswählen

procedure TForm1.GameUpdate;
begin
 while ESC = false do
  begin
    if StartCount=-1 then
      QueryPerformanceCounter(StartCount) else //Zeit0 / nur einmal aufrufen
      StartCount:=EndCount; //Übergabe des Endwerts an den Startwert

    ogc.Invalidate;
                                                                                  //Rendern
    Application.ProcessMessages;
   QueryPerformanceCounter(EndCount); //Zeit1
   DeltaTime := ((EndCount - StartCount) /Frequenz)

  end;
end;  
GameUpdate wird wiegesagt in FormCreate aufgerufen und im Debugger funktioniert die Endlosschleife. Nur die eigentliche procedure mit den Shaderübergaben und Matrizen berechnungen wird irgendie nicht aufgerufen. Ist ogc.Invalidate einfach falsch oder ist da ein anderer Fehler?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von af0815 »

Bitte nichts im FormCreate starten !! Vor allen nicht blockierendes. Du legst damit die komplette Initialisierung der Applikation aufs Eis und nichts geht mehr.

Du kannst das im ersten OnActivate machen, da ist das Fenster initialisiert (Oder einen One-Shoot Timer der das startet). Ich würde das ganze mal auf einen Button legen und den als Starttaste verwenden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Aloxen »

Ich habe es jetzt in OnActivate gepackt und die Schleife funktioniert. Leider funktionieren die Tastenabfragen immer noch nicht

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Key abfragen ohne OnKeyDown/Up/Press Events

Beitrag von Aloxen »

Um mal aus anderen Richtungen sich dem Probelm zu nähern, wann würde denn Form1.FormKeyUp überhaupt eintreten? Theoretisch liegt ja über dem kompletten form bis auf die Headleiste der ogc Context (die Zeichenfläche). Geht FormKeyUp dann überhaupt? Die Maus befindet sich ja auf dem Context und falls ich das ändern muss, wie würde ich dass dann machen?

Antworten