Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Probleme mit TTimer durch andere Anweisungen (https://www.delphipraxis.net/191544-probleme-mit-ttimer-durch-andere-anweisungen.html)

Benni0811 26. Jan 2017 12:08

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.

haentschman 26. Jan 2017 12:15

AW: Probleme mit TTimer durch andere Anweisungen
 
Hallöle...:P
Zeige mal den Code. 8-) Ich habe schon einen Verdacht...

Benni0811 26. Jan 2017 12:23

AW: Probleme mit TTimer durch andere Anweisungen
 
Die Tastensteuerung:
Delphi-Quellcode:
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;
Dieser Code stammt aus einem anderen Forum, anders hat es nicht funktioniert
Delphi-Quellcode:
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;
Der Timer:

Delphi-Quellcode:
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;
TShot ist eine eigene Klasse mit eingebautem Timer, der hier erstellt wird:
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;

Sherlock 26. Jan 2017 12:28

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:
with
überhaupt gibt.
Delphi-Quellcode:
with
ist genauso wie
Delphi-Quellcode:
goto
ein Befehl, der Code unübersichtlicher macht, als man im ersten Moment denkt.
2) Im Timer-Event immer den Timer abschalten, Code ausführen und dann wieder den Timer einschalten

Sherlock

hoika 26. Jan 2017 12:34

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.

Uwe Raabe 26. Jan 2017 12:41

AW: Probleme mit TTimer durch andere Anweisungen
 
Zitat:

Zitat von Sherlock (Beitrag 1360037)
2) Im Timer-Event immer den Timer abschalten, Code ausführen und dann wieder den Timer einschalten

Warum? Oder genauer: Warum immer?

Sherlock 26. Jan 2017 12:43

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

nahpets 26. Jan 2017 12:51

AW: Probleme mit TTimer durch andere Anweisungen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1360039)
Zitat:

Zitat von Sherlock (Beitrag 1360037)
2) Im Timer-Event immer den Timer abschalten, Code ausführen und dann wieder den Timer einschalten

Warum? Oder genauer: Warum immer?

Praktische Erfahrung:
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.

haentschman 26. Jan 2017 12:54

AW: Probleme mit TTimer durch andere Anweisungen
 
Hallo...:P
...ihr seit mir wie immer zu schnell. :wink:
Zitat:

Gerade langsamere System kann man so recht schnell und effektiv (bis zur Unbedienbarkeit) ausbremsen.
... meine Rede (Idee). 8-)

Benni0811 26. Jan 2017 12:54

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 04:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz