Forum: Projeler pisti RSS
Pişti için görsel arabirim (devam edilmiyor)
Sayfa:  1  2  sonraki 
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Pişti için görsel arabirim (devam edilmiyor)
Biliyorsunuz bir süredir SDL için D ilintileri yazmaya çalışıyorum. Bana nedense grafik programlama daha ilginç geliyor :)

Bu yüzden turna'yı artık tamamen Kadir Can arkadaşımıza devredip eğer becerebilirsem bu proje için görsel bir arabirim yazmaya karar verdim.

Hangi oyun olursa olsun bir oyunun genel yapısı şu şekilde:

Oyun Döngüsü

İlklendir : Oyunun ihtiyaç duyduğu ilk değerleri burada veriyoruz.

oyuncuKonumunuBelirle()

İçeriği Yükle : 2D hareketli grafikler texture, oyuncu modelleri, ses efektleri ve müzik

içerik.yükle("dosya")

Güncelle : Burada oyuncunun bastığı tuşları kontrol ediyoruz ve oyunun her karesinde oyun değişkenlerini değiştiriyoruz.

if(sağTuşBasılıMı)
    konumuDeğiştir && animasyonuDeğiştir

Çiz : Burada oyunumuza grafik kartına ne gönderileceğini ve ekrana nasıl çizileceğini söylüyoruz

oyuncuyuÇiz()

Bunları anlatmamın sebebi ilkönce D ile SDL için sarıcı basit bir kütüphane oluşturmayı düşündüm. Çok kabaca taslak olarak şu şekilde:
import std.stdio;
import sdl;
 
class Çizici
{
    
}
 
class TemelOyun
{
    Çizici çizici;
    EkranYüzeyi ekran;
    this() // ilklendir 
    {
        SDL_Init(SDL_INIT_EVERYTHING);
        ekran = SDL_SetVideoMode(640, 480, 24, SDL_HWSURFACE);
        writeln("SDL ilklendirildi");
        
    }
    ~this()
    {
        SDL_Quit();
    }
 
    void çalıştır() 
    {
        içerikYükle();
        Güncelle();
        Çiz();
        SDL_Delay(6000);
        
    }
    
    
protected:
    void içerikYükle() {}
    void Güncelle() {}
    void Çiz() {}
    
}
 
class Oyun : TemelOyun
{
    this()
    {
        super();
    }    
}
 
void main()
{
   auto oyun = new Oyun();
   oyun.çalıştır();
}

Denemek isterseniz bu adresteki dosyayı sdl.d adıyla kaydedip

http://paste.pocoo.org/show/388884/

$ dmd oyun.d sdl.d -w -ofdeneme -w -L-lSDL

şeklinde derlemeniz yeterli. Burada Çizici nesnesinin görevi kendisine geçilen grafikleri 2d sprite çizmek olacak.

SDL'nin çalışma mantığı gereği (aslında diğer grafik kütüphaneleri de bu şekilde çalışıyor sanırım) ilkönce bu resimleri grafik kartının belleğinde çizilmeye hazır hale getirecek. SDL'de ekran yüzeyleri var. Aslında ekran da bir yüzey. Yaptığı işlem ekran kartının belleğinde çizilecek tüm yüzeyleri belirtilen ekran koordinatlarına BLIT Block Image Transfer denilen bir yöntemle kopyalamak. Daha sonra resim hazır hale geldiğinde ekran kartına çizdirecek.

Ayrıca kullanıcının SDL kütüphanesinin çalışma mantığını ve işlevlerini bilmesine de gerek kalmayacak. Bu yüzden TemelOyunNesnesi de aslında daha sonra başka bir modüle taşınabilir.

Yorumlarınızı ve önerilerinizi bekliyorum :)
Bu mesaj erdem tarafından değiştirildi; zaman: 2011-12-23, 04:24.
canalpay (Moderatör) #2
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çok güzel.

Projeyi hatırlamaya çalışıyordumda fena halde değil gibiydi.

Şuan özellikle sdl ile şurdaki işlevleri gerçekleştiren işlevleri yazarsanız çok güzel hale gelir: http://code.google.com/p/pisti/source/browse/trunk/pisti/c…

Bende bir göz atarım.

Proje için hatırladığım kadarıyla görsel arabirimle ilgili sadece çizici modülü ile uğraşmanız gerekiyor. Orada zaten yeterince soyutlanmıştı.


SDL ile çalışabiliyor olmamız ayrıca çok güzel :-)
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Artık ufak bir uzay mekiğini yükleyebiliyor :) oyun.d'nin son hali şu şekilde oldu:
import std.stdio;
import sdl;
 
struct Vector2
{
    double x, y;
    this (double x, double y)
    {
        this.x = cast(double)x;
        this.y = cast(double)y;
    }
}
 
