Yazılım

C’de şekilleri hareket ettirme

OCAK 14, 2012

Dev C++’ın graphics.h kütüphanesini kullanarak yapılan projelerle ilgili çok soru geldiği için bir kaç makale daha yayınlamaya karar verdim.

Oyunlarda en çok lazım olan şey nesnelerin hareketliliğidir. C’de ise hareketliliği şekillerin koordinatlarını azaltarak ya da artırarak yapabiliriz. Mesela bir karemiz olduğunu düşünün bunun hareket etmesini istiyorsunuz bu durumda x veya y koordinatlarını artırarak ya da azaltarak yapabiliriz.

Bunu yaparken iki sorunumuz oluşacaktır.

Birincisi diyelim ki karemiz sol üst koordinatı 0,0 (x,y) ve sağ alt koordinatı da 20,20(x,y) olsun. Biz bu karemizi sağ tarafa doğru 10’ar 10’ar kaydırmak istediğimizde program şöyle çalışacaktır:

Sağa doğru hareket ettirmek istiyorsak bu durumda y koordinatlarını sabit, x koordinatlarını artırmamız gerekir. Sol üst koordinatı 0,0 (x,y) ve sağ alt koordinatı 20,20 (x,y) olan bir kare x koordinatını 10 artırdığımız için sol üst koordinatı 10,0 ve sağ koordinatı 30,20 olan bir kare çizecektir ve bunları çizerken işlemcimiz çok hızlı çalıştırdığı için hareketi göremeyeceğiz. Eğer biz koordinatımızı artırırken bir önceki çizilmiş olan kareyi zemin renge boyarsak bir önceki silinmiş gibi görünecek ve yeni bir kare oluşacağı için hareket ettiğini düşüneceğiz.

İkinci sorunumuz ise işlemcilerimiz hızlı olduğu için yine hareket olayını göremeyeceğiz. Komutları bekleterek görmemizi sağlayabiliriz bunu da C’deki delay() komutumuzla yapacağız. delay() komutu parametre olarak içerisine milisaniye almaktadır. Bu komutu kullanarak bekletmek istiyorsak bekletebileceğiz ve böylece hareketliliği gözlemleme şansımız olacak.

Aşağıdaki örnekte bir karemiz var beyaz renkli ve arka planımız siyah. for döngüsüyle 10 kez sağa doğru ilerlemesini sağlıyoruz.

#include <conio.h> 
#include <graphics.h>
int main() {
int i;
initwindow(600,400);
for(i=0;i<10;i++)
{
setcolor(BLACK);
rectangle(20+(i*10),20,40+(i*10),40);
rectangle(20+((i+1)*10),20,40+((i+1)*10),40);
delay(500); // isterseniz 500’ü artırıp daha yavaş
//hareket ettirebilirsiniz.
}
getch();
closegraph();
return 0;
}

Örneğimizi biraz daha geliştirelim. Aşağıdaki örnekte ise yine bir beyaz karemiz var ve klavyeden sağ, sol, aşağı ve yukarı oklara basıldığında kare ona göre hareket ediyor. Esc'e basıldığında ise program kapanıyor.

#include<conio.h>
#include<graphics.h>

int main()
{
int x1=20,y1=20,x2=40,y2=40,i;
int ek=30;
char tus;
initwindow(600,400);
setcolor(WHITE);
rectangle(x1,y1,x2,y2);
while(1)
{
tus= getch();
if(tus==27) exit(0);
else
{
setcolor(BLACK);
rectangle(x1,y1,x2,y2);
if(tus==77)
{ x1+=ek;
x2+=ek;
}
else if(tus==75)
{
x1-=ek;
x2-=ek;
}
else if(tus==72)
{
y1-=ek;
y2-=ek;
}
else if(tus==80)
{
y1+=ek;
y2+=ek;
}
setcolor(WHITE);
rectangle(x1,y1,x2,y2);
}

}
closegraph();

return 0;
}

Burada getch(); ile klavyeden karakter okuyoruz ve karakterin ascii değerini tus değişkenine atıyoruz. Daha sonra da karşılaştırıp ona göre gerekli koordinatların değerlerini artırıyor ya da azaltıyoruz.

ESC'nin ascii karşılığı 27,

yukari ok-↑---72,

Sola ok---←---75,

Saga ok--→---77,

Asagi ok--↓---80


Gerisi sizin hayal gücünüze kalmış. :)


Projenin derlenmiş halini indirebilirsiniz: Dev C++’ta nesne hareket ettirme. Projeyi açarken rar’dan çıkarttıktan sonra Project1.dev dosyasından açın.

Ayrıca şunlara da bakabilirsiniz:

Dev C++’da resim ekleme
Dev C++’a graphics.h ekleme
Dev C++’da mouse hareketleri

Kolay Gelsin


Sefa Çetinkaya 14.1.2012
Emeğinize sağlık sizi takip etmeye devam ediyoruz
emre 8.3.2012
ilknur hanım çok beğendim makalenizi, gerçekten çok faydalı çok işime yaradı birkaç gündür uğraştığım birşeydi.
ilknur 15.10.2012
Makaleyi düzenlerken bir aksilik oluşmuş.. Teşekkürler uyarınız için düzeltiyorum hemen :)
kadir gürbüz 28.11.2012
merhaba graphisc.h kütüphanesine müzik eklenebiliyormu acaba bilginiz varmı yardımcı olursanız sevinirim şimdiden teşekkürler.
ilknur 28.11.2012
Müzik eklenebilir tabi fakat bildiğim kadarıyla graphics.h kütüphanesi müziği desteklemiyor bunun yerine libwinmm.a dosyasını bulman ve mmsystem.h kütüphanesini kullanman gerekiyor. mciSendString("şarkının_adresi",NULL,0,NULL); komutuyla da çağırabilirsin.
efsun ozan 19.3.2013
merhaba ilknur hanım öncelikle makaleniz çok teşşekkür ederim.benmde proje ödevimde jingo yazmam gerek.ama kutucukları nasıl mouse la aşağı yukarı kaydıracağım konusunda takılıp kaldım.yardımcı olursanız çok sevinirim..
ilknur 28.3.2013
Merhaba
Kusura bakmayın yorumunuzu biraz geç görüyorum. While(1) döngüsü içerisinde sürekli mouse'ın koordinatlarını alıp yeni koordinatlara göre kutunun yerini çizdirebilirsin. Çizdirmeden önce cleardevice() komutu ile ekranı temizlemeyi unutma :) Umarım yardımcı olabilmişimdir.
İyi Çalışmalar
hamzaoztas 9.4.2013
merabalar, çalışmalarınız için çok çok teşekkürler, çok faydalı oldu, çalışmalarınızın devamını diliyorum.

POPÜLER İÇERİK

C/C++ da oyun yazmak ya da grafik kütüphanesiyle ilgili birşeyler yapmak istiyorsanız: Öncelikle iki dosyaya ihtiyacınız var bunlardan biri libbgi.a dosyası buradan indiriniz. Diğer graphics.h dosyasını ise buradan indiriniz.

OCAK 24, 2011 - 78 YORUM

Dev-C++ Derleyicisine graphics.h Kütüphanesini Ekleme