wie am besten geschwindigkeiten umsetzen?



  • Hier in SDL:

    void Calc()
    {
        static int Last;
        const int Past = SDL_GetTicks() - Last;
    
        if(Past == 0.0f)
           mFps = 1000.0f;
         else
           mFps = (1000.0f / Past);
    
         Last = SDL_GetTicks();
    }
    

    Wenn du es genauer haben willst:

    //Variablen zum berechnen
    LONGLONG freq;
    LONGLONG lastFrame;
    LONGLONG CurrentFrame;
    
    //Muss im Konstruktor:
    QueryPerformanceFrequency((LARGE_INTEGER*)&m_Freq);
    
    //brechne die Frames per Seconds
    {
    
        QueryPerformanceCounter((LARGE_INTEGER*)&m_LastFrame);
    
        //Render
    
        QueryPerformanceCounter((LARGE_INTEGER*)&m_CurrentFrame);
        m_Elapsed = m_CurrentFrame - m_LastFrame;
        double m_FPS = (double)((double)m_Freq / (double)m_Elapsed);
        m_LastFrame = m_CurrentFrame;
    }
    

    Dieser Code ist aber nicht plattformabhänging, also funktioniert nur auf Windows Plattformen.

    MFG Lars



  • ChrisFehn3 schrieb:

    Hier in SDL:

    void Calc()
    {
        static int Last;
        const int Past = SDL_GetTicks() - Last;
    
        if(Past == 0.0f)
           mFps = 1000.0f;
         else
           mFps = (1000.0f / Past);
           
         Last = SDL_GetTicks();
    }
    

    1.öhm last hat keinen wert was soll dann von past abgezogen werde.
    2. wie implementiere ich das in meinen code.
    MFG Lars



  • int
    fps(void) {
       static int frames = 0;
       static int last = SDL_GetTicks();
       int f = 0, now = SDL_GetTicks();
    
       if (now-last>=1000) {
          last = now;
          f = frames;
          frames = 0;
       }
       frames++;
       return (f);
    }
    

    So, das implementiere muss du selbst machen. Hättes ja auch vorher mal Google.de fragen könne, der hätte dir sofort die Antwort auf deinen Problem gegeben.

    MFG Lars



  • könnntest du ma deinen code genauer beschreiben?^^ ist irgendwie sehr verwirrend. oder kannst du mir sagen wonach ich in google suche muss?



  • Wechsel doch einfach die Bildchen nicht nach jedem Frame, sondern nach 1/4 sec., oder nach 1 sec., oder nach 2 sec., oder nach...



  • // INIT:
    int StartZeit = HoleAktuelleZeit();  // Wieviel Uhr ist es jetzt? --> Z.B. 1000 Uhr
    int ZeitBisDerNaechsteFrameAbgespieltWerdenSoll = 500;  // Nach 500 Zeiteinheiten die Animation weiterschalten
    int AktuellesAnimationsBild = 15;  // Mit dem 15. Bild der Animation starten (Steh-Animation)
    
    // GAMELOOP:
    ...
    
    int ZeitDieFuerDenLetztenFrameGebrauchtWurde = HoleAktuelleZeit() - StartZeit;  // Wie lange hat der letzte Frame gedauert? --> Z.B. 1400 Uhr - 1000 Uhr = 400 Zeiteinheiten
    if(ZeitDieFuerDenLetztenFrameGebrauchtWurde >= ZeitBisDerNaechsteFrameAbgespieltWerdenSoll)  // Die Zeit ist rum, nächstes Animations-Bild abspielen -> z.B. 400 >= 500 ? Nein, also noch nicht wechseln!
    {
        AktuellesAnimationsBild += 1;  // Auf das nächste Bild schalten (Abfrage für MaxBilder fehlt!)
    }
    
    StartZeit = HoleAktuelleZeit();  // Die StartZeit auf die aktuelle Zeit zurücksetzen (StartZeit ist dann beim nächsten Aufruf 1400 Uhr statt 1000 Uhr)
    
    ...
    


  • Dann fehlt noch das droppen von Frames, falls die Grafikdarstellung zu langsam ist.



  • Ich mach es immer so, dass ich die Zeit-Differenz (in millisekunden) zwischen zwei Frames nehme und mit 0.001f multipliziere. Diesen Wert, den ich daraus bekomme, multipliziere ich mit jeden Geschwindigkeitsänderungen... also beispielhaft so:

    float faktor = (lastFrameTime - currentFrameTime) * 0.001f;
    ...
    obj.x += obj.speed_x * faktor;
    obj.y += obj.speed_y * faktor;
    

    (wobei speed_x die erwünschte geschwindigkeit in px pro sekunde darstellt
    und bei animationen das gleiche:

    float frame = 0;
    ...
    frame += ani_fps * faktor;
    showFrame( (int)frame );
    

    (ani_fps = gewünschte frames pro sekunde der animation)
    dann kommt man immer auf die selbe fps-zahl der animation oder die selbe geschwindigkeit ovn objekten, unabhängig von der frame-rate



  • Optimizer schrieb:

    Dann fehlt noch das droppen von Frames, falls die Grafikdarstellung zu langsam ist.

    Da fehlt noch so einiges... 😉 :xmas2:

    Aber für den Anfang sollte das wohl mal reichen... :xmas1:



  • Was fehlt mir denn noch? 😕 🤡 👍



  • Curved Surfaces z.B. ... 🤡 👍

    ...und 'ne dicke Wumme mit massiv BUMMS! :xmas2: 😃



  • Und ein Quarterpounder mit Käse. :xmas2:



  • ROFL

    Aber die haben doch das metrische System... :xmas1: 👍



  • Mein Hauptloop geht in etwa so (übertragbar auf andere Counter und Grafiklibs):

    int ticks;
    unsigned delay = 20; //So lang dauert ein Logikschritt. In diesem Beispiel haben wir 50 Logikschritte in der Sekunde
    bool drawn = false;
    int time = 0;
    while(!done)
    {
      ticks = SDL_GetTicks();
    
      if(time < delay)  //Grafiksachen erledigen
      {
        if(!drawn)  //Wenn im letzten Durchlauf nicht schonmal gerendert wurde
        {
          //Hier zeichnen!
          drawn = true;
        }
        else  //Ansonsten warten wir einfach, weil was bringt es, zweimal das selbe Bild zu zeichnen?
        {
          SDL_Delay(delay); //warten. evtl. auch nicht, SDL_Delay() frisst oft zu viel Zeit
        }
      }
      else //Spiellogik erledigen
      {
        //Hier Logik
        time -= delay;  //Die Logik bringt wieder Zeit rein, dh wir lassen im Spiel Zeit weitergehen, wenn wir die Logik ausführen
        drawn = false;  //Es hat sich was verändert, also sollten wir das Bild neu zeichnen
      }
    
      time += SDL_GetTicks() - ticks;
    }
    

    Das ganze kann problematisch werden. Bei sehr langsamen Computern (oder zu niedrigem delay) führt es zu einer Endlosschleife. Das kann man verhindern, indem man sagt, dass die Logik nicht zu oft hintereinander ausgeführt werden darf. Bei sehr schnellen Computern gibt es vielleicht auch ein Problem, wenn SDL_GetTicks() - ticks == 0 ist. Das habe ich mir noch nicht überlegt.
    Diese Variante funktioniert bei Pixelgrafik gut. :xmas2:
    geloescht


Anmelden zum Antworten