Forum: SDL RSS
SDL dersi için en basiti nasıl?
Sayfa:  önceki  1  2 
Avatar
Salih Dinçer #16
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 7222
erdem:
Sonunda biraz uğraşarak da olsa bir test dosyası oluşturarak çalıştırabildim  :-)
Eline sağlık...

Meğer TTF_Init() yapmayı ihmal etmişim. Bir de koordinatı hiç düşünmemiştim. Renk olayını da ekleyince şu iki satırla artık ekranın istediğim yerine yazı yazabiliyorum, teşekkürler...:)
      TTF_SetFontStyle(courier_TTF, TTF_STYLE_BOLD);
      ekranaYaz(courier_TTF, Renk.beyaz, ekrangenişlik/2, ekranyükseklik/2,
                                                       "Merhaba (D)ünya!");
[Resim: http://img100.imageshack.us/img100/2427/planei.png]

erdem:
TTF kütüphanesini denemek için make font demek yeterli. Oluşturduğum dosya da demos dizininde yazitipi.d dosyası. Eğer hala denemediysen make pong diyerek başka bir programı da deneyebilirsin.
O toplu uygulamayı denemez olur muyum! Hatta en çok hoşuma gideni oldu. Bir de temasEtti_mi() olayını yapabilirsek harika olacağını düşünüyorum. Ama sanki önce hata sınıfını ilintilemeliyiz. Çünkü az önce uğraşırken dosya hatalarını yakalayamadım. Şöyle denemeler (SDL_RWops ile) de yaptım ama olmadı...:(
        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);
erdem:
Bu arada sana hak verdim. Gerçekten kod şu an benim için bile karman çorman olmuş :-D

Eğer uğraşmak istiyorsan oldukça elden geçirmen gerekecek :)
Estağfirullah, kodlar gayet yerinde. Ama sanki biraz sınıfları azaltsak sanki daha iyi olacak. Aslında ben bunu yaptım ve üçe (Oyun, Oyuncu ve Çizici) indirdim. Sanki TemelOyun sınıfı biraz kafa karıştırıyor. Yani o  sınıfı uygulama içinde başka anda çağırmayı düşünüyor musun? Belki de Oyun sınıfıyla birleşmesinde bir sakınca yoktur. Böylece super()'ler ile uğraşmayız ve kod biraz kısalır...

Bu arada ekranaYaz() işlevini Oyun sınıfına dahil ettim ve son hali şöyle:
(Belki ismi sadece Yaz() da olabilirdi...)
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;
        }
    }
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #17
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Renk olayını da ekleyince şu iki satırla artık ekranın istediğim yerine yazı yazabiliyorum, teşekkürler...:)

Gayet güzel!  :-p Tebrikler..

Ama sanki biraz sınıfları azaltsak sanki daha iyi olacak. Aslında ben bunu yaptım ve üçe (Oyun, Oyuncu ve Çizici) indirdim. Sanki TemelOyun sınıfı biraz kafa karıştırıyor. Yani o  sınıfı uygulama içinde başka anda çağırmayı düşünüyor musun? Belki de Oyun sınıfıyla birleşmesinde bir sakınca yoktur. Böylece super()'ler ile uğraşmayız ve kod biraz kısalır...

Aynen tamamen katılıyorum. Hatta belki Oyun ve TemelOyun sınıflarını tamamen kaldırıp programcı için daha da esneklik sağlanabilir.

Bir de dikkat edersen burada mantık hep aynı. Yani oyun nesneleri ilkönce yükleniyor. Bu yüzden icerik.d'ye yazıtipi yükle şeklinde bir işlev eklenebilir. Daha sonra kaynaklar ilklendiriliyor, oyun içinde kullanılıyor ve daha sonra geri veriliyor.

Bu durumda benim yaptığımı örnekte biraz hızlı yazdığım için öyle değildi. Ama TTF yazıtipi de aslında çizilebilen bir oyun nesnesi. Bu yüzden aslında oyun nesneleri için kullandığımız oyuncu.d'de ilklendirilmesi daha mantıklı. Çünkü dikkat edersen her oyun nesnesinin bir SDL_Surface * (ben buna 2D grafik) diyorum. Sonra o grafiğin tamamının mı yoksa bir parçasının mı kullanılacağını gösteren SDL_Rect türünde bir alan belirten özelliği var.

