Thread overview
üretgen.d
Aug 22, 2012
Salih Dinçer
Aug 23, 2012
Salih Dinçer
Aug 23, 2012
Salih Dinçer
Aug 23, 2012
erdem
Aug 23, 2012
Salih Dinçer
Aug 23, 2012
erdem
Aug 23, 2012
Salih Dinçer
August 23, 2012

Merhaba,

Bu gerçekten çok üretken bir şey! Yaptığı, belki de saçma sapan bir şey de olabilir...:)

Çünkü 'circleFill()' işlevinden bozma ama dörtgen, üçgen ve benzeri garip gurup şekiller çizebilmekte. Sadece geometrik şekil değil; aynı zamanda 'group' ya da 'shape' de diyebileceğimiz karakterleri bir diziden alarak oluşturabilmekte! Bunları BMP gibi istediğiniz yerinden kesip boyutlandırabiliyorsunuz.

http://img846.imageshack.us/img846/3775/uretgen.png

Hiç bir dosya erişim işlemi yapmadığı için hızlı da! Şekilleri arka planda ve ekran boyutunda bir alanın tam ortasında oluşturuyor. Tıpkı Macromedia Flash gibi (son ismi sanırım Adobe Builder oldu?) 'symbol' veya 'movieclip' (MC) nesnesi oluşturmuş oluyorsunuz. Çünkü o yazılımdaki gibi iki koordinat var! Biri MC içinde diğeri ise ekrandaki. Neyse mutlaka deneyin ve birlikte geliştirelim:

/*
 üretgen.d (22.08.2012)
*
* dmd üretgen sdl -L-lSDL -release
*/
//import sdl, core.stdc.stdio: printf;/*
import sdl, std.stdio;  //*/                                                  */
                        /*        -------> üçgen                             */
 enum GENİŞLİK  = 600;  /*        '  ----> bölen                             */
 enum YÜKSEKLİK = 200;  /*        '  '  -> seviye
                                  ü  b  s
                                + 0  2  6
                               [] 0  0  7
                               () 0  0  9 (çap 8, çap 16'da ise 13)

    veriler          x    y   r   ü  b  s  renk                              */
 int[][] abo = [ [    0,   0, 50, 0, 1, 2, 0x6495ED ], // gövde
                 [  -20, -10, 10, 0, 1, 2, 0x0000FF ], // sol göz
                 [   20, -10, 10, 0, 1, 2, 0x0000FF ], // sağ göz
                 [    0,  10, 10, 0, 3, 5, 0x0000FF ], // burun
                 [    0,  30,  8, 0, 1, 5, 0x0000FF ], // ağız
             ];

 int[][] aço = [ [  0,   0,  50, 1, 1, 2, 0xFF0000 ],
                 [ -20, -10, 10, 0, 1, 2, 0x00FF00 ],
                 [  20, -10, 10, 0, 1, 2, 0x00FF00 ],
                 [  0,   10, 10, 0, 3, 5, 0x00FF00 ],
                 [  0,   30,  8, 0, 0, 9, 0x00FF00 ],
               ];

 int[][] alo = [ [   0,   0, 50, 0, 2, 4, 0x6495ED ],
                 [ -20, -10, 10, 0, 1, 2, 0x0000FF ],
                 [  20, -10, 10, 0, 1, 2, 0x0000FF ],
                 [   0,  10, 10, 0, 3, 5, 0x0000FF ],
                 [   0,  30,  8, 0, 1, 5, 0x0000FF ],
               ];
void main(){
 bool DEVAM = true;
 auto PENCERE = "Şekil Üretme v1".ptr;
 SDL_Event event;
 SDL_Surface* ekran, bmp, img, tmp;
              ekran = SDL_SetVideoMode(GENİŞLİK, YÜKSEKLİK, 0, SDL_HWSURFACE);
 SDL_WM_SetCaption(PENCERE, PENCERE);

 bmp = şekilÜret(200, 100, abo, 0, YÜKSEKLİK/3);
 img = şekilÜret(200, 100, aço, GENİŞLİK/3, YÜKSEKLİK/3);

 tmp = şekilÜret(GENİŞLİK, YÜKSEKLİK, [[0, 0, 100, 0, 5, 18, 0XF0FF0F]], 0, 0);
 SDL_BlitSurface(tmp, null, ekran, null); // zemin şekli

 tmp = şekilÜret(200, 100, alo, GENİŞLİK-200, YÜKSEKLİK/3);

 while (DEVAM) {
   SDL_BlitSurface(bmp, null, ekran, null);
   SDL_BlitSurface(img, null, ekran, null);
   SDL_BlitSurface(tmp, null, ekran, null);

   SDL_Flip(ekran);
   while (SDL_PollEvent(&event)) {
     if(event.type == SDL_KEYUP) {
       if(event.key.keysym.sym == SDLK_ESCAPE) DEVAM = false;  // ESC tuşu
     } else if(event.type == SDL_QUIT) DEVAM = false;  // ALT-F4 tuşu
   }
 }
 SDL_Quit();
}

