Merhaba,
Bir süredir SDL ile ilgileniyorum ve sanki buna kendimi kaptırdım. Şunu bir deneyim derken kendimi ilinti ve işlev yazarken buldum. Herhalde programcılık böyle bir şeymiş...:)
Programcılığın eksik olmayan bir konusu da hatalar. İşler karmaşıklaşınca hep aynı hatayı (Parçalama Hatası) alınca kontrollü kod yazma gereği doğuruyor. İşte SDL'de şu an böyle bir durum söz konusu. Başlangıçta TTF_Init() yapmadığım için program göçüyordu. Neyse ki bunu yakalayan TTF_WasInit() isminde başka bir işlev varmış. Ancak yüklenen dosya ismini (aslında aşağıdaki alıntı da comic.ttf) yanlış yazarsanız bunu yakalayamıyorsunuz!
Alıntı (Salih Dinçer):
...dosya hatalarını yakalayamadım. Şöyle denemeler (SDL_RWops ile) de yaptım ama olmadı...:(
class Oyun.this'in içinde =>
> TTF_Init();
> arial_TTF = TTF_OpenFont("arial.ttf", 40);
> comic_TTF = TTF_OpenFont("comics.ttf", 40);/*
> SDL_RWops *rw = SDL_RWFromFile("comics.ttf", "rb");
> printf("Buraya gelemedim...:(");
> comic_TTF = TTF_OpenFontIndexRW(rw, 1, 40, 0);
> assert(rw != null);//*/
> courier_TTF = TTF_OpenFont("courier.ttf", 40);
> ```
> Bu arada ekranaYaz() işlevini Oyun sınıfına dahil ettim ve son hali şöyle:
>
> **class Oyun içinde =>**
>
> public bool ekranaYaz (TTF_Font* xFont, Renk xRenk,
int x, int y, const char* metin) {
auto rengi = SDL_Color(xRenk.k, xRenk.y, xRenk.m);
EkranYüzeyi textSurface = TTF_RenderUTF8_Solid(xFont, metin, rengi);
SDL_Rect pixelCoordinate;
pixelCoordinate.x = cast(short)x;
pixelCoordinate.y = cast(short)y;
if(!TTF_WasInit())
{
printf("YAZI HATASI: TTF sunucusu ilklendirilemedi!\n");
return false;
}
else if(xFont == null)/*
else if(TTF_FontHeight(xFont) <= 0)//*/
{
printf("YAZI HATASI: TTF dosyası yüklenemedi! %d\n");
return false;
}
else if (textSurface != null)
{
pixelCoordinate.x -= cast(short)textSurface.w/2;
pixelCoordinate.y -= cast(short)textSurface.h/2;
/* DİKKAT:
* Parçalama hatası vermemesi için koordinatın
* ekrana ortalanması burada hesaplanmalı...
*/
SDL_BlitSurface(textSurface, null, ekran, & pixelCoordinate);
SDL_FreeSurface(textSurface);
return true;
}
else // Hiç biri de değilse ekran'a bir şey yazma...
{
printf("YAZI HATASI: Görülebilir (render) hale getirilemedi!\n");
return false;
}
}
>
Elbette programcılıkta çareler tükenmez. Belki en sağlamı, std.stdio sınıfındaki işlevler ile dosyanın orada var olup olmadığını kontrol edebilirim. Ancak font dosyası orada fakat bozuksa!
Dolayısıyla bir şekilde ekrana yazı yazarken, tıpkı nesnenin boş (null) olup olmadığını kontrol edebilmem gibi xFont nesnesinin de işime yarayıp yaramadığını bilmeliyim. Bunun için dosyanın ilk açıldığı ana (-bknz. SDL_rwops.c dosyası, 438. satır (http://hg.libsdl.org/SDL/file/58f0fb54bf88/src/file/SDL_rwops.c#l438)), kadar izledim. Sorun olduğu durumlarda NULL değerleri dönüyor ama ben bunları yakalayamıyorum. Hadi bunun başka bir sebebi var ama SDL_SetError() işlevi ile atılan hatayı SDL_GetError() ile de okuyamıyorum. Çünkü o satıra gelmeden evvel parçalama hatası vermiş oluyor...:)
Bu konuda yardım edebilecek var mı?
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]