struct İçerik
{
    EkranYüzeyi yükle(string dosyaİsmi) 
    {
        EkranYüzeyi yüklenen, optimize;
        yüklenen = SDL_LoadBMP(dosyaİsmi.ptr);
        assert(yüklenen != null);
        optimize = SDL_DisplayFormat(yüklenen);
        SDL_FreeSurface(yüklenen);
        return optimize;
    }
    
}
 
class Oyuncu
{
    //2DGrafik
    EkranYüzeyi oyuncuGrafik;
    Vector2 konum;
    bool aktif;
    int sağlık;
    int genişlik;
    int yükseklik;
    
    //2DGrafik
    this (EkranYüzeyi grafik, Vector2 konum) 
    {
        oyuncuGrafik = grafik;
        this.konum = konum;
        aktif = true;
        sağlık = 100;
    }    
 
    void güncelle()
    {}
 
    void çiz(Çizici çizici)
    {
        çizici.çiz(oyuncuGrafik, konum);
    }
    
}
 
class Çizici
{
    EkranYüzeyi ekran;
    this (EkranYüzeyi ekran) 
    {
        this.ekran = ekran;
    }
    
    void çiz(EkranYüzeyi kaynak, Vector2 konum)
    {
        Dikdörtgen koordinat;
        koordinat.x = cast(short) konum.x;
        koordinat.y = cast(short) konum.y;
        SDL_BlitSurface(kaynak, null, ekran, &koordinat);
    }
}
 
class TemelOyun
{
    İçerik içerik;
    Çizici çizici;
    EkranYüzeyi ekran;
    this() // ilklendir 
    {
        SDL_Init(SDL_INIT_EVERYTHING);
        ekran = SDL_SetVideoMode(640, 480, 24, SDL_HWSURFACE);
        writeln("SDL ilklendirildi");
    }
    ~this()
    {
        SDL_Quit();
    }
 
    void çalıştır() 
    {
        içerikYükle();
        güncelle();
        çiz();
        SDL_Delay(10000);
        
    }
    
    
protected:
    void içerikYükle()
    {
        çizici = new Çizici(ekran);
    }
    void güncelle() {}
    void çiz() {}
    
}
 
class Oyun : TemelOyun
{
    Oyuncu oyuncu;
    
    this()
    {
        super();
    }
 
    override protected void içerikYükle()
    {
        super.içerikYükle();
        auto oyuncuKonum = Vector2(180, 180);
        oyuncu = new Oyuncu(içerik.yükle("ship.bmp"), oyuncuKonum);
        
    }
 
    override protected void çiz()
    {
        oyuncu.çiz(çizici);
        SDL_Flip(ekran);
    }
}
 
void main()
{
   auto oyun = new Oyun();
   oyun.çalıştır();
}

[Resim: http://www.zworqy.com/belma/bmp/ship.bmp]

Bu ücretsiz resmi ship.bmp ismiyle kaydederek deneyebilirsiniz.
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kodun son durumu şu şekilde:

http://paste.pocoo.org/show/390073/
http://paste.pocoo.org/show/390075/

Bu arada beni de projeye ekleyip bir test dizini oluşturabilirseniz sevinirim :)
struct Vector2
{
    float x, y;
    this (float x, float y)
    {
        this.x = cast(double)x;
        this.y = cast(double)y;
    }
}

Bir de böyle bir Vector2 yapısı için toplama, çıkarma .. gibi işlevleri yazmak isteyen olur mu acaba?

Örneğin kod içinde şu şekilde kullanabileceğiz:
        auto konum = Vector2(4, 15);
        konum += Vector2(0, 5);
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Galiba bu projeyi "pull request" ile yürütüyorduk. Şuradan kopyalayıp üzerinde çalışılıyor ve "pull request" gönderiliyor:

  https://github.com/acehreli/pisti

(Biliyormuş gibi yazdım ama bütün hatırladığım o kadar! :))

Ali
erdem (Moderatör) #6
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hımm :) Herşeyi yaptım ama o dizine ekleme yapamadım (push)

O yüzden ben de bu dizinde oluşturdum.

https://github.com/erdemoncel/oyun

Ya da bu şimdilik test olarak devam etsin. Ben de oyun programlama konusunda yeni yeni bir şeyler öğreniyorum. O yüzden neyin nasıl çalıştığını öğrenmek için test etmek gerekiyor.  Artık piştinin görsel arabirimi oluşturulmaya başlarsa o zaman ana projeye ekleriz.

Hem o zamana kadar git kullanımına biraz daha aşinalık kazanırım herhalde :)