SDL_Surface* şekilÜret(int w, int h, int[][] param, int gX, int gY) {
 SDL_Surface* img = SDL_DisplayFormat(boşDöndür());
 foreach(p; param) {
   int x = (GENİŞLİK/2) + p[0];
   int y = (YÜKSEKLİK/2) + p[1];
   int r = p[2];
   int len, xofs, ofs;
   int trial, ext_sh, bit_sh = 0x40000000;

   for(int i = 0; i < 2 * r; i++) {
     len = r * r - (r - i) * (r - i);
     if(!p[3]) { // üçgen mi?
       ext_sh = 0;
       bit_sh = 0x40000000;
     }
     while(bit_sh) {
       trial = ext_sh + bit_sh;

       if(trial <= len) {
          len -= trial;
          ext_sh = trial + bit_sh;
       }
       ext_sh >>= p[4];
       bit_sh >>= p[5];
     }
     if(len > ext_sh) ++ext_sh; // yuvarlama

     xofs = x - ext_sh;
     len = ext_sh * 2;

     ofs = (y - r + i) * (img.pitch / 4) + xofs;

     for(int j = 0; j < len; j++) {
       (cast(uint*) img.pixels)[ofs + j] = p[6]; // renk
     }
   }
 }
 return ufaltKes(w, h, img, gX, gY);
}

SDL_Surface* boşDöndür() {
 SDL_Surface* bmp = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, GENİŞLİK, YÜKSEKLİK,
                           0, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
 SDL_SetColorKey(bmp, SDL_SRCCOLORKEY, 0); // Şeffaflaştır...
 return bmp;
}

SDL_Surface* ufaltKes(int w, int h, SDL_Surface* kaynak, int x, int y) {
  SDL_Surface* hedef = SDL_DisplayFormat(boşDöndür());
  SDL_Rect git;
           git.x = cast(short)x;
           git.y = cast(short)y;
  SDL_Rect kes;
           kes.w = cast(short)w;
           kes.h = cast(short)h;
           kes.x = cast(short)(GENİŞLİK - w)/2;
           kes.y = cast(short)(YÜKSEKLİK - h)/2;
 SDL_BlitSurface(kaynak, &kes, hedef, &git);
 return hedef;
}

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

August 23, 2012

Çok hata var biliyorum ama zamanla daha iyi bir hale gelecektir...

Bunlardan biri de dönen yüzeyin genişlik ve yükselik bilgisinin doğru olmaması. Bunun için boşDöndür() işlevini aşağıdaki şekilde değiştirmeliydim:

SDL_Surface* boşDöndür(int w, int h) {
 SDL_Surface* bmp = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, w, h,
                           0, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
 SDL_SetColorKey(bmp, SDL_SRCCOLORKEY, 0); // Şeffaflaştır...
 return bmp;
}

Aslında w, h ve x, y bilgilerini SDL_Rect yapısı ile aktarabilirdik, ne dersiniz? Gerçi bu sefer veri yapısında int türü kullanmadığı için (-bknz. SDL_Rect (http://www.libsdl.org/docs/html/sdlrect.html)) sık sık veri dönüşümü gerekecek. Bu sorun SDL2'de yok...:)

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

August 23, 2012

Alıntı (acehreli):

>

Çok güzel! :) Şekilleri veriyle tarif edişin hoşuma gitti.

Abo, aço, alo olayı mı...:)

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

August 23, 2012

Alıntı (Salih Dinçer):

>

Abo, aço, alo olayı mı...:)

Benim jeton köşeli! Ben hala anlamadım :)

Bence de gayet güzel olmuş. Bu veriler birer dizi olduğuna göre belki nesne yönelimli programlama teknikleri kullanılabilirmiş.

Bu arada Salih'cim madem temel olarak ekrana çizme olanaklarını öğrendin. Bu bilgileri kullanarak ufak bir oyun yapmaya ne dersin.

Bu mesajda resmini gösterdiğim (http://ddili.org/forum/post/7446) tank oyunu gibi bir şey. Burada tankımız sağa sola hareket ettikçe top ve paletler de o yöne dönecek. Ayrıca kullanıcı yön tuşlarına basarak tankı hareket ettirebilecek. Sonra tanklar birbirine ateş edebilecek ve diğer tankı vurduğu zaman puanı artacak. Topun diğer tankı vurup vurmadığını kontrol etmek için çarpışma algılaması kullanacağız. Sonra oyun sahası içinde doğal arazide bulunan engeller olabilir. Biz bunları topla vurduğumuzda bunlar yokolabilir. Aslında biraz basit görünse ve temel çizim işlevlerini kullansa da bir oyun için gerekli her şeyi içinde barındırıyor.

Tabi karakterlerin illa tank olmasına gerek yok. Örneğin buradaki Abo, aço, alo ! (ne demekse :) ) de olabilir.

