Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 14:26

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TimeBased Movement
BeitragVerfasst: Sa Jun 25, 2005 11:24 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Bevor ich mein Projekt vorstelle, muss ich noch ein Problemm beseitigen. Ich mache gerade noch einen AsteroidClone ;), und alles läuft Perfekt, zu Perfekt. Alles (Shoots, Explosions, Asteroids) was sich im Spiel bewegt, ist Zeit-, und nicht Frame-bedingt. Gut so. ABER, das Schiff kriege ich einfach nicht hin. Es scheint noch immer, als würde die Geschwiendigkeit von der FrameRate abhängen und nicht von der Zeit :(.
Ich gebe jetzt heir das "bewegungs" Code, damit vielleicht jemad einen Fehler finden könnte.

Code:
  1.  
  2. //---so wird TimeStep erzeugt
  3.   QueryPerformanceCounter(FCurrentTime );
  4.   TimeStep := (FCurrentTime - FFrameTime) / FFreq ;// calculate the game speed, timestep : single
  5.   FFrameTime := FCurrentTime; // beide sind int64
  6. //----
  7.  
  8.  // are we accelerating
  9.  
  10.  if(Hi(GetAsyncKeyState(F_VK_UP))=128) then
  11.    begin         // yes
  12.        // accelerate player
  13.        FNewVelocity_S := FNewVelocity_S + TimeStep/10;// FNewVelocity_S ist von Single type
  14.  
  15.        if FNewVelocity_S>MAX_SPEED then
  16.          FNewVelocity_S := MAX_SPEED;
  17.  
  18.        tempNewVelocity := SetVectorbyAngle2f(Angle,FNewVelocity_S);
  19.       // setvectorbyangle mach folgendes :
  20. //  tempNewVelocity[x] := cos(Angle*pi/180) * FNewVelocity_S;
  21. //  tempNewVelocity[y] := sin(Angle*pi/180) * FNewVelocity_S;
  22.  
  23.    end else
  24.    begin         // no
  25.      FNewVelocity_S := 0;
  26.      tempNewVelocity := Vector2f(0,0);
  27.  
  28. {$IF DEFINED (turbo_mode) }
  29.      breakSpeed := 0.2;
  30. {$ELSE}
  31.      breakSpeed := 0.5;
  32. {$IFEND}
  33.  
  34.      tempLength := VectorLength2f(FVelocity);
  35.      if (tempLength - breakSpeed * TimeStep) <=0 then
  36.        FVelocity := Vector2f(0.0,0.0)
  37.        else
  38.        VectorMulScalar(FVelocity, (tempLength  - breakSpeed * TimeStep )/tempLength ); // VectorGrösse MAL SclarGrösse
  39.    end;
  40.   // calculate the Velocity
  41.   FVelocity := VectorAdd2f(FVelocity,tempNewVelocity);// fvelocity :=  fvelocity + temNewVelocity;
  42.   // correct the speed value
  43.   tempLength := VectorLength2f(FVelocity);
  44.   if tempLength>MAX_SPEED then
  45.     VectorMulScalar(FVelocity, MAX_SPEED / tempLength);
  46.  
  47.   Position := VectorAdd2f(Position, FVelocity); // Position :=  Position + FVelocity;
  48.  

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 25, 2005 12:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Kein Wunder du hast ja auch keine zeitbasierende Bewegung sondern eine Zeit bassierende Beschleunigung. Sprich du musst den Geschwindigkeits Vektor den du addierst noch mit einen Zeitfaktor multiplizieren.

Hat zum Beispiel das Raumschiff die Maximale Geschwindigkeit erreicht weget es sich bei jeden Durchlauf um einen Geschwindkeits Vektor vor. Du willst ja aber das der zurückgelegte Weg von der Zeit abhängt.

also: Weg(neu) = Weg(alt) + Geschwindkeit*Zeit

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 25, 2005 13:20 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Genau das gleiche Problem hatte ich auch. Ich hatte aber damals den Eindruck, dass es nicht ausreicht, die Beschleunigung mit dem Timefactor zu multiplizieren und die Geschwindigkeit mit dem Timefactor zu multiplizieren.

Man muss also sowohl beim Beschleunigen als auch bei der eigentlichen Bewegung den Timefactor einbeziehen?

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 25, 2005 16:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Frase hat geschrieben:
Genau das gleiche Problem hatte ich auch. Ich hatte aber damals den Eindruck, dass es nicht ausreicht, die Beschleunigung mit dem Timefactor zu multiplizieren und die Geschwindigkeit mit dem Timefactor zu multiplizieren.

Man muss also sowohl beim Beschleunigen als auch bei der eigentlichen Bewegung den Timefactor einbeziehen?


Vielleicht erinnert sich noch einer an den Physikunterricht:

Zurückgelegter Weg= 0.5*a*t² + v*t + X

Steng genommen müsstet ihr das dann auch so in euren Anwendungen umsetzen, also:
Code:
  1.  
  2. //Variablen euer Klasse:
  3.   Geschwindigkeit:TVektor3f;
  4.   Position:TVektor3f;
  5.   Antrieb:TVektor3f;//  Antrieb = 0.5*(Bescheunigung a)
  6. {...}
  7. procedure BerechneNeuePosition(VergangeneZeit:Single);
  8. begin
  9.   Position := Antrieb*qtr(VergangeneZeit) + Geschwindigkeit*VergangeneZeit + Position;
  10.   Geschwindigkeit := Antrieb*VergangeneZeit + Geschwindigkeit;
  11. end;
  12.  


MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]