Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SDL C++ kurs (obsługa zdarzeń)

Ostatnio zmodyfikowano 2020-06-21 00:34
Autor Wiadomość
lukasz427
Temat założony przez niniejszego użytkownika
SDL C++ kurs (obsługa zdarzeń)
» 2020-06-20 22:10:34
Witam,

Do czego potrzebna jest druga zagnieżdżona pętla while przy obsłudze zdarzeń w SDL?
To fragment kodu z kursu:

C/C++
while( !wyjscie )
{
    while( SDL_PollEvent( & zdarzenie ) )
    {
        if( zdarzenie.type == SDL_QUIT )
        {
            wyjscie = true;
        }
    }
}

Jeśli pominę tą zagnieżdżoną pętlę program działa również:
C/C++
while( !wyjscie )
{
    SDL_PollEvent( & zdarzenie );
   
    if( zdarzenie.type == SDL_QUIT )
    {
        wyjscie = true;
    }
   
}
w moim programie tworzę okno SDL. Jest ono prawidłowo wyświetlane na ekranie  a następnie jak kliknę X jest zamykane bez względu na czy użyje zagnieżdżonej pętli while czy nie.

Może podam cały kod to krótki plik main.cpp:

C/C++
#include <iostream>

#include <SDL.h>
const int SCREEN_WIDTH = 224;
const int SCREEN_HEIGHT = 288;

size_t GetIndex( SDL_Surface * noptrWindowSurface, int r, int c )
{
    return( r * noptrWindowSurface->w + c );
}

void SetPixel( SDL_Surface * noptrWindowSurface, uint32_t color, int x, int y )
{
    SDL_LockSurface( noptrWindowSurface );
    uint32_t * pixels =( uint32_t * ) noptrWindowSurface->pixels;
    size_t index = GetIndex( noptrWindowSurface, y, x );
    pixels[ index ] = color;
   
    SDL_UnlockSurface( noptrWindowSurface );
}

int main( int argc, char * argv[] )
{
   
    if( SDL_Init( SDL_INIT_VIDEO ) )
    {
        std::cout << "Error: SDL_Init fail" << std::endl;
        return 1;
    }
   
    SDL_Window * optrWindow = SDL_CreateWindow( "Arcade", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, 0 );
    if( optrWindow == nullptr )
    {
        std::cout << "Couldn't create SDL_CreateWindow " << SDL_GetError() << std::endl;
        return 2;
    }
   
    SDL_Surface * noptrWindowSurface = SDL_GetWindowSurface( optrWindow );
    uint32_t color = 0xFF0000;
    SetPixel( noptrWindowSurface, color, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 );
    SDL_UpdateWindowSurface( optrWindow );
    SDL_PixelFormat * pixelFormat = noptrWindowSurface->format;
    std::cout << SDL_GetPixelFormatName( pixelFormat->format );
    SDL_Event sdlEvent;
    bool running = true;
   
    while( running )
    {
        while( SDL_PollEvent( & sdlEvent ) )
        {
            switch( sdlEvent.type )
            {
            case SDL_QUIT:
                running = false;
                break;
            }
        }
       
    }
   
    SDL_DestroyWindow( optrWindow );
    SDL_Quit();
   
    return 0;
}
P-177177
pekfos
» 2020-06-20 23:18:30
Jeśli pominę tą zagnieżdżoną pętlę program działa również
W zewnętrznej pętli nic innego nie robisz, więc to jest dosłownie to samo. Dodatkowa pętla gwarantuje że program będzie się wyrabiać z obsługą zdarzeń, bez niej przetwarzałbyś jedno zdarzenie na 1 klatkę.
P-177178
lukasz427
Temat założony przez niniejszego użytkownika
» 2020-06-21 00:34:05
Dzięki
P-177179
« 1 »
  Strona 1 z 1