Perşembe, Kasım 05, 2009

Allegro Örnek Program-2

Allegro örneklerine devam ediyoruz. Bu seferki programımız ileride yapacaklarımız için bir başlangıç olması açısından son derece önem teşkil etmekte. Hemen programdan bahsetmeye başlayalım.

Bazı noktalara değinmek istiyorum önce. Allegro da "set_gfx_mode (GFX_AUTODETECT, 640,480,0,0);" kodu ekranı yatayda 640 dikeyde 480 pixel olacak şekilde böler. Bu sayede çok hassas hareketler yapma şansımız olur. Ancak çok fazla hassaslık delikanlıyı bozar :P deyip ben ekranı 20*20 lik karelere böldüm. Programı çalıştırdığınızda ekranda göreceğiniz kare bu sayede her hareketinde 20 pixellik ilerler.

24x32 lik bir dizi oluşturdum ve bunu harita olarak kullandım. Buradaki 24 ve 32 rasgele seçilmiş rakamlar değildir dikkatinizi çekerim. 480 ve 640 ın 20 ye bölümünden elde edilen sonuçlardır bunlar.

Dikkatiniz çekmek istediğim diğer noktada diziyi oluştururken 32x24 değilde 24x32 şeklinde oluşturmuş olmam. 640 yatay ekseni 480 ise dikey ekseni temsil eder. Yani 640 sutun 480 satır şeklinde aklımızda tutabiliriz bunu. Bu yüzden diziyi 24 satır 32 sutun olacak şekilde oluşturdum.

#include <allegro.h>

BITMAP *buffer;
int x=10,y=10;
int tutX=10,tutY=10;

int harita[24][32]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};

void haritaCiz()
{
for (int i =0;i<24;i++)
{
for (int k = 0; k<32;k++)
{
if (harita[i][k] == 0)
rectfill(buffer,k*20,i*20,(k+1)*20,(i+1)*20,makecol(255,0,0));
if (harita[i][k] == 1)
rectfill(buffer,k*20,i*20,(k+1)*20,(i+1)*20,makecol(0,0,255));
}
}
}
void hareketEt()
{
tutX = x;
tutY = y;
clear_keybuf();

if (key[KEY_UP])
{
if ((y*20)>0 && harita[y-1][x]!=0)
y--;
}
else if(key[KEY_DOWN])
{
if ((y*20)<460 && harita[y+1][x]!=0)
y++;
}
else if (key[KEY_LEFT])
{
if ((x*20)>0 && harita[y][x-1]!=0)
x--;
}
else if(key[KEY_RIGHT])
{
if ((x*20)<620 && harita[y][x+1]!=0)
x++;
}

acquire_screen();
rectfill(buffer,tutX*20,tutY*20,(tutX+1)*20,(tutY+1)*20,makecol(0,0,255));
rectfill(buffer,x*20,y*20,(x+1)*20,(y+1)*20,makecol(0,255,0));
draw_sprite(screen,buffer,0,0);
release_screen();
rest(100);
}

int main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT,640,480,0,0);

buffer = create_bitmap(640,480);

haritaCiz();

while(!key[KEY_ESC])
{
hareketEt();
}
return 0;
}

END_OF_MAIN();

3 yorum:

Mehmet Emin KORKUSUZ dedi ki...

Sayın Esat hocam Allegro'da bir sürü makro var. END_OF_MAIN() gibi. Bunlar neden kullanılıyor bir bilginiz var mı?

Esat ARSLAN dedi ki...

Sevgili Emin hocam :)) diğer makrolar hakkında bilgim yok lakin END_OF_MAIN()'nin main bloğunu ezmek için kullanıldığını okumuştum. Sanırım allegronun farklı platformlarda çalışabilmesi için böyle bir şeye ihtiyaç duymuşlar. Diğer makrolarda bunun için olabilir.

Esabil Ateş dedi ki...

merhaba hocam bende forda hata var diyor nedeneni ni anlamadım ne sorun ola bilir acaba