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. ]