Merhaba,
Bu hafta bir MVC olayını öğrenelim, ne dersiniz? Lütfen herkes katılım sağlasın; fikir katkısı olsa bile. Böylece hepimiz daha çok şey öğrenip bilginin büyümesine şahit olacağız...:)
Geçen hafta şurada (http://ddili.org/forum/post/7331) değindiğimiz için bir kaç küçük hazırlık yaptım. Bugüne kadar D'de MVC denemesi yapamıyordum. Çünkü SDL'yi tanımamıştım ama şimdi istediğimiz amaç (Model) doğrultusunda çevre birimleri dahil (Control) ederek işlem sonucunu ekrana (View) verebileceğiz. Bunun için aşağıdaki gibi basit bir örnek hazırladım:
import std.math, sdl;
immutable sahneGenişliği = 640;
immutable sahneYüksekliği = 480;
immutable çerçeveKalınlığı = 40;
immutable yuvarlakÇapı = 21;
int main(){
scope (exit) { // sahneBitir
SDL_Quit();
printf("-YAZILIM HATASIZ SONLANDI-\n");
printf("Hadi yine iyisin...:)\n");
}
// Yuvarlağın konumu
double nXkonumu = sahneGenişliği /2;
double nYkonumu = sahneYüksekliği/2;
// Yuvarlağın ivmesi
double nXivmesi = 0;
double nYivmesi = 0;
// sahneKur
SDL_Surface* sahne = SDL_SetVideoMode(sahneGenişliği, sahneYüksekliği, 0, 0);
int beyaz = SDL_MapRGB(sahne.format, 0xff, 0xff, 0xff);
SDL_Rect rect;// = new SDL_Rect();
rect.w = cast(ushort)(sahneGenişliği - çerçeveKalınlığı);
rect.h = cast(ushort)(sahneYüksekliği - çerçeveKalınlığı);
rect.x = cast(short)(sahne.w-rect.w)/2;
rect.y = cast(short)(sahne.h-rect.h)/2;
SDL_FillRect(sahne, &rect, beyaz);
SDL_UpdateRect(sahne,0,0,sahne.w,sahne.h);
SDL_Event event;
bool solTuş, sağTuş, üstTuş, altTuş;
// sonsuz döngü
while (true) {
// nesneÇiz
if(circleFill(sahne, cast(int)nXkonumu,
cast(int)nYkonumu, yuvarlakÇapı, 0)) {
SDL_Flip(sahne);
}
while (SDL_PollEvent(&event)) {
if(event.type == SDL_KEYDOWN) {
switch(event.key.keysym.sym) {
case SDLK_LEFT : solTuş = true; break;
case SDLK_RIGHT : sağTuş = true; break;
case SDLK_UP : üstTuş = true; break;
case SDLK_DOWN : altTuş = true; break;
default : break;
}
} else if(event.type == SDL_KEYUP) {
switch(event.key.keysym.sym) {
case SDLK_ESCAPE : return 0;
case SDLK_LEFT : solTuş = false; break;
case SDLK_RIGHT : sağTuş = false; break;
case SDLK_UP : üstTuş = false; break;
case SDLK_DOWN : altTuş = false; break;
default : break;
}
} else if(event.type == SDL_QUIT) return 0;
} // tuş döngüsü
} // sonsuz döngü
} // program sonu
bool circleFill(SDL_Surface* gScreen, int x, int y, int r, int c) {
for (int i = 0; i < 2 * r; i++) {
if ((y - r + i) >= 0 && (y - r + i) < sahneYüksekliği) {
int len = cast(int)sqrt(cast(float)(r * r - (r - i) * (r - i))) * 2;
int xofs = x - len / 2;
if (xofs < 0) {
len += xofs;
xofs = 0;
}
if (xofs + len >= sahneGenişliği) {
len -= (xofs + len) - sahneGenişliği;
}
int pitch = gScreen.pitch / 4;
int ofs = (y - r + i) * pitch + xofs;
for (int j = 0; j < len; j++) {
(cast(uint*)gScreen.pixels)[ofs + j] = c;
}
} // end if()
} // end for()
return true;
}
Tabi burada MVC diye bir şey yok ve düz mantıkla çalışıyor. Yani yuvarlak çizme işlevini (circleFill) saymazsak her şey iç içe girmiş. Amacımız ise ekran ortasındaki topu, yön tuşlarını kullanarak duvara çarptırmak ve aksetmesini gözlemlemek. Gerçi yukarıdaki kod bunu yapmıyor ama hele bir MVC yapımızı oluşturalım devam edeceğiz.
Bu arada Windows kullanıcıları çok şanslılar! DMD hariç bir şey kurmalarına gerek yok. Sadece derlerken şuradaki sembol dosyası (https://github.com/erdemoncel/oyun/blob/master/lib/SDL.lib)na, çalıştırırken ise şu iki dosyaya ihtiyaçları var:
- SDL Kütüphanesi: https://github.com/erdemoncel/oyun/blob/master/bin/SDL.dll
- SDL ilintisi: https://github.com/erdemoncel/oyun/blob/master/src/sdl.d
Başarılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]