SDL_PollEvent



  • Kann mir jemand genau(!) erklären was SDL_PollEvent macht? Also im groben versteh ichs schon, aber was läuft da genau ab?
    Folgendes Bsp:

    while(exit == false)
    {
            while(SDL_PollEvent(&event))
            {
                if(event.type == SDL_QUIT)
                {
                    exit = true;
                }
    
                if(event.type == SDL_KEYDOWN)
                {
                    switch( event.key.keysym.sym )
                    {
                        case SDLK_UP: --Y;
                        case SDLK_DOWN: ++Y;
                        case SDLK_LEFT: --X;
                        case SDLK_RIGHT: X++;
                        default:;
                    }
                }
            }
    }
    

    Warum braucht man bei der Konstruktion von solch einer Event Schlefie eig. 2 Schleifen? Reicht da nicht eine?
    Vll. kennt sich jemand von euch mit der SDL gut aus.

    MfG
    Stromberg



  • Stromberg schrieb:

    Kann mir jemand genau(!) erklären was SDL_PollEvent macht? Also im groben versteh ichs schon, aber was läuft da genau ab?
    Folgendes Bsp:

    while(exit == false)
    {
            while(SDL_PollEvent(&event))
            {
                if(event.type == SDL_QUIT)
                {
                    exit = true;
                }
    
                if(event.type == SDL_KEYDOWN)
                {
                    switch( event.key.keysym.sym )
                    {
                        case SDLK_UP: --Y;
                        case SDLK_DOWN: ++Y;
                        case SDLK_LEFT: --X;
                        case SDLK_RIGHT: X++;
                        default:;
                    }
                }
            }
    }
    

    Warum braucht man bei der Konstruktion von solch einer Event Schlefie eig. 2 Schleifen? Reicht da nicht eine?
    Vll. kennt sich jemand von euch mit der SDL gut aus.

    MfG
    Stromberg

    Nein, du brauchst 2 Schleifen. Die erste Schleife läuft solange bis exit = true wird. Zum Beispiel könnte man auch exit = true setzen, wenn jemand die ESC-Taste drückt. Die zweite Schleife fragt ab, ob irgendwelche Ereignise eingetroffen sind und das solange bis es keine mehr gibt -> Alle verarbeitet sind! Wie du siehst macht also auch diese Schleife Sinn.



  • Mit SDL_PollEvent holst du dir das Event vom OS. Falls es mehrere Events gab müssen die auch alle abgearbeitet werden. Daher das while vor SDL_PollEvent(&event).



  • SDL_PollEvent holt sich pro Funktionsaufruf immer nur 1 Event vom Betriebssystem (welches die Events wohl in einer Art list oder stack an eine Schnittstelle schickt).

    Also

    1. Schleifendurchgang und Aufruf von SDL_PollEvent(&e):
    
    -SDL_PollEvent füllt e mit Daten (z.B. Mausdruck)
    -Du machst was damit und reagierst entsprechend darauf
    -Schleifendurchgang Ende
    
    2. Schleifendurchgang und Aufruf von SDL_PollEvent(&e):
    
    -SDL_PollEvent fragt das Betriebssystem noch einmal, ob vielleict NOCH ein 
     event zum abholen da ist
    - Du machst was damit
    -Schleifendurchgang Edne
    

    Und so weiter und so weiter.

    Man macht das in einer Schleife, weil es durchaus vorkommen kann, das zwischen 2 Schleifendurchgängen mehr als 1 Event ausgelöst wird. Du könntest durchaus die schleife weglassen, aber dann frägst du halt beim jeden durchlauf der schleife nur das "oberste" event in der liste ab.



  • @TravisG:
    Man könnte das genausogut so lösen:

    while (!exit)
    {
        if (SDL_PollEvent(&event))
            handle_event(event);
        else
            render_frame();
    }
    


  • hustbaer schrieb:

    @TravisG:
    Man könnte das genausogut so lösen:

    while (!exit)
    {
        if (SDL_PollEvent(&event))
            handle_event(event);
        else
            render_frame();
    }
    

    Theoretisch ja, aber die "große" while schleife ist ja nur das, in der dann auch sachen wie rendering, logik usw ablaufen. wenn du das so machst, frägst du bei jedem schleifendurchgang nur 1 event ab. dann hast du vielleicht einen mausclick, aber bis du beim "tastendruck escape" angekommen bist, können schon 2 oder 3 weitere durchgänge vergehen.



  • WTF?
    Hast du das if übersehen, oder ... ?
    Das render_frame soll genau die Funktion darstellen wo logik/grafik/... drinnen laufen. Und dann ergibt sich das Problem nicht -- solange ein Event in der Queue ist ist die Bedingung true, und die Schleife ruft gleich nochmal SDL_PollEvents auf. Erst wenn kein Event mehr in der Queue ist wird was anderes gemacht.


Anmelden zum Antworten