Merhaba,
Bir süredir SDL üzerine deneme yapmıyordum. Son günlerde benekleri (pixel) anlamak için denemeleri yoğunlaştırdım. Hala çözemediğim şeyler yanında ilginç gördüklerimi paylaşmak istiyorum. Deneyebilmeniz için de her şey en basite indirdim. İhtiyacınız olan SDL kütüphanesi/ (http://www.libsdl.org/)D ilintileri (http://codepad.org/F6LfnqTy) yanında aşağıdaki 'main()' işlevi:
void main() {
//with(new draw(256, 312)) { /* sınıf ile yapılan kolaylık, yakında...
SDL_Surface* scr = SDL_SetVideoMode(256, 312, 0, SDL_HWSURFACE);
bool DEVAM = true;
while(DEVAM) {
// ... sahnede gösterilecek nesneler ...
SDL_Flip (scr);
//DEVAM = waitAndExit(); /*<--- ilk ESC'de dur, ikincisinde çık
SDL_Event event;
SDL_PollEvent (&event);
if(event.type == SDL_KEYDOWN &&
event.key.keysym.sym == SDLK_ESCAPE) DEVAM = false;//*/
}//} // with()
SDL_Quit();
}
Garip Sistem:
http://img9.imageshack.us/img9/6392/garipsistem.png
Hayır, bu bir dikdörtgen kafa değil...:)
Burada beneklerin rengini sürekli değiştirerek nasıl bir sonuç elde edeceğimi görmek istedim. Süreklilikten kasıt; damlaya damlaya göl olur hesabı, siyah ile beyaz arası meydana gelen sürekli bir değişim demek. Bunu da 'setPixel()' amacıyla kullandığımız işlevin son satırındaki eşitliğe + ekleyerek yaptım: ''*benek' += c;'
Dikkat ederseniz, ekran görüntüsündeki alta kalan içi dolu daire desenli. Çünkü algoritmanın özelliğinden dolayı küçülen çemberlerden üst üste oluşurken boş benekler meydana geliyor. İşle bu boşluklar, sahnenin başlangıcında bulut veya plasma görünümünde bir oluşum meydana getiriyor. Elbette bunu yapmanın daha güzel ve kolay yolları var...:)
Eğer aşağıdaki kodda yer alan gizlenmiş iki küçük bölgeyi de derlemeye dahil ederseniz (bunu yapmak içik tek bir taksim işareti yetiyor) paylaştığım ekran görüntüsüne benzer bir görüntü elde ediyorsunuz. Sanki bu bir gaz/toz bulutu ve kütle çekim etkisiyle iki yıldızlık bir sistem oluşuyor. Renkleri yeşil/sarı...
Alıntı:
>> void circleRGB(int c_x, int c_y, int r, int c = 0xFF0000) {
> void renkArttır(int x, int y, int c = int.max) {
> uint *benek = cast(uint*)scr.pixels + y *
> scr.pitch/4 + x;
> *benek += c;
> }
> int y, x = -r;
> int yeniÇap = 2 - 2 * r;
>
> while(x < 0) {
> r = yeniÇap;
> renkArttır(c_x + y, c_y + x, c); // sağ üst çeyrek yayı
> renkArttır(c_x - x, c_y + y, c); // sağ alt çeyrek yayı
> renkArttır(c_x - y, c_y - x, c); // sol alt çeyrek yayı
> renkArttır(c_x + x, c_y - y, c); // sol üst çeyrek yayı
> if(r <= y) yeniÇap += ++y * 2 + 1;
> if(r > x) yeniÇap += ++x * 2 + 1;
> }
> }
> void garipSistem(int x = 0, int y = 0) {
> //* ZEMİNDEKİ İÇ İÇE OLUŞAN BÖLGE (ekranın yarısı kadar...)
> x = uniform(32, scr.w-32);
> y = uniform(32, scr.h-188);
> foreach(r; 1..32) circleRGB(x, y, r, 1);//*/
>
> /* SOLDAKİ ÇOK KÜÇÜK BÖLGE (neredeyse daire kadar!)
> x = uniform(32, scr.w-160);
> y = uniform(64, scr.h-220);
> foreach(r; 1..32) circleRGB(x, y, r, 1);//*/
>
> /* SAĞDAKİ ÇOK KÜÇÜK BÖLGE (neredeyse daire kadar!)
> x = uniform(160, scr.w-32);
> y = uniform(64, scr.h-220);
> foreach(r; 1..32) circleRGB(x, y, r, 1);//*/
> }
> ```
**Sahnedeki nesneler:**
// desenin bir kopyasını göster
foreach(r; 1..32) circleRGB(scr.w/2, scr.h-64, r);
garipSistem(); // ekşın...:)
-DEVAMI GELECEK-
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]