Denemek isteyenler yukarıdaki adresten Downloads düğmesine tıklayarak indirebilir. Daha sonra make komutu ile kurabilirsiniz. Bağımlılık olarak SDL geliştirme kütüphanelerine ihtiyaç duyduğu için Ubuntu'da  bunları kurmanız gerekiyor:

$  sudo apt-get install libsdl1.2-dev
canalpay (Moderatör) #7
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şİmdi denedim çok güzel :-)

Bu yaptıklarını ders niteliğinde yazarak ilerlerseniz çok güzel olur. Şimdi resmi değiştip kendime göre şeyler yapacağım :-D
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Bu yaptıklarını ders niteliğinde yazarak ilerlerseniz çok güzel olur.

Olabilir tabi. Burada mı :) Ali bey de tamam derse ben yazmaya çalışırım.

Ama bu yazdığımız kod profesyonel bir oyun programcısının gözünde çok kötü olabilir  :-p  Dediğim gibi ben sadece amatör olarak takılıyorum  ;-)

Ayrıca oyunda hala bir sürü eksiklik var:

  • Örneğin şu anda hareket FPS (saniyedeki kare sayısı) tabanlı olmadığı için örneğin hızlı makinelerde uzay mekiği olması gerektiğinden çok hızlı giderken yavaş makinelerde normal hızlı gidiyor. Bunun için süre ölçen bir sınıf yazıp, oyun nesnelerininin hareketini FPS bazlı yapacak değişiklikler yapmak gerekecek.
  • Vector2 sınıfında eksiklikler var.
  • İçerik yükleyici sadece bitmap resimleri yükleyebiliyor.

Bunlar sadece benim görebildiklerim. Daha da gözüme çarpmayan eksiklik, hatalar olabilir.

Belki sınıf tasarımını sil baştan değiştirmemiz bile gerekebilir :)
Avatar
mert #9
Üye Ara 2010 tarihinden beri · 193 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #7
Denedim Erdem gayet güzel. Evet sdl kütüphanesini de anlatan bir ders olsa ne de güzel olurdu.
Gayet hoş, o köşeden bu köşeye gidiyor gemicik :-)
Bir yerlere laser falan atacağız değil mi?
mert
erdem (Moderatör) #10
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Tabi elbette :)
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bir de burada asıl amacım mümkün olduğu kadar kullanıcının hiç SDL bilmeden ufak oyunlar yazabilmesi.

Hatta XNA gibi kütüphanelerde tüm bu işlemler oyun kütüphanesinin kendisi tarafından yapılıyor. Kullanıcı bu yüzden sadece kendi oyun değişkenlerini yazıp ya da değiştirerek çok kısa sürede oyun hazırlayabiliyor. Burada tüm bu işlemi biz yapıyoruz. Eğer bu konuda profesyonel bir oyun programcısından da yardım alabilseydik çok süper olurdu :)
canalpay (Moderatör) #12
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bir de burada asıl amacım mümkün olduğu kadar kullanıcının hiç SDL bilmeden ufak oyunlar yazabilmesi.

Belkide bu amaçlı xnaya benzemesi için bir kütüphane yazabilirsiniz? İngilizce yazılırsa yardım edebilecek çok kişi çıkabilir?
erdem (Moderatör) #13
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İngilizce yazmak istemiyorum. Bunun nedeni zaten ingilizce bilenler için diğer diller için konuşursak yeterince bu konuda kaynak, kütüphane var. D için Derelict'i denedim ama en son baktığımda derlenmiyordu. Türkçe olursa hepimiz rahatlıkla kullanabiliriz :)

Ayrıca İngilizce oyun geliştiricilerin olduğu forumlarda anlamadığımız yerleri sorabiliriz.

XNA gibi oyun kütüphaneleri ya da profesyonel oyun motorları duyduğum kadarıyla içerisinde yüzlerce profesyonel oyun programcısının olduğu ekipler tarafından, 3-5 yılda ve oldukça yüksek bir bütçe ile gerçekleştiriliyormuş.
canalpay (Moderatör) #14
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
XNA gibi oyun kütüphaneleri ya da profesyonel oyun motorları duyduğum kadarıyla içerisinde yüzlerce profesyonel oyun programcısının olduğu ekipler tarafından, 3-5 yılda ve oldukça yüksek bir bütçe ile gerçekleştiriliyormuş.
Ben daha çok sdl için wrapper tarzında bir şey demek istedim. İngilizce dememin nedenide destek bulabilmek için. Sanırım d için bu konuda bir şey yok.
acehreli (Moderatör) #15
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben daha bakamadım... :-/

Erdem, sen dersi yazmaya başla.

Ayrıca profesyoneller kendi aralarında takılsınlar. Biz D ile SDL öğrenmek istiyoruz! :)

Ali
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:  1  2  sonraki 
Forum: Projeler pisti 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-06-24, 22:28:04 (UTC -07:00)