Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit DXTimer (https://www.delphipraxis.net/20911-problem-mit-dxtimer.html)

Montu 25. Apr 2004 10:09


Problem mit DXTimer
 
möchte nen kleines spiel(Pong) programmieren und benutze für die bewegung des Balls nen DXTimer, damit der Ball schneller ist. An sich läuft alles ohne Probleme, aber wenn ich dann im Spiel die Maus bewege, wird der Ball aufeinmal schneller, obwohl ich kein ereignis für onmousemove gesetzt hab. dürfte also eigentlich nicht sein.
liegt das jetzt am dxtimer selbst oder doch am code?

hier mal der code vom timer:


Code:
procedure TForm1.DXTimerBallTimer(Sender: TObject; LagCount: Integer);
begin
durchlauf:=durchlauf+1;
if durchlauf=1000 then                     //ball bewegung erst nach 1000 durchläufen, da interval auf 0
begin
if image3.top<=2 then                      //kollision oben
bally:=bally*(-1);                         //ball nach unten
if image3.top+20>=430 then                 //kollision unten
bally:=bally*(-1);                         //ball nach oben
if (image3.left=image1.left)and(image3.top+20>=image1.top)and(image3.top<=image1.top+64) then        //kollision mit player 1
ballx:=ballx*(-1);                         //ball nach rechts
if (image3.left+20=image2.left)and(image3.top+20>=image2.top)and(image3.top<=image2.top+64)then      //kollision mit player 2
ballx:=ballx*(-1);                         //ball nach links
if (image1.top=image3.top+20)and(image1.left<=image3.left+40)and(image1.left>=image3.left)then        //kollision mit player 1
bally:=-1;                                 //ball nach oben
if (image1.top+64=image3.top)and(image1.left<=image3.left+40)and(image1.left>=image3.left)then        //kollision mit player 1
bally:=1;                                  //ball nach unten
if (image2.top=image3.top+20)and(image2.left<=image3.left+40)and(image2.left>=image3.left)then        //kollision mit player 2
bally:=-1;                                 //ball nach oben
if (image2.top+64=image3.top)and(image2.left<=image3.left+40)and(image2.left>=image3.left)then        //kollision mit player 2
bally:=1;                                  //ball nach unten

Jörn 25. Apr 2004 10:18

Re: Problem mit DXTimer
 
Stell mal das Interval auf 1 dann sollte das gehen... weil bei 1 hast 'genau' eine Millisekunde, bei 0 heisst das nur: so oft wie möglich. Und dann ist die Zeit nicht immer dieselbe. Ach und noch etwas: auf verschiedenen Rechnern wird dein Spiel unterschiedlich schnell sein. Mach dir mal Gedanken dadrüber *gg*

Montu 25. Apr 2004 10:26

Re: Problem mit DXTimer
 
danke.
hätte ich aber auch selbst drauf kommen können :oops:

ist zwar auf 1 langsamer aber das kann man ja mit ner for schleife wieder verändern ;)

und das das auf anderen rechnern unterschiedlich schnell läuft ist mir auch klar. aber wofür gibt es mind. systemanforderungen *gg*

Jörn 25. Apr 2004 12:21

Re: Problem mit DXTimer
 
Ja darum geht es ja nicht. Sagen wir mal es läuft mit 1GHz viel zu langsam, auf nem 2GHz richtig und auf 3GHZ viel zu schnell?? Dagegen musst du was machen...

Montu 25. Apr 2004 13:15

Re: Problem mit DXTimer
 
hatte das falsch verstanden. dachte, das wäre als scherz gemeint. jetz hab ich das mal am laptop getestet und das ist echt viel langsamer.

aber ich hab nich wirklich nen ansatz, wie ich die geschwindigkeit einheitlich machen kann. man müsste ja bei schnelleren rechnern die geschwindigkeit irgendwie drosseln und bei langsameren beschleunigen. aber wie das gehen soll. weiß ich nich.
kannst du mir vielleicht ne kleine hilfe geben?

Mautstelle 29. Apr 2004 18:46

Re: Problem mit DXTimer
 
ich hab grade das gleiche problem: mein Spiel ist auf unterschiedlichen Rechnern unterschiedlich schnell... da ich mein Spiel über Netzwerk spielen will, ist das leicht problematisch, wenn manche viel schneller rumlaufen können als andere :mrgreen:

Es muss doch irgendwie möglich sein, dass es bei langsamen rechnern halt weniger frames gibt und das spiel ruckelt oder hüpft und bei schnellen und sehr schnellen mit der gleichen speed flüssig läuft. Bei counterstrike o.ä. geht das ja auch... :?:

also wenn jemand von euch eine lösung findet wäre das echt cool.

Gandalfus 29. Apr 2004 18:57

Re: Problem mit DXTimer
 
schneller wird es bestimmt nicht eine Millisekunde ist eine Millisekunde!

Jörn 29. Apr 2004 21:24

Re: Problem mit DXTimer
 
Ganz einfach geht das. Du baust dir die Funktion ein, die 'Frames' pro Sekunde zu berechnen.
Ungefähr so:

Delphi-Quellcode:
var
StartTick: Int64;
ms_per_frame: double;
FPS: double;
Frames: Cardinal;

Bevor das Spiel startet:

Delphi-Quellcode:
StartTick := GetTickCount; //in eine globale Variable die Systemzeit, auf Millisekunden genau, reicht hier völlig
Dann in der Schleife

Delphi-Quellcode:
inc(Frames); //ein 'Bild' wurde gezeichnet
if GetTickCount - StartTick >= 500 then //jede halbe Sekunde ausführen
 begin
 FPS         := Frames / (GetTickCount-StartTick) * 1000; //die durchschnittlichen FPS der letzten halben Sekunde errechnen
 ms_per_frame := 1000 / FPS; //durchschnittliche Zeit pro Frame
 Frames      := 0;
 StartTick   := GetTickCount
 end;
Und dann machst du die Bewegungen der Gegenstände usw einfach von den FPS oder der Zeit pro Frame abhängig. Zum Beispiel in der Schleife:

Delphi-Quellcode:
position := position + Bewegungsreichweite_pro_Sekunde * ms_per_frame;
Wenn du damit ein wenig experimentierst, läuft das wunderbar.

MfG

Mautstelle 30. Apr 2004 15:18

Re: Problem mit DXTimer
 
ah cool. besten dank. Da kann ich doch eigentlich auch direkt DXTimer.Framerate verwenden, oder?

Jörn 1. Mai 2004 11:09

Re: Problem mit DXTimer
 
Kannte ich noch nicht, aber dürfte gehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 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