Ich arbeite an einem 2D-Spiel für ein Schulprojekt. Die Vorlage, die mein Lehrer gegeben hat, funktioniert gut, aber ich wollte eine sehr, sehr dumme Sache im Code ersetzen. Im Code ruft er eine schwere Methode 20 Mal auf, um das Spiel zu verlangsamen. Anstatt das zu tun, möchte ich überprüfen, ob der nächste Frame verarbeitet werden soll.
Das Spiel ist ein Objekt im Vorlagen-Namespace. Dieser Namespace hatte eine Endlosschleife, die die Spiel-Tick-Methode aufruft und die Frame-Puffer austauscht.
In dieser Vorlage habe ich das Game->Tick()
durch eine einfache if-Anweisung ersetzt:
if (game->Ready(lastftime)) {
game->Tick();
}
lastframe
ist die Zeitdifferenz in Sekunden zwischen dem letzten Aufruf und jetzt. Ich weiß, dass ich diese Zeit verwenden könnte, um Bewegungen innerhalb des Spiel-Ticks zu berechnen, aber das ist nicht das, was ich jetzt tun will!
Dies ist die Ready
Methode:
bool Game::Ready(float timedif) {
// Zeit zum Framezähler hinzufügen
framecounter += timedif;
// Überprüfen, ob der Zähler die fps überschreitet
if (framecounter > fps) {
// Falls ja, subtrahiere die fps vom Zähler
while (framecounter > fps) {
framecounter -= fps;
}
m_Screen->Clear(0);
Draw();
return true;
}
// Frame liegt immer noch innerhalb des fps-Bereichs
return false;
}
fps
wird wie folgt berechnet: fps = 1000.0f/60
Ich habe keine Ahnung, warum es nicht mit 60 Frames pro Sekunde läuft, und ich bin zu 100% sicher, dass es öfter aufgerufen wird als das (getestet mit einem printf
). Jede Hilfe wäre willkommen.