Key abfragen ohne OnKeyDown/Up/Press Events
- 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
Hi!
Dann ist bei deiner Lazarus-Installation etwas schief gegangen.
Winni
Dann ist bei deiner Lazarus-Installation etwas schief gegangen.
Winni
Re: Key abfragen ohne OnKeyDown/Up/Press Events
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.
Re: Key abfragen ohne OnKeyDown/Up/Press Events
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:
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
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;
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
- af0815
- Lazarusforum e. V.
- Beiträge: 6217
- 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
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.
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).
- 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
Hi!
Ohne application.processMessages kann man herrlich Windows-Rechner stilllegen.
Range checking ausschalten
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
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;
Winni
Re: Key abfragen ohne OnKeyDown/Up/Press Events
@Winni ich habe doch aber Application.ProcessMessages in meinem Loop drinnen. Warum zeichnet es trotzdem nicht?
Re: Key abfragen ohne OnKeyDown/Up/Press Events
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
}
Re: Key abfragen ohne OnKeyDown/Up/Press Events
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?
- 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
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
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
Re: Key abfragen ohne OnKeyDown/Up/Press Events
Okay keine geschweiften Klammern
Ich habe bisher jetzt dass:
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?
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;
- af0815
- Lazarusforum e. V.
- Beiträge: 6217
- 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
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.
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).
Re: Key abfragen ohne OnKeyDown/Up/Press Events
Ich habe es jetzt in OnActivate gepackt und die Schleife funktioniert. Leider funktionieren die Tastenabfragen immer noch nicht
Re: Key abfragen ohne OnKeyDown/Up/Press Events
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?