SDL + OpenGL, Scrollgeschwindigkeit von Bildern an Framerate anpassen



  • Moin,

    ich habe da ein kleines Problem bei der Anpassung der Scrollgeschwindigkeit von Bildern an die Framerate - damit das Spiel immer gleich schnell läuft.

    Das hier wird jeden Frame ausgeführt:

    current_frame=SDL_GetTicks();
    frame_time=(double)(current_frame-last_frame)/10;
    if(keys[SDLK_d])
    {
    x_player+=1*frame_time;
    }
    

    Soweit, so gut. Nun bekomme ich dadurch ja Zahlen mit einer Nachkommastelle. So wird dann das eigentliche Bild gezeichnet:

    glVertex2d(x_player,y_player);
    

    Das funktioniert soweit auch, sprich unabhängig von der Framerate bewegt sich der Spieler immer im gleichen Tempo. ABER: Durch die Nachkommastellen wird die Textur (die mit glTexCoord2f auf das Polygon gepappt wird) sehr seltsam angezeigt. Mal ganz scharf, mal weichgezeichnet und mit einem weissen Rand links.

    Wie kann ich das umgehen? Nachkommastellen sind ja wohl zwangsläufig unumgänglich, um das Ganze wirklich immer gleich schnell ablaufen zu lassen, oder? Klar, ich könnte bei (current_frame-last_frame)/10 die Division durch 10 weglassen, aber dann würde sich das Bild zu schnell bewegen. Ich muss es irgendwie langsamer bekommen.

    Doofe Frage, ich weiss. Bin aber um jede Hilfe dankbar.

    Gruß.



  • Fließkommazahl nach Ganzzahl casten?



  • Das hätte zur Folge, dass das Spiel je nach Framerate unterschiedlich schnell läuft, denn wenn das Bild - abhängig von den Frames - 1.2 Einheiten verschoben werden müsste, wird es nur um eine Einheit verschoben. Bei 1.9 Einheiten, würde es auch nur um eine Einheit verschoben werden.

    Wenn also ein Frame einmal 17 statt 10 Ticks dauert, sollte das Bild etwas schneller verschoben werden, damit die Animation wirklich unabhängig von den FPS abläuft. Das wäre beim Casting nicht der Fall.



  • der effekt den du siehst heisst "bilinear filtering" (siehe auch sub-pixel/-texel korrektur).
    wenn du mal genau drueber nachdenkst, wirst du sicher einsehen, dass es anders nicht moeglich ist, eine "grafik" um weniger als 1 pixel zu bewegen.
    wenn dich das filtering stoert, schalte es doch einfach ab - dann wirst du auch feststellen, dass die textur nur noch um jeweils einen ganzen pixel weiter springt.
    bzgl der weissen kante hast du wahrscheinlich mapping-koordinaten von 0.0-1.0 definiert.



  • Wegen den Texturkoordinaten... Lad die einfach nicht als Clampmap sondern benutz Repeat, dadurch kannste auch Texturkoordinaten wie 5.3 27.4 nehmen... Ist aber wohl eher en schlechter Hack für dein Problem...


Anmelden zum Antworten