Hemen yapmaya başlasan iyi olur! Çünkü ben yapmaya başladım bile :-)

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

August 23, 2012

Çok güzel! :) Şekilleri veriyle tarif edişin hoşuma gitti.

Ali

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

August 23, 2012

Evet. :)

Ali

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

August 23, 2012

Sırada planlanmış bir kaç kodlama/makale var, o yüzden sana yetişemeyebilirim ama yapmak isterim. Çünkü bu oyun yapmasıyla gerçekten basit ve zevkli olacağını düşünüyorum. Ancak şu an işin temelinde daha basit (baksana nokta/benek'lere kadar düşmüşüm!) şeyler ile ilgileniyorum. Demiştim ya, amacım oyun yazmak değil...

Ama Allegro'nun SDL'ye avantajlarını merak ediyorum. Aslında kod yazma kolaylığı/imkanlar gibi şeyler göreli. Bunun dışında öyle bir şey yapmalıyız ki (örneğin şurada (http://ddili.org/forum/post/7413) bahsettiğim uygulamayı, herhalde 5 dk. içinde yapabilirsin?) hız, kontrol ve ekran tazelemesindeki kaliteyi gösterebilsek harika olur, ne dersin?

İşte oyun kılıklı uygulama (oyun.d) için hazır kodlar: https://github.com/salihdb/sdl2d/

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

August 24, 2012

Alıntı (Salih Dinçer):

>

Ama Allegro'nun SDL'ye avantajlarını merak ediyorum. Aslında kod yazma kolaylığı/imkanlar gibi şeyler göreli.

SDL uzun yıllar Blizzard gibi dev oyun firmalarında çalışmış Sam Lantinga tarafından kodlanmış bir oyun kütüphanesi. Allegro'da çoğu şey hazır olarak geliyor. Örneğin çizgi, dörtgen, çember çizme vs..

Kod yazma açısından Allegro sanki daha kolay diye düşünüyorum. SDL biraz daha dağınık gibi..

Ama bu programcıdan programcıya değişebilir. Bazı kişiler örneğin çember çizerken kullanılacak algoritmayı bile kendileri kodlamak isteyebilirler. SDL daha alt düzey bir grafik kütüphanesi.

Alıntı (Salih Dinçer):

>

Bunun dışında öyle bir şey yapmalıyız ki (örneğin şurada (http://ddili.org/forum/post/7413) bahsettiğim uygulamayı, herhalde 5 dk. içinde yapabilirsin?) hız, kontrol ve ekran tazelemesindeki kaliteyi gösterebilsek harika olur, ne dersin?

O uygulamayı deneyemedim. Deneyemedim derken tam bu gün deniyordum kotamın sonuna doğru geldiğim için 'mercurial 'ile SDL'i indirirken yarım bıraktım. Ama kısa bir zaman sonra rahatça deneyebilirim.

Sanırım o karadelik aslında bir resim ve biz klavye tuşlarına bastıkça büyüyüp küçülüyor.

Evet, düşündüğüm gibiyse Allegro ile basitçe kodlanabilir.

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

August 24, 2012

Alıntı (erdem):

>

... Bazı kişiler örneğin çember çizerken kullanılacak algoritmayı bile kendileri kodlamak isteyebilirler. SDL daha alt düzey bir grafik kütüphanesi...
İşte ben o programcılardanım. Örneğin şununla hilal (yarım aydan önceki tüm evreleri) çizebiliyorum:

void hilalÇiz(int x, int y, int r, int c,  int o = 0) {
   int len, ofs;
   int offset = o ? o : r/2;
   for(int i = 0; i < 2 * r; i++) {
       len = cast(int)sqrt(cast(float)(r ^^ 2 - (r - i) ^^ 2));
       ofs = (y + i) * (ekran.pitch / 4) + r - len + x;

       for(int j = 0; j < len / offset; j++) {
           (cast(uint*) ekran.pixels)[ofs + j] = c;
       }
   }
}

Herhalde Allegro ile iki tane farklı renkte (biri zemin renginde) daire çizmen gerekecek? Zeminde de resim/nesne varsa işler karışacak ve şeffalaştırmak gerekecek...

Dip Not: Yarım aydan sonraki evreler için yardım eden zeki insanlar aranıyor...:)

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