[Çözüldü]Yaratılan Görselleri Nesne Olarak Yaratmak Mümkün mü?

Başlatan sem, 11 Ekim 2011 - 10:03:19

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

sem

Sanırım bu soru için SDL ve Open GL çok fark etmez. O nedenle özellikle birisini belirtmedim. Ben Open GL ES ile çalışacağım... Soruyu örnek üzerinden anlatırsam daha kolay olacak;

SurfaceView var ve buna bağladığımız bir Renderer var. Şimdi Renderer ile bir Kare çizdirdiğimizi düşünelim ve SurfaceView'e bunu entegre edelim. Yani ekranda bir tane kare gözükecek. Tamamdır. Hatta şöyle yapalım; iki tane kare çizdirelim...

Ekranda iki tane kare olsun; birisi sağ üst köşede, bir diğer sol alt köşede olsun... Ben bunlara button hissi verebilirim, ha da kullanıcı hangisine dokundu/tıkladı anlayabilirim. Şöyle; kareleri yarattığım boyutu biliyorum. Ekran boyutu ile karelerin boyutları ve koordinatları üzerinde bir takım matematiksel işlemler sonucu kullanıcının nereyi tıkladığını anlayabilirim... Ben soracağım ise; ekrandaki bir kare, kendi başına tıklandığını anlayabilir mi?

Yani Open GL değil de bir UI kütüphanesi kullandığımızı düşünün ve de örneğimizdeki kareleri buttonlar ile yapmış olalım... Bir buttona click olayı atayabiliyoruz. Yani kendi kendine tıkladığımızı anlayabiliyor. Ope GL'de oluşturulan karelerin de aynı şekilde kendi kendine bir şeyler yapabilme ihtimali var mıdır?

Aslında vardır gibime geliyor fakat emin olmak için ve nasıl yapılacağına dair fikir almak için soruyorum. Yani Örneğin Open GL ile yapılmış bir oyun düşünelim. Adama nişan aldık ve ateş ettik. Ayağından vurduk. Adam topallayarak yürümeye başlıyor. Bu şekilde bir işlemi ekran koordinatları yerine vurulan adamı bir nesne olarak yaratarak, isabet eden kurşuna göre hareket ettirmek daha mantıklı gibi duruyor. Aksi halde yine bir çok işlem gerekecek....

Tam olarak anlatabildim mi bilmiyorum. Konuya hakim ama soruyu anlamayan arkadaşlar olursa, biraz daha açmaya çalışırım...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

travego0403

Anlattığın durum teorik olarak yapılabilmesi lazım, verdiğin buton örnekleri gibi. Fakat pratikte nasıl olur bir fikrim yok. Ben daha önce yazdığım SDL uygulamalarında bu karelerin tıklanmış olup olmamadığını mouse koordinatlarını karenin koordinatları ile karşılaştırarak anlamaya çalışmıştım. Aslında bu işlemi bir sınıf içerisinde üye fonksiyon yardımı ile yapsak, dışarıdan başka bir nesne için bu durumu tıklanıp/tıklanmadığı durumuna düşürebiliriz. Buda çok karışık duruyor boşver. :)

Ayrıca bu dediğinin OpenGL içerisinde bir çözümü olduğunu sanmıyorum. OpenGL çizim işlemleri için bir API. Çözümü daha çok yardımcı olarak kullandığın pencere, olay yakalama gibi işlemleri gerçekleştiren kütüphane üzerinden araştır. Ama sen yinede bana bakma, OpenGL üzerinden de araştır, bilmediğimiz o kadar çok şey var ki. :)
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

sem

Aslında evet, yine olayları yakalama kısmı pencereye kalıyor... Yani şu hali ile 10 tane kare yaptım diyelim. Bunların hepsini bir yere çizdiyiorum ve çizdirdiğim birim için tıklama olaylarını yakalama şansım oluyor. Fakat bu şekilde işler çok karışacak gibi duruyor.

