Bu sayfadaki yazılar
Sayfanın metni
Sayfa 27
SDL SWSURFACE bayrağı ile screen yüzeyine ait verilerin sistem belleğinde tutulması sağlanır. Burada kullanmak için birçok farklı bayrak bulunmaktadır. SDL SetVideoMode komutu ile kullanabileceğimiz bayrakların listesi:
SDL SWSURFACE -> yüzeye ait bilgilerin sistem belleğinde tutulmasını sağlar.
SDL HWSURFACE -> yüzeye ait bilgilerin ekran kartının belleğinde tutulmasını sağlar.
SDL ASYNCBLIT -> asenkron yüzey göstermeyi aktif hale getirir. Bu genellikle tek işlemcili makinalarda bit işlemeyi (blit - bit block transfer - bit bloğu değişimi) yavaşlatır ama SMP sistemlerde hız artışı sağlayabilir.
SDL ANYFORMAT -> Normalde eğer video yüzeyi kullanılamayacak bir ekran derinliği (bpp) isterse SDL gölge bir yüzey ile bunu emule eder. SDL ANYFORMAT bayrağı ile SDL'in bunu yapması engellenir ve SDL'in yüzeyin derinliğini umursamadan onu kullanması sağlanır.
SDL HWPALETTE -> SDL'e ayrıcalıklı palet erişimi verir. Bu bayrak olmadan SDL SetColors komutu ile istediğiniz renge her zaman ulaşamayabilirsiniz.
SDL_DOUBLEBUF -> Çifte tamponlamayı etkin hale getirir. Sadece SDL_HWSURFACE bayrağı ile beraber kullanılabilir. SDL_Flip komutu tamponların içeriğini değiştirir ve ekranı tazeler. Eğer çifte tamponlama etkinleştirilmemişse SDL_Flip bütün ekran üzerine SDL_UpdateRect komutu uygulanmış gibi davranır.
SDL_FULLSCREEN -> SDL tam ekran çalıştırmaya çalışıyor.
SDL_OPENGL -> OpenGL render ekranı yaratır. SDL_GL_SetAttribute komutu ile OpenGL ayarlamalarına başlamadan önce bu bayrağın etkinleştirilmesi gerekir.
SDL_OPENGLBLIT -> Üstteki gibidir ama aynı zamanda blitting (*yardım*) işlemlerine izin verir.
SDL_RESIZABLE -> Boyutlandırılabilir bir pencere yaratır. Pencere boyutları değiştirildiği zaman SDL_VIDEORESIZE olayı tetiklenir ve SDL_SetVideoMode yeni boyut ile tekrar çağırılabilir.
SDL_NOFRAME -> Mümkün ise çerçevesiz bir pencere yaratır. Tam ekran modu otomatik olarak bu bayrağı etkinleştirir.
Eğer istediğiniz ekran modunun uygun olup olmadığını öğrenmek istiyorsanız SDL_VideoModeOK fonksiyonunu kullanabilirsiniz. Yazılışı:
if (!SDL VideoModeoK ( 640, 480, 16, SDL HWSURFACE)) £ printf ("Ekran modu uygun degil.4n"); )
else
(
printf ("Ekran modu uygun.4n");
şeklindedir. Bunun dışında SDL_GetVideoInfo, SDL_GetVideoSurface, SDL_GetVideoDriverName ve SDL_ListModes gibi fonksiyonlar da bulunmakta ama şimdilik işin başında olduğunuz için işin başındaki sizlerin ihtiyaç duymadığı fonksiyonlar. Bunlara ileride detaylı değineceğiz ama şimdi sadece başka fonksiyonların da olduğunu bilin yeter.
Şu ana kadar öğrendiklerimizle bir SDL programını başlatıp SDL penceresini açabiliyoruz. Ama karşımızdaki simsiyah pencere oldukça sıkıcı değil mi? Hadi ortamı biraz renklendirelim. İlk olarak oldukça basit olduğu için bir BMP dosyasını okuyup ekrana yazdırmayı göstereceğim.
Bunun için ilk olarak okuyacağımız BMP dosyasının içeriğini saklayacağımız bir yüzey oluşturmalıyız. Yüzeyler SDL'de resim bilgisi saklanılacağı her yerde kullanılır.
SDL Surface *image;
SDL'in kendi içerisinde BMP uzantılı dosyaları okuyup hafızaya alan hazır bir fonksiyonu bulunmakta. Adı SDL_LoadBMP. Kullanışı:
image-SDL LoadBMP ("c:Va.bmp");
şeklindedir. Bu sayede image adlı yüzeye a.bmp dosyasını yüklemiş bulunmaktayız. Şimdi sıra bu resmi ekrana çizdirmekte. Bunun içinse SDL_BlitSurface fonksiyonunu kullanacağız.
SDL BlitSurface(image, NULL, screen, NULL);
Bu komut ile image yüzeyindeki resmi screen yüzeyine yani ekrandaki görüntünün saklanacağı yüzeye çizdiririz. NULL değer verilen parametrelerde çizdirilecek yüzeylerin boyutları ve koordinatları belirlenir. Eğer iki parametreye de NULL girersek image yüzeyinin tamamı screen yüzeyinin 0,0 noktasından başlayarak çizdirilir. Eğer resmin belirli bir kısmını çizdirmek istersek veya ekranda 0,0 noktasından başka bir noktaya koymak istersek ne yapacağız? SDL_Rect kullanarak.
SDL_Rect SDL içerisinde kare alan tanımlamak için kullanılan yapıdır. İçeriğinde sadece enine ve boyuna uzunluğu ile x,y düzlemlerindeki koordinatlarını saklayan değişkenler bulunur.
typedef
Sintl6 x, yı Uint16 w, h; ) SDL Rect;
x ve y koordinatları üst sol köşenin koordinatlarıdır. w ve h ise genişlik ve uzunluğudur. Oldukça basit ama niye böyle bir yapıya ihtiyacımız var diye düşünebilirsiniz. Bu yapıya ihtiyacımız var çünkü yüzeylerdeki resim alanları aslen dikdörtgen ve bunları kırpmak ya da belirli koordinatlara yerleştirmek isterseniz bu dikdörtgen yapısı oldukça kullanışlı oluyor. Yapmamız gereken şu:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 26
5. SDL JOYSTICK - joystick - 6. SDL EVERYTHING - Bütün sistemleri aktif hale getirir 7. SDL INIT NOPARACHUTE - SDL'in hata sinyallerini yakalamasını önler - 8. SDL EVENTTHREAD - çok görevlilik -
Alt sistemleri çalıştırmayı öğrendik ama ya çalışan sistemleri kapatmayı? Şimdi de çalıştırdığımız SDL programını ve alt sistemleri nasıl kapatacağımızı öğreneceğiz.
İlk komutumuz SDL Quit. Bu komut SDL Init komutunun yaptığı işin tam tersini yapar ve başlattığınız SDL programını kapatır. Bu programı kullanırken herhangi bir argüman girmenize gerek yoktur. Kullanışı:
SDL
şeklindedir. Bu komut ile halihazırda çalışan bütün SDL alt sistemleri ve SDL programı kapanır. Diğer komutumuz ise SDL QuitSubSystem. Bu komut ile çalışmakta olan istediğimiz alt sistemi kapatabiliriz. Kullanımı:
( SDL INIT TIMER );
şeklindedir. Örneğimizde zamanlayıcı alt sistemini kapattık ama SDL programımız çalışmaya devam etti.
Ayrıca SDL WasInit fonksiyonu ile istediğiniz alt sistemin yüklü olup olmadığını kontrol edebilirsiniz. Bu fonksiyonunun yazılışı şöyledir:
if(SDL WasInit(SDL INIT VIDEO)!-0) printf ("Video alt sistemi else printf ("Video alt sistemi yuklu
Şimdi öğrendiklerimizle örnek bir SDL programı yazalım.
/* SDL header dosyas#. Butun SDL programlari buna ihtiyac duyar */ #include "SDL.h" #include <stdio.h>
int main() ( printf ("SDL programi ba#lat#l#yor.n");
/* SDL programi baslatilip Video ve Ses sistemleri aktif hale getiriliyor */ İZ£((SDL Initi SDL INIT VIDEO |SDL INIT AUDIO)---1) ) 1 İptinti | stderr, "SDL programi baslatilamadi: SDL GetError() Vi exit(-l1); )
$s.Vna",
fprintf (stdout,"SDL programi baslatilamadi
fprintf (stdout,"SDL programi kapatiliyor.ln");
/* SDL programi ve butun alt sistemleri kapatiliyor */ SDL Eprint?f (Stdout,
exit (0);
SDL ve Grafik
Sırada grafik komutlarını kullanmayı öğrenmek var. İlk olarak yapmamız gereken şey video alt sistemini aktif hale getirmek. Ardından bir yüzey (surface) tanımlamalı ve SDL SetVideoMode komutu ile bu yüzeyi kullanarak istediğimiz çözünürlükte bir pencere yaratmamız gerekir.
İlk olarak yüzey terimini açıklamak istiyorum. SDL'de ekrana çizdirmek istediğiniz bilgiler bir yüzeyde saklanır. Bu yüzeyler aslında önceden tanımlanmış yapılardır (struct). Bir yüzeyi şöyle tanımlayabiliriz:
SDL Surface *screen; İçeriği ise şöyledir:
typedef struct SDL Surface (| Uint32 flags; /* Salt okunur */ SDL PixelFormat *format;/* Salt okunur */ int w, h; /* Salt okunur */ Ülnt16 pitch; /* Salt okunur */ void *pixels; /* oku-yaz */
/* kirpma bilgisi */ SDL Rect clip rect; /* Salt okunur */ /* Referans sayac# yuzey bosaltilirken kullanilir */ int refcount; /* cogunlukla okunur */
/* Bu yap# ayn# zamanda burda gösterilmeyen baz# özel alanlara sahiptir */ SDL Surface;
Gördüğünüz gibi SDL Surface yapısı ile uğraşırken sadece pixels değişkenini kullanabilirsiniz. Bu değişken yüzeyin her pixel'inin renk bilgisini taşır ve isterseniz her pixel'i teker teker değiştirebilirsiniz. Bu konuya ileride daha detaylı olarak bakacağız ama şimdi devam edelim.
Programın başında ekrana yansıtacağımız görüntüler için bir yüzey tanımlarız ve bu yüzey ile bir pencere açarız. Bunu SDL SetVideoMode komutu ile yaparız. Kullanımı aşağıdaki gibidir.
screen 640,
SDL SetVideoMode ( 480, 8, SDL SWSURFACE);
Bu komut ile screen yüzeyini ekrana yansıtacağımız ana yüzey olarak tanımlar ve 640'a 480 pixel çözünürlükte bir pencere ya-
ratırız. Ekrandaki bit başına düşen pixel sayısı 8 olur. Ve