Forum: SDL RSS
SDL2 D ilintisi hakkında...
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: SDL2 D ilintisi hakkında...
Merhaba,

İki gündür SDL2 ilintisini D'ye uyarlamaya çalışıyorum. Bir kaç sorun ile debelendikten sonra, sonunda aşağıda ekran görüntüsü bulunan ilk örneğimi çalıştırabildim...:-D

[Resim: http://desmond.imageshack.us/Himg98/scaled.php?server=98&filename=ekrangrntstv.png&res=crop]
Büyüğü için tıklayınız...

Bu örneği denemelisiniz! Çünkü ekrana yüzlerce dolaşan resim (-bknz. bunun kullandım ama SVG, BMP'ye çevirmelisiniz) rasgele basıyor ve bunlar ekran sınırları içerisinde istediğimiz hızda (MAX_SPEED) hareket ediyor. İsterseniz sayısını (NUM_SPRITES) da değiştirebiliyorsunuz...

Özellikle SVG'den temiz bir görüntü yansıtmak istedim. Amacım basit ama nitelikli (şeffaf) bir test yapmaktı. SDL2 hiç fena görünmüyor! Üstelik henüz yüzlerce işlevini deneme fırsatı bulabilmiş değilim...:)

Ama önce ilintiyi tamamlamalıyız; takıldığım bir kaç noktada yardımınıza ihtiyacım var:

  • Öncelikle bazı enum'lar isimsiz, bazıları isimli. İsimlileri de isimsiz yapmak gerekli mi? Çünkü ilintiler içinden bu değerler çağrıldığında isim ön ekini nokta ile beraber (örn. SDL_EventType.SLD_QUIT) kullanmamız gerekiyor. Oysa C ilintilerinde bu şart koşulmamış!

  • Belki de bu daha önceliklidir çünkü C'de define'lar ile tanımlanan işlev benzeri macro'lar var. Bunların basit olanlarını macro'yu dağıtarak hallediyorum ama karmaşıklar için işlev mi yazmamız gerekiyor? İşte bu en çok sıkıntı çektiğim nokta. Baksanıza adam tek satırda halletmiş ve ben can çekişmişim! Hadi iki satıra bölmüş diyelim, malum 80 sütuna sıkıştırma mevzusu...:)
//#define SDL_QuitRequested() \
//(SDL_PumpEvents(), (SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUIT,SDL_QUIT)>0))
bool SDL_QuitRequested() {
  SDL_PumpEvents();
  if(SDL_PeepEvents(null, 0, SDL_eventaction.SDL_PEEKEVENT,
                             SDL_EventType.SDL_QUIT,
                             SDL_EventType.SDL_QUIT) > 0) {
    return true;
  }
  return false;
}

  • Hoş typedef'ler de zaman zaman sıkıntı yapmıyor değil! Örneğin şunu doğru yaptığımı düşünsem de sdl2d/events.d(501): Error: SDL_TimerCallback is used as a type hatasını alıyorum...

//typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event);
extern(C) int function(void* userdata, SDL_Event* event) SDL_EventFilter;

Bunda da ama bunun derdi başka çünkü yanında bir işlev ve takma isim var:

/**
 *  Function prototype for the timer callback function.
 *  
 *  The callback function is passed the current timer interval and returns
 *  the next timer interval.  If the returned value is the same as the one
 *  passed in, the periodic alarm continues, otherwise a new alarm is
 *  scheduled.  If the callback returns 0, the periodic alarm is cancelled.
 */
typedef Uint32 (SDLCALL * SDL_TimerCallback) (Uint32 interval, void *param);
 
/**
 * Definition of the timer ID type.
 */
typedef int SDL_TimerID;
 
/**
 * \brief Add a new timer to the pool of timers already running.
 *
 * \return A timer ID, or NULL when an error occurs.
 */
extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval,
                                                 SDL_TimerCallback callback,
                                                 void *param);

Yukarıdaki ilintiyi şu şekilde D'ye uyarlayınca da aynı hatayı alıyorum...:(

extern(C) Uint32 function(Uint32 interval, void* param)SDL_TimerCallback;
 
alias int SDL_TimerID;
 
extern(C) SDL_TimerID SDL_AddTimer(Uint32 interval,
                                   SDL_TimerCallback callback,
                                   void* param);
Teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 895 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çok hızlı bir cevap yazayım. Daha önce bahsettiğim gibi SDL 2 için C ilintileri yazmana gerek yok çünkü zaten yazılmış.

https://github.com/aldacron/Derelict3/tree/master/import/d…

Direkt buradan kullanabilirsin  :-D

Bir de bildiğim kadarıyla SDL2 kullanımı ile ilgili yeterli belge yok. Eğer bulursan, buraya yazabilirsin.
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ooo bu iyi oldu, oradaki bir kaç dosyada sorumun cevabı mutlaka vardır. Derelict'den faydalanmayı deneyeceğim, teşekkürler...:)

SDL2 belgesine gelince, biz deneyip yazacağız! İngilizce belgeler ile uğraşmaya gerek yok zaten geliştiricileri yazacaktır. Önemli olan kendi (D)ilimize (iki anlamlı!) yazmak. Aslında bakarsan yazmışlar da çünkü C ilintilerine baktığımda aralarda kimi zaman çok ayrıntılı bilgi var. Ayrıca şu verdiğim adresteki Wiki çok işimize yarayacaktır:

http://wiki.libsdl.org/moin.cgi/CategoryAPI