Örneğin scrollView içerisinde 100 tane button olduğunu varsayalım... Kişi 35 buttonluk scroll yaptı. Ve ekranda 10 button gözükebilsin... 36. ve 45. buttonları görebilecek kişi. Ve 8. tıklanmış olsa?

Buttonlar arasındaki mesafe nedir, kişi kaç piksellik scroll yaptı, bir button + iki button arası boşluk kaç piksel? Kişinin tıkladığı yerin koordinatını bunlar arasında dönüştürmek ciddi anlamda bir sıkıntı. O nedenle bir yolu olmalı gibi geliyor şu anda =)

Hani şöyle diyeceğim; tüm kareleri farklı katmanlara çizelim... 1. katmanda ekranın sol üstündeki kareyi barındıran birim. Sağ altta sağ alt köşedeki kareyi barındıran birim olsa... Bunları ayrı ayrı layoutlara koysam. Tıklama event i alt layoutlara otomatik olarak aktarılıyor. Bu sefer şöyle bir sorun çıkacak; tıklanan yerde üst üste binmiş kaç layout var? event'i hagngisi alacak? Hepsi teker teker iş yapsa eventla işimiz var demektir =)

O nedenle enteresan bir durum söz konusu sanırım. Ya da çok acemi olduğum için böyle hissediyorum... Hep beraber akıl yürütüp çıksak şu işin içinden çok sevineceğim. Çünkü muhakkak benden daha deneyimli arkadaşlar, çok daha mantıklı akıl yürütebileceklerdir.

Şu an aklıma pek bir şey gelmiyor açıkcası çözüme dair.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

sem

Şu an için çözümü doğrudan OpenGL ES (Embded System) için düşünüyorum...  Acaba grafiklerde ES ile uğraşan arkadaş var mı ?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

sem

Android OpenGL ES tarafında, hiç bir yerde çözüm bulamayınca, kendi kendime üretmek zorunda kaldığım çözümü aktarıyorum...

GLSurfaceView'i araştırınca gördüm ki normal View'den türemiş... Bu da GLSurfaceView'i herhangi bir Layout içerisine koyabileceğimizi gösterir... Ben de bir çok deneme yaptım fakat GLSurfaceView'in Renderer'ı daima tam ekran ebatlarında çalıştığı için, sıkıntı yaşadım (renk özelliklerinde alpha'dan yararlanabilmeyi umuyordum aslında)... B u durumda yapılacak pek bir şey yoktu =) Renderer'ı kandırmak gerekiyordu ekran boyutları hakkında...


ÇÖZÜM:

Renderer'dan bir sınıf türetin ve GLSurfaceView'e bağlamak için kaydedin... GLSurfaceView normal View'den türediğine göre bu OnMeasure'yi ezebileceğimiz anlamına geliyor... Hali ile yapılacak olan belli... GLSurfaceView'den bir sınıf türetip üzerine yazıyoruz... dimension'ı ise istediğimiz ebatlarda ayarlıyoruz...

Örneğin 50x80 yaptık diyelim...

Renderer'ı da öyle bir ayarlıyoruz ki, çizeceği şekli tam ekran olarak çizecek şekilde programlıyoruz...

Yapılan nedir?

* Renderer'ımız var, tam ekran boyutlarında şekil çiziyor...
* myGLSurfaceView gibi bir sınıf türettik; bu sınıfta onMeasure içerisinde ekran boyutlarını istediğimiz gibi şekillediriyoruz...

Yani ebatları 50 x 80 yaptık... Renderer ile bir button yaptık kare, üçgen, prizma... Her ne ise... Tam ekran çalıştık....

myGLSurfaceView'inizi artık 50x80lik herhangi bir Widget gibi kullanabilirsiniz... Hayırlı uğurlu olsun...

Örnek fonksiyon:

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpeci) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpeci);
        setMeasuredDimension(50,  80);
    }



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 13 Ekim 2011 - 19:24:48

EK: Button sorunu bu yorman ile çözülmüştür... O nedenle çözüldü olarak etiketledim...

Normal nesneler hakkında tartışmaya devam edilecekse başlık açık kalbilir... Çünkü benim de hala merak ettiğim bir konu =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?