İster TTF yazıtipi olsun isterse bir resim dosyası olsun ilkönce ekran kartının belleğinde o yüzeyler kesiliyor. Ne kadarlık bir alanı keseceğimiz ise SDL_Rect belirliyor. Daha sonra bellekte  bunlar birbiri üzerine kesilip yapıştırıldıktan sonra ekrana basılıyor. Bu yüzden yazıtipinin de bir oyun nesnesi olması daha mantıklı.
Avatar
Salih Dinçer #18
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Merhaba Erdem,

Az önce basit olsun diye tek sınıflı bir uygulama yazdım. Tabi bunun çalışması için herhangi bir PNG ve TTF dosyasına ihtiyacınız olsa da internette bulduğum şu dosyalarla daha hoş görünüyor:
/*
 uçaklar.d (05.08.2012)
*/
import sdl, core.stdc.stdio: printf;
 
class Sahne {
  int genişliği, yüksekliği, çözünürlüğü;
  Renk zeminRengi;
  SDL_Surface* ekranı;
  TTF_Font* arial_TTF;
  uint sahneBaşlangıç;
 
  this (int genişlik, int yükseklik, Renk zemin, int çözünürlük = 0) {
    this.genişliği = genişlik;
    this.yüksekliği = yükseklik;
    this.çözünürlüğü = çözünürlük;
    this.zeminRengi = zemin;    
    
    SDL_Init(SDL_INIT_EVERYTHING);
    TTF_Init();
        
    ekranı = SDL_SetVideoMode(genişliği, yüksekliği, çözünürlüğü, SDL_HWSURFACE);
    temizle(zemin);
  }
  
  @property void temizle (Renk zemin) {
    SDL_FillRect(ekranı, &ekranı.clip_rect,
              SDL_MapRGB (ekranı.format, zemin.k, zemin.y, zemin.m));
    güncelle()// Bu satır olmadığında değişiklikler sahneye yansımıyor!
  }
  
  @property void güncelle () {
    SDL_Flip(ekranı);
  }
 
  @property bool resimYükle (string dosya, bool şeffaflık = true) {
    bool sonuç = true;
    SDL_Surface * geçiciNesne;
    
    geçiciNesne = IMG_Load(dosya.ptr);
    if(geçiciNesne == null) {
      printf("DOSYA HATASI: Resim dosyası yüklenemedi!\n");
      sonuç = false;
    }
    nesneYükle(geçiciNesne);        
    return sonuç;
  }
  
  @property bool yazıtipiYükle (string dosya, int büyüklük = 16) {
    bool sonuç = true;
    TTF_Font * geçiciNesne;
    
    geçiciNesne = TTF_OpenFont (dosya.ptr, büyüklük);
    if(geçiciNesne == null) {
      printf("DOSYA HATASI: TTF dosyası yüklenemedi!\n");
      sonuç = false;
    }
    arial_TTF = geçiciNesne;
    return sonuç;
  }
  
  @property void nesneYükle(SDL_Surface* nesne) {
      SDL_BlitSurface(nesne, null, ekranı, null);
      SDL_FreeSurface(nesne);
  }
  
  ~this() {
    SDL_FreeSurface(ekranı);
    TTF_CloseFont(arial_TTF);
    arial_TTF = null;
    TTF_Quit();
    SDL_Quit();
  }
}
 
void main() {
  with (new Sahne(250, 250, Renk.turkuaz)) {
    resimYükle("Plane.png");
   
    if(yazıtipiYükle("PLANES__.TTF", 100))
      nesneYükle(TTF_RenderText_Solid(arial_TTF, "A",
                       SDL_Color(255, 255, 255, 0)));
    güncelle();
    SDL_Delay(3000);
 
    temizle(Renk.beyaz);
    SDL_Delay(300);
  }
}/*
  * SDL ilintisi için: https://github.com/erdemoncel/oyun/blob/master/src/sdl.d
  * SDL yüklemek için: sudo apt-get install libsdl1.2-dev libsdl-image1.2-dev
  * Derlemek için: dmd uçaklar.d sdl -L-lSDL -L-lSDL_image -L-lSDL_ttf -release
  */
Derleme talimatları hemen yukarıda ve her şey olumlu giderse ilk aşamada şu ekranı görmeniz gerekiyor:
[Resim: http://img337.imageshack.us/img337/9783/planesa.png]

Henüz çok eksiği var ve bence en başta Nesne isminde bir sınıfa ihtiyaç var. Çünkü yüklenen nesnelerin koordinatları, rengi gibi şeyler olmalı. Sanırım 100 satırı geçmeyen bu uygulama zamanla daha da karışacak...:)