Bu arada çalışmalarımı GitHub'a yüklemeye karar verdim. Oradan takip edebilirsiniz çünkü gerçekten çok işlev var! Sanırım Derelict'de başlangıçta benim yaptığımı yapmış ve sadece işine yarar olanları çekip almış. Bence çalışmaya devam, hedefimiz framework! Bizim yabancılardan neyimiz eksik...:-D
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 895 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Salih Dinçer:
Örneğin şunu doğru yaptığımı düşünsem de sdl2d/events.d(501): Error: SDL_TimerCallback is used as a type hatasını alıyorum...

//typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event); 

Sanırım bu durumda senin örneğine sadece typedef eklemek gerekiyor.
extern(C)
{
    typedef int function (void *userdata, SDL_Event * event) SDL_EventFilter
}
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 895 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
Salih Dinçer:
Bu arada çalışmalarımı GitHub'a yüklemeye karar verdim. Oradan takip edebilirsiniz çünkü gerçekten çok işlev var!

Hadi bakalım! Merak ve heyecanla takip ediyor olacağım  ;-)
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Salih Dinçer:
  • Öncelikle bazı enum'lar isimsiz, bazıları isimli. İsimlileri de isimsiz yapmak gerekli mi? Çünkü ilintiler içinden bu değerler çağrıldığında isim ön ekini nokta ile beraber (örn. SDL_EventType.SLD_QUIT) kullanmamız gerekiyor. Oysa C ilintilerinde bu şart koşulmamış!

C'de enum değerler enum türü olmadan da kullanılabilirler ve o yüzden de farklı enum'ların değerleri birbirleriyle karışmasınlar diye isimlerinin başına kendi enum'larının türü gelir. C'de o yüzden QUIT değil, SDL_QUIT diyorlar (demek zorunda kalıyorlar).

Baştan tasarlanan bir D programı olsa enum'un adı EventType, değerlerinin adı da QUIT, vs. olabilirdi.

Bence ne değerlerin isimlerini değiştirmeli, ne de isimli enum'ları isimsiz yapmalı. Sonuçta bir ilinti... Hani SDL2'yi sarmalayan başlıbaşına bir modül yazıyor olsak belki o zaman daha serbest hareket ederiz ama sanki bir ilintinin C'deki aslından fazla farklı olmaması gerekiyor diye düşünüyorum.

macro'lar ... Baksanıza adam tek satırda halletmiş

Makroların sıkıntılı ve sorunlu oldukları konusunda şüphe yok. Olabilse, hiç makro kullanılmasın ama bazen mecbur kalınır. (Bjarne Stroustrup C++'tan çıkartmaya çalışmıştır ama bazı durumlarda şarttır.)

//typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event);
extern(C) int function(void* userdata, SDL_Event* event) SDL_EventFilter;

Sanırım bir 'extern(C)' bildiriminde 'function' sözcüğü geçmemeli. Hiç denemeden şunu öneriyorum :):

extern(C) int (*SDL_EventFilter)(void* userdata, SDL_Event* event);

Ali
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali hocamın dediği şekilde deneyince şu hatayı aldım:

sdl2d/timer.d(35): C-style function pointer and pointer to array syntax is deprecated. Use 'function' to declare function pointers

Erdem'in bahsettiği şekilde denediğim de ise depresyona giriyorum, çünkü yine deprecated yazıyor...:)

sdl2d/timer.d(37): use of typedef is deprecated; use alias instead

Ama okuduğumu yanlış anlamıyorsam typedef yerine alias kullanmamı öneriyor ve çalışıyor...:)

Evet, tarihin en kısa depresyonunu geçiren olarak Guinness Records kitabına giriyorum, teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
erdem:
Bir de bildiğim kadarıyla SDL2 kullanımı ile ilgili yeterli belge yok. Eğer bulursan, buraya yazabilirsin.
SDL2wiki'ye yakın zamanda eklenmiş örnekli bir madde gördüm:

http://wiki.libsdl.org/moin.cgi/SDL_WaitThread

Sanırım buraya üye olup katkı da sağlayabiliyoruz. Böylece kullananların sayısı arttıkça SDL2 hakkında daha çok şey yazılıp çizilecek. Ben şimdiden Türkiye'de okuyan bir kaç öğrenciye tebliğ vazifemi yerine getirdim. Darısı diğerlerinin başına...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Salih Dinçer on 2012-08-09, 08:47:
Merhaba,

İki gündür SDL2 ilintisini D'ye uyarlamaya çalışıyorum. Bir kaç sorun ile debelendikten sonra, sonunda aşağıda ekran görüntüsü bulunan ilk örneğimi çalıştırabildim...:-D

[Resim: http://desmond.imageshack.us/Himg98/scaled.php?server=98&filename=ekrangrntstv.png&res=crop]
Büyüğü için tıklayınız...
Bugün gereksiz dosyaları temizlerken, yukarıdaki ekran görüntüsüne denk geldim ve bir kere de yakından baktım. Malum, gözlerimizin algılamayacağı bir biçimde (sanırım saniyede 24 kareye kadardı) ekran yeni baştan icraa ediliyor. Meğer, bu 512 beneklik (pixel) yüksekliğe sahip resmi, yanlış saymadıysam 8 parçaya bölmüş ve güncellemiş! Dikkatli bakarsanız, şekillerin çakıştığı noktalar arasında eşit uzaklıktaki sanal çizgileri siz de görebilirsiniz...

Aynı denemeyi bir de SDL 1.3'de yapmalı. Belki de ekranı segment'lere bölmesi başından beri vardı...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #10
Üye Ock 2012 tarihinden beri · 1880 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bugün SDL ilintilerinin hazırlanma çalışması sırasında tartışılan şu başlığa denk geldim: http://ddili.org/forum/thread/539

İlinti hazırlamaya yönelik faydalı bilgiler var...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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:
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-04-26, 12:40:01 (UTC -07:00)