Listing 1. „Hello World" w trybie graficznym, stworzone z wykorzystaniem biblioteki SDL
#include <stdio.h> finclude <stdlib.h>
#include <string.h>
#inc1ude <SDL.h>
/finclude <S0L_ttf.h>
SDL_Co1or col_white={Oxff, Oxff, Oxff, 0x00}; SDL_Surface *screen=NULL. *msg_surface=NULL; SDL_Rect dst_rect;
SDL_Event event;
TTF_Font *font;
Uint8 video_bpp;
Uint32 video_flags; int done;
int DrawHelloWorld()[
msg_surface=TTF_RenderText_Blended(font,
"Hello World!!!", col_white); dst_rect.w=msg_surface->w; dst_rect.h=msg_surface->h; dst_rect.x=(screen->w/2) - (msg_surface->w)/2; dst_rect.y=(screen->h/2) - (msg_surface->h)/2; SDL_BlitSurface(msg_surface, NULL, screen, &dst_rect);
SDL_UpdateRect(screen, 0,0,0,0);
}
int main(int argc, char *argv[]){ if (SDL_Init(SDL_INIT_VIDE0) < 0){
if (TTF.InitO < 0){
fprintf(stderr, "Nie można zainicjalizować
obsługi czcionek TTF: %s\n",SDL_GetError()); return(2);
}
atexit(TTF_Quit); video_bpp=32;
video_flags=SDL_HWSURFACE; screen=SDL_SetVideoMode(640,480, video_bpp, video_flags); if(screen=NULL) {
printf("Nie można włączyć trybu 640x480x%d", video_bpp); exit(-l);
}
font = TTF_OpenFont("./data/verdana.ttf", 34); TTF_SetFontStyle(font, TTF_STYLE_N0RMAL); DrawHelloWorldO;
done=0;
whiie(done=0){
whiie(SDL_Pol1Event(&event)){ switch(event.type){ case SDL_KEYD0WN:
I done=l; I break;
}
fprintf(stderr, "Błąd inicjałizacji SDL\n"); }
return -1; }
1
return 0;
}
atexit(SDL_Qui t);
S0L_Rect dst_rect: dst_rect.w=msg_surface->w; dst_rect.h=msg_surface->h; dst_rect.x=(screen->w/2) - (msg_surface->w)/2; dst_rect.y=(screen->h/2) - (msg_surface->h)/2;
Pozostaje nam tylko przenieść powierzchnię napisu na ekran reprezentowany przez zmienną screen:
SDL_FillRect(screen, &dst_rect, 0);
SDL_B1itSurface(msg_surface, NULL, screen, &dst_rect); SDL_UpdateRect(screen, 0,0,0,0);
Pierwsza instrukcja czyści miejsce, w którym umieszczamy napis (kolor czarny jest trzecim parametrem). Następnie kopiujemy zawartość całej powierzchni napisu (oznacza to wartość NULL) na ekran pod wskazane miejsce w zmiennej dst_rect.
Pozostaje nam tylko uaktualnić obraz, a wykonujemy to funkcją SDL_UpdateRect. W wywołaniu tej funkcji należy również podać współrzędne fragmentu, który chcemy uaktualnić, ale same zera oznaczają, iż chodzi o cały ekran.
W identyczny sposób będziemy postępować w naszej grze. Większość komunikatów, które pojawiają się na ekranie, są przygotowywane w ramach jednej funkcji.
Klawiatura
Ostatnią czynnością, którą trzeba zaprogramować, to oczekiwanie na wciśnięcie jakiegokolwiek klawisza na klawiaturze. Realizujemy to za pomocą dwóch pętli. Pierwsza działa tak długo, jak zmienna done przyjmuje wartość zero. Druga pętla (wewnętrzna) przetwarza zdarzenia aż do ich wyczerpania - wtedy funkcja SDL_Pol 1 Event zwróci wartość fałszu. Nas najbardziej interesuje zdarzenie o typie SDL_ KEYDOWN, czyli naciśnięcie klawisza. Taka konstrukcja prezentuje się następująco:
done=0;
while(done==0) {
while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_KEYD0WN:
{ done=l;} break;
111
58
grudzień 2003