![]() |
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 |
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*
|
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* |
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...
|
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? |
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. |
Re: Problem mit DXTimer
schneller wird es bestimmt nicht eine Millisekunde ist eine Millisekunde!
|
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:
Dann in der Schleife
StartTick := GetTickCount; //in eine globale Variable die Systemzeit, auf Millisekunden genau, reicht hier völlig
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
Wenn du damit ein wenig experimentierst, läuft das wunderbar.
position := position + Bewegungsreichweite_pro_Sekunde * ms_per_frame;
MfG |
Re: Problem mit DXTimer
ah cool. besten dank. Da kann ich doch eigentlich auch direkt DXTimer.Framerate verwenden, oder?
|
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