Dip Not: Çok karışmasın diye ekranaYaz() işlevine ve bir çok şeye (örn. nokta, çizgi ve şekil çizme işlevleri) yer verilmemiştir.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj 2 defa değişti; son değiştiren: Salih Dinçer; zaman: 2012-08-05, 14:19.
Avatar
Salih Dinçer #19
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #17
erdem:
İster TTF yazıtipi olsun isterse bir resim dosyası olsun ilkönce ekran kartının belleğinde o yüzeyler kesiliyor. Ne kadarlık bir alanı keseceğimiz ise SDL_Rect belirliyor. Daha sonra bellekte  bunlar birbiri üzerine kesilip yapıştırıldıktan sonra ekrana basılıyor. Bu yüzden yazıtipinin de bir oyun nesnesi olması daha mantıklı.
Erdem, bu SDL_Rect bir tür maske gibi işleve sahip değil mi? Hani Dörtgen olarak takma isimi olan yapı. Gerçi bu yapının içinde yükseklik ve genişliği de var. Tam da Nesne sınıfı olacak bir yapı sanki, ne dersin?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #20
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben çok beğendim. Bence bunu Makefile dosyasına ekleyip demos bölümüne eklemelisin :)

Salih Dinçer:
Erdem, bu SDL_Rect bir tür maske gibi işleve sahip değil mi? Hani Dörtgen olarak takma isimi olan yapı. Gerçi bu yapının içinde yükseklik ve genişliği de var. Tam da Nesne sınıfı olacak bir yapı sanki, ne dersin?

SDL_Rect basit bir C yapısı.

http://sdl.beuc.net/sdl.wiki/SDL_Rect

Basitçe bir dikdörtgenin koordinatlarını tutuyor. Bunu da iki tane ekran yüzeyi ekran kartının belleği üzerinde birbiri üzerine yapıştırılırken blit kullanılıyor. Benim düşüncem her oyun nesnesi bir SDL_Surface ve SDL_Rect'e sahip olmalı.

Kullanımını da şöyle düşünebilirsin.  Örneğin hareketli bir Pacman yapmak istiyoruz. Ama dikkat edersen Pacman'ın hareketini gösteren resim dosyaları aslında tek bir resim dosyasında oluyor. Sonra bu dörtgen yapıyı kullanarak bu resim dosyasının hangi kısmını göstereceğimizi belirtiyoruz. Ve arada bir süre bekleyerek hareketli bir animasyon oluşturuyoruz.

Bu arada şu şekilde ilklendirilebiliyormuş.
    SDL_Rect konum = {0,0,600,400};
Avatar
Salih Dinçer #21
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler Erdem...

Yukarıdaki kendim için bir denemeydi. Dediğin gibi Surface ve Rect yapılarına sahip olan bir nesne sınıfı olmalı. Bunu da yapabilirsem demo olarak yüklemek hiç fena olmaz. Gerçi nasıl dosya yükleneceğini bilmiyorum. Var olanların içine girip düzenleniyor. Hatta tuşlar dosya ismini yazarak gerçek zamanlı filitre olayı çok hoşuma gitti. GitHub, çok çok başarılı...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #22
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Dosya yüklemek çok basit:

git add test.d
git commit -m "D için test kodu"


Bu şekilde üzerinde değişiklik yaptığın kaynak dosyalarını ekledikten sonra:

git push -u origin master

şeklinde ekleyebiliyorsun.

Eğer sunucudaki dosyalar üzerinde başka bir kullanıcı değişiklik yaptıysa ilkönce yerel depoyu eşitlemek için:

git pull

demek yeterli oluyor.
Avatar
Salih Dinçer #23
Üye Ock 2012 tarihinden beri · 1890 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler, basit görünüyor ama sanırım önce login/mount benzeri bir şey yapmak gerekmiyor mu?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #24
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Https arayüzü kullanıldığı zaman herseferinde kullanıcı adı şifre istenmiyor. credential helper özelliği sayesinde şifreleri belirli bir süre örneğin 15 dakika saklamasını söyleyebiliyoruz.

https://help.github.com/articles/set-up-git#platform-linux

Bir diğer seçenek de ssh kullanmak. Ama biraz daha zahmetli.

https://help.github.com/articles/generating-ssh-keys#platf…
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2 
Forum: SDL RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-07-23, 11:48:45 (UTC -07:00)