SDL-Timerproblem
-
Hi,
ich suche einen Timer für eine SDL Anwendung, der einen Callback nach einer bestimmten Zeit aufruft und nicht das ganze Programm beim Ausführen bremst.
Meine ersten Versuche sehen so aus:
#include <time.h> SDL_TimerID idTimer; int zahl=0; Uint32 Callback(Uint32 x, void* parameter) { zahl++; return 0; } int main(int argc, char *argv[]) { done = 0; while ( ! done ) { while ( SDL_PollEvent(&event) ) { if ( event.type == SDL_QUIT ) { done = 1; } if ( event.type == SDL_KEYDOWN ) { if ( event.key.keysym.sym == SDLK_ESCAPE ) { done = 1; } } } idTimer= SDL_AddTimer((33/10)*10, Callback, NULL); } }
Doch bei meinem Programm tut sich garnichts. zahl wird nich hochgezählt.
Bitte helft mir.
Gruß Crabbe
-
Wer mit komplizierten Lösungen kommt, hat das Problem nicht klar erkannt:
-
Bitte lies dir noch einmal meine Frage durch. Ich wollte einen Timer der NICHT das ganze Programm bremmst. Das ist beim deinem vorgeschlagenen Timer(den ich übrigends auch schon in der docu gefunden habe) definitiv der Fall.
Gruß Crabbe
-
Bitte lesen. Danke.
Bye, TGGC (Reden wie die Großen)
-
Bei google hab ich schon gesucht, aber nichts passendes gefunden. Was ist denn an meinem Code falsch?
Gruß Crabbe
PS: "Reden wie die Großen" , weißt du eigentlich wie arrogant das klingt?
-
Crabbe schrieb:
PS: "Reden wie die Großen" , weißt du eigentlich wie arrogant das klingt?
Weiß er...
[quote="Crabbe"]
#include <time.h> SDL_TimerID Timer_Zahl; int Zahl = 0; Uint32 Callback(Uint32 x, void* parameter) { Zahl++; return 0; } int main(int argc, char *argv[]) { Timer_Zahl = SDL_AddTimer((33 / 10) * 10, Callback, NULL); // ^^^^^^^ ?? if(Timer_Zahl <= 0) // Fehler? done = 0; while(!done) { if(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT) done = 1; if(event.type == SDL_KEYDOWN) { if(event.key.keysym.sym == SDLK_ESCAPE) done = 1; } } } return 0; }
-
Hi, danke für deine Antwort, aber was ist an deinem Code jetzt anders als an meinem, außer, dass du den Timer außerhalb der while-Schleife gelegt hast und ich innerhalb?
Ich habe mir das eigentlich immer so gedacht, dass ich den Timer in der while-Schleife abfrage und wenn eine bestimmte Zeit vorbei ist, wird eine Funktion aufgerufen(Callback). Korrigiere mich bitte, wenn ich mich irre.
In meinem Programm wollte ich eigentlich in einer Tastaturabfrage den Timer setzten.
Quasi so://... while(!done) { if(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT) done = 1; if(event.type == SDL_KEYDOWN) { if(event.key.keysym.sym == SDLK_ESCAPE) done = 1; } } } /... if(keys[SDLK_w]) //überprüft, ob Taste w gedrückt wurde { //hier soll Timer hin zahl++; //Zahl soll sich nur nach einer bestimmten Zeit erhöhen, die immer //gleich bleiben soll } return 0; }
Gruß Crabbe
-
Crabbe schrieb:
Hi, danke für deine Antwort, aber was ist an deinem Code jetzt anders als an meinem, außer, dass du den Timer außerhalb der while-Schleife gelegt hast und ich innerhalb?
Wenn Du den Timer in einer Schleife immer wieder neu erstellst wird er wohl nie mal auslösen können...
Aber das wichtigste hast Du leider gar net beantwortet und lässt mich (als potentiellen Helfer) im Dunkeln stehen: Funzt es jetzt!?!?
Crabbe schrieb:
Ich habe mir das eigentlich immer so gedacht, dass ich den Timer in der while-Schleife abfrage und wenn eine bestimmte Zeit vorbei ist, wird eine Funktion aufgerufen(Callback). Korrigiere mich bitte, wenn ich mich irre.
Das wäre ja ziemlicher Quatsch. Dann könntest Du die Funktion in der if-Abfrage ja direkt selber aufrufen.
Eine CALLBACK Funktion ist üblicherweise ein Funktion, die man zwar schreibt, aber selber im Code nicht aufrufen wird. Stattdessen teilt man einen Zeiger auf diese Funktion einer API (gibt's in Win-API, DirectX, und wohl auch in SDL) mit, woraufhin diese dann, wenn irgendetwas eintritt, diese Funktion aufruft, und Du dann in der Funktion entsprechend reagieren kannst.
Windows ruft die WinProc Callback auf, wenn Messages in Deinem Message Queue sind.
DirectX ruft z.B. bei jedem Joystick / Eingabegerät eine Funktion auf, woraufhin Du dann in der Funktion reagieren kannst (in 'nem Array für spätere Verwendung speichern z.B.), und SDL wohl hoffentlich, wenn Dein Timer 1000 ms gewartet hat.Zudem solltest Du Rückgabewerte überprüfen. Ich kenne zwar SDL kein Stück, aber es wird Dir sicherlich mit 'nem Wert < 0 oder einem SDL_ERR oder sonstwas mitteilen, daß es keinen Timer für Dich erstellen konnte.
BTW: Gibst Du die Zahl auch irgendwo aus, oder wie merkst Du, ob sie sich verändert hat??
-
Hi,
ich habe den Rückgabewert des Timers jetzt zurückgeben lassen. Der Code funzt nicht.
In meinem Programm spiel ich eine 2D-Animation aus mehreren Bildern ab und "zahl" gibt die nummer des Bildes an, welches gerade gezeichnet werden soll.
int etwa so:
int zahl=0;
SDL_Surface *bild[4];
while(Programm läuft)
{Tastaturabfrage
{
if(zahl<=3) {zahl++;}
else {zahl=0;}
}bild[zahl] wird gezeichnet.
}
Die Animation klappt auch wunderbar, nur möchte ich, dass die Bilder immer nach einer konstanten Zeit gwechselt werden(also "zahl" hochgezählt wird). Der Timer soll aber nicht das ganze Programm bremsen, sondern nur das Wechseln der Bilder.
Wüsstest du vielleicht noch andere Gründe, warum der Timer nicht funzt?
Gruß Crabbe
-
Laß Dir Zahl sicherheitshalber ausgeben.
Oder schau es im Debugger an.