[LinuxFocus-icon]
Ev  |  Eri�imd�zeni  |  ��indekiler  |  Arama

Duyumlar | Belgelikler | Ba�lant�lar | LF Nedir
Bu makalenin farkl� dillerde bulundu�u adresler: English  Castellano  Deutsch  Francais  Nederlands  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Leonardo]
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�

[sdl]

�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 :

  • www.libsdl.org: a��k kod olan demo ve oyunlar�n kodlar�n� okumak yeni ��z�mleri ��renmenin en iyi yoludur.
  • www.lnxscene.org yeni bir site, bilgilerinizi art�rabilece�iniz g�zel bir site bazen ben de burada "muaddib" ismiyle oluyorum.

Yaz�y� anlamak i�in �nceden bilinmesi gerekenler :

  • Temel C bilgisi (s�zdizim, d�ng�ler, kitapl�klar)
  • Temel SDL kitapl��� bilgisi (temel fonksiyonlar, ba�lat�mlar) --> www.libsdl.org

_________________ _________________ _________________

 

Kayd�ra� (scroller)

SDL kitapl��� i�in Sam Lantinga'ya �ok �ok te�ekk�rler.

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;
#endif
Bu 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.

 

A demo

Burada kayd�ra��n farkl� anlardaki g�r�n�mleri bulunuyor:
state1 state2

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.

 

Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz

Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz.
 talkback page 

G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Leonardo Giordani, FDL
LinuxFocus.org
�eviri bilgisi:
it --> -- : Leonardo Giordani <leo.giordani(at)libero.it>
it --> en: Leonardo Giordani <leo.giordani(at)libero.it>
en --> tr: Ceyhun Elmas <ceyhun.elmas(at)linuxfocus.org>

2003-04-30, generated by lfparser version 2.35