![]() |
Probleme mit TTimer durch andere Anweisungen
Hallo,
ich programmiere gerade ein Spiel, bei dem sich ein Bild durch einen Timer über den Bildschirm bewegt. Ein anderes Objekt lässt sich mit den Pfeiltasten steuern. Wenn man jetzt die Pfeiltasten betätigt verlangsamt sich dadurch die Bewegung des ersten Objekts, bzw. wird diese unregelmäßig. Dazu kommt, dass ich dem Spiel noch einige weitere timergesteuerte Objekte hinzufügen wollte. Kann man diese Verzögerung irgendwie verhindern? Edit: Mein Computer ist nciht besonders schnell. |
AW: Probleme mit TTimer durch andere Anweisungen
Hallöle...:P
Zeige mal den Code. 8-) Ich habe schon einen Verdacht... |
AW: Probleme mit TTimer durch andere Anweisungen
Die Tastensteuerung:
Delphi-Quellcode:
Dieser Code stammt aus einem anderen Forum, anders hat es nicht funktioniert
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin case Key of vk_Left: begin Ship.Bild.Left:=Ship.Bild.Left-Pixel; if Ship.Bild.Left<0 then Ship.Bild.Left:=0; end; vk_Right: begin Ship.Bild.Left:=Ship.Bild.Left+Pixel; if Ship.Bild.Left+Ship.Bild.Width>Form1.Width then Ship.Bild.Left:=Form1.Width-Ship.Bild.Width; end; vk_Space: Ship.Shoot; end; end;
Delphi-Quellcode:
Der Timer:
type
TForm1 = class(TForm) private procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; public { Public-Deklarationen } end; ... procedure TForm1.CMDialogKey(var Message: TCMDialogKey); begin with message do begin case charcode of vk_Left: begin Ship.Bild.Left:=Ship.Bild.Left-Pixel; if Ship.Bild.Left<0 then Ship.Bild.Left:=0; end; vk_Right: begin Ship.Bild.Left:=Ship.Bild.Left+Pixel; if Ship.Bild.Left+Ship.Bild.Width>Form1.Width-17 then Ship.Bild.Left:=Form1.Width-Ship.Bild.Width-17; end; vk_Space: Ship.Shoot; else inherited; end; end; end;
Delphi-Quellcode:
TShot ist eine eigene Klasse mit eingebautem Timer, der hier erstellt wird:
Procedure TForm1.ShotTimer(Sender: TObject);
begin if Sender=Ship.Shot.Timer then begin Ship.Shot.Bild.Top:=Ship.Shot.Bild.Top-Pixel; if Ship.Shot.Bild.Top+Ship.Shot.Bild.Height<=0 then Ship.Hit; end; end;
Delphi-Quellcode:
Constructor TShot.Create(X,Y,W,H: Integer; AP: TForm);
begin inherited Create(x,y,w,h,ap); Timer:=TTimer.Create(AP); with Timer do begin Interval:=50; OnTimer:=Form1.ShotTimer; Enabled:=True; end; end; |
AW: Probleme mit TTimer durch andere Anweisungen
Zwei Anmerkungen von mir:
1) es sieht zwar toll aus, und wenn es angeboten wird, warum nicht nutzen, aber vergiss bitte daß es sowas wie
Delphi-Quellcode:
überhaupt gibt.
with
Delphi-Quellcode:
ist genauso wie
with
Delphi-Quellcode:
ein Befehl, der Code unübersichtlicher macht, als man im ersten Moment denkt.
goto
2) Im Timer-Event immer den Timer abschalten, Code ausführen und dann wieder den Timer einschalten Sherlock |
AW: Probleme mit TTimer durch andere Anweisungen
Hallo,
ein Timer ist immer ungenau und hat eine geringere Priorität als andere Nachrichten (mit Ausnahme von WM_PAINT). Ich würde den Timer höher auflösen (Intervall kleiner machen) und selber bestimmen, ob das aktuelle Timer-Event zu einem Update der Schiffsposition führen soll (GetTickCount sollte da ausreichen). Du merkst dir dabei den aktuellen TickCount des Schiffes und wenn der neue GetTickCount im Timer-Event einen bestimmten Wert überschreitet, dann aktualisierst du dein Schiff. Du kannst dann mit einem Timer unterschiedliche "MerkeTickCounts" verwalten, uns somit mehrere Sachen steuern. |
AW: Probleme mit TTimer durch andere Anweisungen
Zitat:
|
AW: Probleme mit TTimer durch andere Anweisungen
Ok, wenn der Code nachweislich "schnell" ausgeführt wird, kann man es auch sein lassen. Aber wenn der Timer sich selbst einholt ist das nicht so gut. Oder hat sich da etwas geändert?
Sherlock |
AW: Probleme mit TTimer durch andere Anweisungen
Zitat:
Gerade bei sehr kurzen Timerintervallen kann es passieren, dass das Ereignis bereits wieder ausgelöst wird, bevor das letzte Ereignis komplett verarbeitet wurde. Bei dem Intervall von 50 MS hier im Beispiel kann es, wenn gleichzeitig ein Tastaturereignis durch Festhalten einer Taste sehr oft ausgeführt wird, eben zu dem beschriebene Verhalten kommen. Vor lauter Tastaturereignisverarbeitung und wiederholtem Auslösen des Timers kommt Windows irgendwie nicht mehr so recht mit und das System scheint mehr oder weniger zu stehen. Gerade langsamere System kann man so recht schnell und effektiv (bis zur Unbedienbarkeit) ausbremsen. |
AW: Probleme mit TTimer durch andere Anweisungen
Hallo...:P
...ihr seit mir wie immer zu schnell. :wink: Zitat:
|
AW: Probleme mit TTimer durch andere Anweisungen
@Sherlock: Danke für die Hilfe, ich habe gemacht was du geschrieben hast, ob das geholfen hat weis ich nicht, das Problem lag am Computer, der hatte schon immer ein Problem mit den Pfeiltasten. Die reagieren irgendwie etwas langsamer. Mit allen anderen Tasten funktioniert es ohne Probleme.
@hoika: Gute idee, ich probiers mal aus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz