Advertisement
opolak

SDL

Oct 16th, 2012
2,280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Przed kompilacjπ dodaj do opcji kompilatora "-mwindows -lmingw32 -lSDLmain -lSDL"
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <SDL/SDL.h>
  7.  
  8. /*
  9. Autor: Konrad SzymaÒski
  10. Date: 26-12-2005
  11. Mail: kosz85@anty_spam@o2.pl
  12. */
  13.  
  14. /* Funkcja ustawiajπca pixel na okreúlony kolor RGB */
  15. void putPixel(SDL_Surface *surface, int x, int y, Uint8 R, Uint8 G, Uint8 B)
  16. {
  17.     /* Zamieniamy poszczegÛlne sk≥adowe koloru na format koloru pixela */
  18.     Uint32 pixel = SDL_MapRGB(surface->format, R, G, B);
  19.     /* Pobieramy informacji ile bajtÛw zajmuje jeden pixel */
  20.     int bpp = surface->format->BytesPerPixel;
  21.     /* Obliczamy adres pixela */
  22.     Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
  23.  
  24.     /* Ustawiamy wartoúÊ pixela, w zaleønoúci od formatu powierzchni*/
  25.     switch(bpp)
  26.     {
  27.         case 1: //8-bit
  28.             *p = pixel;
  29.             break;
  30.    
  31.         case 2: //16-bit
  32.             *(Uint16 *)p = pixel;
  33.             break;
  34.    
  35.         case 3: //24-bit
  36.             if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
  37.                 p[0] = (pixel >> 16) & 0xff;
  38.                 p[1] = (pixel >> 8) & 0xff;
  39.                 p[2] = pixel & 0xff;
  40.             } else {
  41.                 p[0] = pixel & 0xff;
  42.                 p[1] = (pixel >> 8) & 0xff;
  43.                 p[2] = (pixel >> 16) & 0xff;
  44.             }
  45.             break;
  46.    
  47.         case 4: //32-bit
  48.             *(Uint32 *)p = pixel;
  49.             break;
  50.     }
  51. }
  52.  
  53. /* Funkcja renderujπca obraz */
  54. void drawScene(SDL_Surface *surface)
  55. {
  56.     int x,y;
  57.     /* NiektÛre powierzchnie wymagajπ zablokowania, aby coú na nich narysowaÊ i do tego s≥uøy ten kawa≥ek kodu. */
  58.     if ( SDL_MUSTLOCK(surface) )
  59.         if ( SDL_LockSurface(surface) < 0 )
  60.             return;
  61.    
  62.     /* Wype≥niamy ca≥y ekran dwoma kolorami */        
  63.     for(x=0;x<640;x++)
  64.         for(y=0;y<480;y++)
  65.             if(x+y<560)
  66.                 putPixel(surface, x,y,0,0,0);
  67.             else
  68.                 putPixel(surface, x,y,255,255,255);
  69.    
  70.     /* Odblokowujemy po rysowaniu */  
  71.     if ( SDL_MUSTLOCK(surface) )
  72.         SDL_UnlockSurface(surface);
  73.    
  74.     /* Podmieniamy obszar rysowania */    
  75.     SDL_Flip(surface);
  76. }
  77.  
  78. int main(int argc, char *argv[])
  79. {
  80.     /* Wskaünik na obszar rysowania */
  81.     SDL_Surface *ekran;
  82.     /* Obiekt potrzebny do przetwarzania zdarzeÒ */
  83.     SDL_Event event;
  84.     /* Flaga g≥Ûwnej pÍtli programu, odpowiedzialna za jego zakoÒczenie */
  85.     int done=1;
  86.    
  87.     /* Informujemy program, co naleøy zrobiÊ, wrazie nieprzewidywanych dzia≥aÒ aplikacji. */
  88.     atexit(SDL_Quit);
  89.        
  90.     /* Inicjujemy komponenty SDL'a, z ktÛrych bÍdziemy korzystaÊ. */
  91.     if(SDL_Init( SDL_INIT_VIDEO )<0){
  92.         /* Zwracamy b≥πd, nie uda≥o siÍ zainicjowaÊ komponentÛw. */
  93.         fprintf( stderr, "Unable to init SDL: %s\n", SDL_GetError());
  94.         exit(1);
  95.     }
  96.    
  97.     /* Uzyskujemy wskaünik do obszaru graficznego, s≥owem tego co wyúwietli siÍ na ekranie. */
  98.     ekran = SDL_SetVideoMode(640, //szerokoúÊ
  99.                              480, //wysokoúÊ
  100.                              0, //iloúÊ bitÛw koloru 8,16,32, dla 0 sam ustala.
  101.                              SDL_SWSURFACE); // flagi, o ktÛrych szerzej poniøej.
  102.    
  103.     /* Jeúli nasz wskaünik jest rÛwny NULL, to znaczy, øe nie uda≥o siÍ utworzyÊ obszaru graficznego */
  104.     if(ekran == NULL){
  105.         /* Informujemy o b≥Ídach. Warto sprawdzaÊ plik stderr, czÍsto dowiadujemy siÍ czemu wystπpi≥ b≥πd */
  106.         fprintf( stderr, "Unable to set up video: %s\n", SDL_GetError());
  107.         exit(1);
  108.     }
  109.  
  110.     /* G≥Ûwna pÍtla programu, odpowiada za wszystko co dzieje siÍ po zainicjowaniu obszaru rysowania i rÛønych bibliotek. Wykonuje siÍ pÛki flaga done jest rÛøna od zera. */
  111.     while(done)
  112.     {  
  113.         /* PÍtla obs≥ugi zdarzeÒ i komunikatÛw. SDL_PollEvent zwraca nam poprzez parametr bieøπce zdarzenie i wartoúÊ 1 gdy jest coú do obs≥uøenia, lub 0 gdy nie ma. */
  114.         while(SDL_PollEvent(&event))
  115.         {
  116.             /* Sprawdzamy, czy uøytkownik nie wywo≥a≥ opcji zamkniÍcia programu. Jeúli tak zakaÒczamy wykonywanie g≥Ûwnej pÍtli. */  
  117.             if(event.type == SDL_QUIT)
  118.                 done=0;
  119.            
  120.             /* Zdarzenie jest zdarzeniem przyciúniÍcia przycisku klawiatury. */
  121.             if(event.type == SDL_KEYDOWN)
  122.             {
  123.                 /* Jeúli wciúniÍtym klawiszem jest Esc, koÒczymy program. */
  124.                 if(event.key.keysym.sym == SDLK_ESCAPE)
  125.                     done=0;
  126.             }
  127.         }
  128.        
  129.         /* Rysujemy scenÍ */
  130.         drawScene(ekran);
  131.     }
  132.    
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement