AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Probleme mit TTimer durch andere Anweisungen
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit TTimer durch andere Anweisungen

Ein Thema von Benni0811 · begonnen am 26. Jan 2017 · letzter Beitrag vom 26. Jan 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benni0811

Registriert seit: 26. Sep 2016
25 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:08
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

AW: Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:15
Hallöle...
Zeige mal den Code. Ich habe schon einen Verdacht...
  Mit Zitat antworten Zitat
Benni0811

Registriert seit: 26. Sep 2016
25 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:23
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#4

AW: Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:28
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 with überhaupt gibt. with ist genauso wie 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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:34
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.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:41
2) Im Timer-Event immer den Timer abschalten, Code ausführen und dann wieder den Timer einschalten
Warum? Oder genauer: Warum immer?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#7

AW: Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:43
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#9

AW: Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:54
Hallo...
...ihr seit mir wie immer zu schnell.
Zitat:
Gerade langsamere System kann man so recht schnell und effektiv (bis zur Unbedienbarkeit) ausbremsen.
... meine Rede (Idee).
  Mit Zitat antworten Zitat
Benni0811

Registriert seit: 26. Sep 2016
25 Beiträge
 
Delphi 10.1 Berlin Starter
 
#10

AW: Probleme mit TTimer durch andere Anweisungen

  Alt 26. Jan 2017, 13:54
@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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 Uhr.
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