SDL C++ kurs (obsługa zdarzeń)
Ostatnio zmodyfikowano 2020-06-21 00:34
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: 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ż: 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: #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; } |
|
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ę. |
|
lukasz427 Temat założony przez niniejszego użytkownika |
» 2020-06-21 00:34:05 Dzięki |
|
« 1 » |