Jump to page: 1 2
Thread overview
Pişti için görsel arabirim (devam edilmiyor)
May 14, 2011
erdem
May 14, 2011
erdem
May 16, 2011
erdem
May 16, 2011
erdem
May 17, 2011
erdem
May 17, 2011
mert
May 17, 2011
erdem
May 17, 2011
erdem
May 17, 2011
erdem
May 17, 2011
erdem
May 17, 2011
erdem
May 17, 2011
erdem
May 14, 2011

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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 14, 2011

Ç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/cizici.d

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 :-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 14, 2011

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();
}

http://www.zworqy.com/belma/bmp/ship.bmp

Bu ücretsiz resmi ship.bmp ismiyle kaydederek deneyebilirsiniz.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 16, 2011

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);

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 16, 2011

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 17, 2011

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 '

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 17, 2011

Şİ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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 17, 2011

Alıntı (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 :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 17, 2011

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?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 17, 2011

Tabi elbette :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2