Forum: Projeler pisti RSS
Pişti için görsel arabirim (devam edilmiyor)
Page:  1  2  next 
erdem (Moderator) #1
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Subject: 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 :)
This post was edited on 2011-12-23, 04:24 by erdem.
canalpay (Moderator) #2
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Ç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 (Moderator) #3
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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();
}

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

Bu ücretsiz resmi ship.bmp ismiyle kaydederek deneyebilirsiniz.
erdem (Moderator) #4
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #5
User title: Ali Çehreli
Member since Jun 2009 · 2279 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #6
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #7
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Şİ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 (Moderator) #8
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by 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 :)
mert #9
Member since Dec 2010 · 93 posts
Group memberships: Üyeler
Show profile · Link to this post
In reply to post #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?
erdem (Moderator) #10
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Tabi elbette :)
erdem (Moderator) #11
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #12
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #13
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
İ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 (Moderator) #14
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #15
User title: Ali Çehreli
Member since Jun 2009 · 2279 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  1  2  next 
Forum: Projeler pisti RSS
Not logged in. · Lost password · Register
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Current time: 2012-05-18, 09:57:23 (UTC -07:00)