G
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