|
|
Bu makalenin farkl� dillerde bulundu�u adresler: English Castellano Deutsch Francais Nederlands Turkce |
taraf�ndan Leonardo Giordani <leo.giordani(at)libero.it> Yazar hakk�nda: Milan Politecnico Telekominikasyon M�hendislik Fak�ltesinden diplomam� yeni ald�m. Programlama ile ilgileniyorum. (�o�unlukla Assembly ve C/C++). 1999'dan beri neredeyse yaln�zca Linux/Unix ile �al���yorum. T�rk�e'ye �eviri: Ceyhun Elmas <ceyhun.elmas(at)linuxfocus.org> ��erik: |
SDL grafiklerinde kayd�ra� uyarlamas��zet: Bu yaz� serisi, okuyucular� "demos" olarak da bilinen �okluortam d�nyas� ile tan��t�rmak istiyor. Bu konuyla ilgili �nternette s�n�rs�z bilgi bulunuyor ama �ok az� Linux i�in g�zel �eyler yaz�yor.Benim odakland���m konu baz� grafik ve ses efekt teorilerini a��klamak ve bunlar� SDL kitapl���yla uyarlamak. SDL ile ilgili geni� bilgileri bu adreste bulabilirsiniz :
Yaz�y� anlamak i�in �nceden bilinmesi gerekenler :
|
Kayd�ra� demo'nun bir par�as�d�r. Bununla ekran �zerinde kayan c�mleler haz�rlayabilirsiniz: bu temel efekti �oklu ortam �r�nlerinde kolayca bulabilirsiniz. Bir par�a haraketli yaz�y� kullan�ya g�stermek isteyebilirsiniz. Bu yaz�da sa�dan sola hareket eden basit bir kayd�ra�� nas�l yapaca��m�z� g�rece�iz.
Temel fikir kayd�ra��n ekran�n bir par�as�n� bir pixel sol tarafa(ya da herhangi bir y�ne) kopyalamas�d�r.Bu i�lemin iyi bir h�zla s�rekli yap�lmas� ile istenilen sonu� elde edilir , hepsi bu.
Temel teori karma��k de�il; haydi �imdi bunu nas�l koda d�kece�imize bakal�m : y�zey konusuyla i�e ba�layaca��z. Biraz temel SDL programlama yapm�� olanlar�n�z hemen hat�rlayacakt�r bunu. SDL ile �al���rken kullan�d���m�z g��l�
SDL_BlitSurface() fonksiyonu herzaman hat�rlan�r.Bir par�a SDL_Surface kopyalayal�m. Bu SDL_Rect ile ba�ka bir SDL_Surface �zerine ba�ka bir SDL_Rect taraf�ndan tan�mlan�r.�rne�in, iki y�zey ve iki d�rtgen tan�mlad���m�z� d���nelim
#define WIDTH 800 #define HEIGHT 600 SDL_Surface *Src; SDL_Surface *Dst; Src = SDL_CreateRGBSurface(SDL_HWSURFACE, WIDTH, HEIGHT, 8, r_mask, g_mask, b_mask, a_mask); Dst = SDL_CreateRGBSurface(SDL_HWSURFACE, WIDTH, HEIGHT, 8, r_mask, g_mask, b_mask, a_mask); SDL_Rect BigArea = {0, 0, (WIDTH / 2), HEIGHT}; SDL_Rect SmallArea = {(WIDTH / 2) + 1, 0, (WIDTH / 2), (HEIGHT / 2)};renk maskesini varsayd���m�z yer zaten ba�lat�l�yor. �ki tam y�zeyi minimal bir �abayla kopyalatal�m.
SDL_BlitSurface(Src, 0, Dst, 0);Hedef y�zeyde d�rtgenin yaln�zca ba�lang�� koordinatlar�n� dikkate al�yoruz boyutu de�il. Bu �u anlama geliyor:
SDL_BlitSurface(Src, &BigArea, Dst, &SmallArea);Src 'nin sol y�zey yar�s� Dst 'nin sol y�zey yar�s� �zerine kopyalan�yor.
�imdi y�zey kald�ra�� daha fazla gizlememiz gerekmiyor: y�zeyin bir par�as�n� ayn� y�zey �zerindeki d�rtgen �zerine kopyalamak yeterli. T�m kod olmal� ama d�ng� i�inde, bu nedenle program biraz karma��kla��yor ama temel mant�k olduk�a basit. D�ng�n�n her ad�m�nda iki d�rtgen kullan�yoruz, ikinci bas�lan birincinin yolunu izliyor ve y�zeyi kendi �zerine birinci d�rtgenden ikinciye kopyal�yoruz.
SDL_Surface *temp; SDL_Rect From = {1, 0, WIDTH, HEIGHT}; SDL_Rect First = {0, 0, 1, HEIGHT}; SDL_Rect Last = {WIDTH-1, 0, 1, HEIGHT}; temp = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, HEIGHT, 8, r_mask, g_mask, b_mask, a_mask); while(1){ SDL_BlitSurface(Src, &First, temp, 0); SDL_BlitSurface(Src, &From, Src, 0); SDL_BlitSurface(temp, &First, Src, &Last); SDL_BlitSurface(Src, 0, Screen, 0); }G�rd���n�z gibi y�zeyi sola do�ru kayd�rmakk yeterli de�il: sa� taraftan ekrandan ��kan g�r�nt� birimlerini yeniden i�eri katmal�y�z.Ya da kayan y�zey arkas�nda son kolonunun kopyas�n� b�rakacak ve bir s�r�kleme etkisi olu�turacak. Zaten bir y�zeyin ekrana linklendi�ini varsay�yoruz. �imdi t�m program� g�rece�iz. Program 480x200 pencere a��yor ve resimi s�rekli kayd�r�yor.
#include "SDL/SDL.h" #include "SDL/SDL_image.h" #define SCREEN_WIDTH 480 #define SCREEN_HEIGHT 200 #if SDL_BYTEORDER == SDL_BIG_ENDIAN static const Uint32 r_mask = 0xFF000000; static const Uint32 g_mask = 0x00FF0000; static const Uint32 b_mask = 0x0000FF00; static const Uint32 a_mask = 0x000000FF; #else static const Uint32 r_mask = 0x000000FF; static const Uint32 g_mask = 0x0000FF00; static const Uint32 b_mask = 0x00FF0000; static const Uint32 a_mask = 0xFF000000; #endifBu yap�land�rmalar neredeyse t�m �okluortam �al��malar�nda benimsenmi� de�erlerdir.
static SDL_Surface* img_surface; static SDL_Surface* scroll_surface; static SDL_Surface* temp_surface;Burada kullanaca��m�z �� y�zey bulunuyor: img_surface dosyadan y�klenecek resmi i�erir, scroll_surface yer de�i�tirmi� resim ve temp_surface yeniden sa� tarafa basmak zorunda oldu�umuz g�r�nt� birimleri.
static const SDL_VideoInfo* info = 0; SDL_Surface* screen;A SDL_VideoInfo yap�s� video donan�m� hakk�nda bilgiler i�erir, screen y�zeyi ger�ek ekrana noktalan�rken.
int init_video() { if( SDL_Init( SDL_INIT_VIDEO) < 0 ) { fprintf( stderr, "Video initialization failed: %s\n", SDL_GetError( ) ); return 0; } info = SDL_GetVideoInfo( ); if( !info ) { fprintf( stderr, "Video query failed: %s\n", SDL_GetError( ) ); return 0; } return 1; } int set_video( Uint16 width, Uint16 height, int bpp, int flags) { if (init_video()) { if((screen = SDL_SetVideoMode(width,height,bpp,flags))==0) { fprintf( stderr, "Video mode set failed: %s\n", SDL_GetError( ) ); return 0; } } return 1; }The init_video() fonksiyonu SDL Video sistemini ba�lat�r ve info yap�s�n� bilgilendirir. set_video() fonksiyonu video modunu yap�land�r�r.(boyut ve renk derinli�i)
void quit( int code ) { SDL_FreeSurface(scroll_surface); SDL_FreeSurface(img_surface); SDL_Quit( ); exit( code ); }Bu olmas� gerekli ��k�� fonksiyonudur, kullan�lan t�m kaynaklar� serbest b�rak�r ve SDL_Quit olarak adland�r�l�r .
void handle_key_down( SDL_keysym* keysym ) { switch( keysym->sym ) { case SDLK_ESCAPE: quit( 0 ); break; default: break; } }A "key pressed" event: burada ESC tu�u anlam�nda.
void process_events( void ) { SDL_Event event; while( SDL_PollEvent( &event ) ) { switch( event.type ) { case SDL_KEYDOWN: handle_key_down( &event.key.keysym ); break; case SDL_QUIT: quit( 0 ); break; } } }Yine gerekli olan olay y�netim fonksiyonu.
void init() { SDL_Surface* tmp; Uint16 i; tmp = SDL_CreateRGBSurface(SDL_HWSURFACE, SCREEN_WIDTH, SCREEN_HEIGHT, 8, r_mask, g_mask, b_mask, a_mask); scroll_surface = SDL_DisplayFormat(tmp); SDL_FreeSurface(tmp);�imdi tmp ile �al���p y�zeyi scroll_surface 'e ba�latal�m ve temp_surface . Her ikisi de SDL_DisplayFormat fonksiyonu sayesinde video kareyazma� bi�imine d�n��t�r�l�r.
img_surface = IMG_Load("img.pcx");Burada img_surface'e dosyadaki kay�tl� resimi y�kl�yoruz.
for (i = 0; i < SDL_NUMEVENTS; ++i) { if (i != SDL_KEYDOWN && i != SDL_QUIT) { SDL_EventState(i, SDL_IGNORE); } } SDL_ShowCursor(SDL_DISABLE); }T�m olaylar programdan ��k�� i�in tu�a basman�n d���nda g�rmezlikten geliniyor ; dahas� kursoru tan�ms�z hale getiriyoruz.
int main( int argc, char* argv[] ) { SDL_Rect ScrollFrom = {1, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; SDL_Rect First = {0, 0, 1, SCREEN_HEIGHT}; SDL_Rect Last = {SCREEN_WIDTH - 1, 0, 1, SCREEN_HEIGHT};Burada yaz�da a��klanan �� d�rtgen bulunuyor.
if (!set_video(SCREEN_WIDTH, SCREEN_HEIGHT, 8, SDL_HWSURFACE | SDL_HWACCEL | SDL_HWPALETTE /*| SDL_FULLSCREEN*/)) quit(1); SDL_WM_SetCaption("Demo", ""); init(); SDL_BlitSurface(img_surface, 0, scroll_surface, 0);Bu kod her�eyi ba�lat�yor: video modunun kurulmas�, pencerlerin yaz�lmas�, �a�r�lar init() Bu kod her�eyi ba�lat�yor: video modunun kurulmas�, pencerlerin yaz�lmas�, �a�r�lar ... Ve scroll_surface haz�rl�yor.
while( 1 ) { process_events(); SDL_BlitSurface(scroll_surface, &First, temp_surface, 0); SDL_BlitSurface(scroll_surface, &ScrollFrom, scroll_surface, 0); SDL_BlitSurface(temp_surface, &First, scroll_surface, &Last); SDL_BlitSurface(scroll_surface, 0, screen, 0); SDL_Flip(screen); } return 0; }Bu da yaz�da a��klanan d�ng�: yaln�zca olay denetim fonksiyonu ve y�zey eklendi.
G�r�ld��� gibi kitapl�k a��s�ndan �al��man�n ba�lat�lmas� k�sa de�il, ama avantaj� t�m demoyu i�ermesi, kod artarken bile ba�latma t�m program�n k���k ve kullan��l� bir par�as� olacak.
ps: Yorumlar�n�z�, �nerilerinizi za da sorular�n�z� �ngilizce, Almanca ya da �talyanca olarak ileti adresimden ya da Talkback sayfas�ndan bana g�nderebilirsiniz.
|
G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Leonardo Giordani, FDL LinuxFocus.org |
�eviri bilgisi:
|
2003-04-30, generated by lfparser version 2.35