Tam Sürümünü Görmek İçin : tetris oyunu taşı düşürmek -C-
ceycey60
12/06/2008, 16:57
Arkadaşlar öğrenme aşamasında oldugum C dilinde bir testris oyunu yazmak istiyorum ancak sorun şu:
şimdi diyelim ekranda bir kare var,ben bunun yukarıdan aşağıya düşmesini nasıl sağlayacağım ?
bir döngüye alıyorum,delay() fonksiyonu ile de geciktirme yapıyorum ancak kare düşüyormuş gibi den çok ağağı inerek büyüyor
başka bir metodu vs. var mı ,nasıl yapabilirim ??
teşekkürler
acehreli
12/06/2008, 20:08
Asagi iniyorsa dogru yoldasin demektir. Indirirken bir hata yapiyorsun ve boyutlarini buyutuyorsun. O buyutme hatasini duzeltirsen calisir. Ne yaptigini bilmeden baska ne soyleyebiliriz ki... :)
Ali
ceycey60
12/06/2008, 20:21
yani testriste taşların aşağıya inmesini istiyorum,mesela bir karenin (rectangle() ile oluşturulmuş) nasıl ağağıya ineceğini merak ediyorum ??
bunu nasıl yapabilirim ???
acehreli
12/06/2008, 21:29
Belki de hosuna gitmeyecek bir cevap: C'de ekran diye bir kavram olmadigi icin senin hangi kutuphaneyi kullandigini bilemiyoruz. Eger bir kutuphane kullaniyorsan, ekrana cizdirmek icin satir ve sutun bilgisini aliyordur. Her seferinde bir fazla satir degeri ile cizdirebilirsin.
Eger ekrani printf'le tekrar tekrar ciziyorsan, blogu bir alt satira kaydirmak icin ondan once bir tane bos satir yazdirabilirsin.
Ali
ceycey60
12/06/2008, 21:30
Kodlar şunlar,graphic.h'ı include ettim,TURBO C de yazıyorum
#include <stdio.h>
#include <graphics.h>
int main() {
int i=0;
int driver,mode;
int hata=0;
driver=DETECT;
initgraph(&driver,&mode,"C:\\TC\\BGI");
hata=graphresult();
if(hata != 0) {
printf("grafik hatasi : %d",hata);
exit(1);
}
for(i=0;i<100;i++) {
system("cls");
rectangle(20,80,250,125);
delay(9999*9999*9999999*99999999999999999999999999 9999999999999);
}
getch();
closegraph();
return 0;
}
acehreli
12/06/2008, 21:46
O kutuphaneyi tanimiyorum ama dongu icinde rectangle'i her seferinde degisik satir bilgisiyle cagirman gerekiyor. Eger rectangle capraz iki noktanin koordinatlarini aliyorsa, soyle bir sey deneyebilirsin:
rectangle(satir, sutun, satir + yukseklik, sutun + genislik);
Senin durumunda sanirim soyle:
satir: i
sutun: 80
yukseklik: 230?
genislik: 105?
Ali
ceycey60
12/06/2008, 22:13
aslında rectangle()'nin bir dikdörtgen halinde aşağıya düşmesi gerekiyor
acehreli
12/06/2008, 23:15
Evet. :)
Ali
bgidemo.c de şekillerin hareket etmesini gösteren örnek te vardı yanlış hatırlamıyorsam
onu incele
bir de tavsiyem eğer oyun yazmaya niyetliysen Borlandın eski kütüphanesiyle uğraşma
mesela Allegro kullanmayı öğren 2D oyunlar için gayet kullanışlı
http://www.talula.demon.co.uk/allegro/
http://www.allegro.cc/
BetulSahin
16/06/2008, 15:12
aslında rectangle()'nin bir dikdörtgen halinde aşağıya düşmesi gerekiyor
Bencede bir dikdörtgen halinde aşağı düşmesi lazım:mad:.
Aynı şeyi windows altında yapmaya çalışıyorum.
Kabaca şöyle anlatiym yaptıklarımı:
......
WM_PAINT:
......
Rectangle(hdc,rect.left,rect.top+j,rect.right,rect .bottom+j);
....
WM_TIMER:
j += 50; // 50 dikdörtgenin genişliği
InvalidateRect();
Bu şekilde yaptıgımda dikdörtgen asagiya dogru iniyor .Fakat önceki çizilen dikdörtgenlerde kalıyor.Ben önceki çizimlerin kalmasını istemiyorum.Sadece hareket eden dikdörtgen görünsün istiyorum.
Ne yapabilirim ?
uygulamanıza göre değişir...
eğer arka planda bir şey yoksa ve sadece çizgiyle dikdörtgen çiziyorsanız.
çizgi için Xor layarak çizme seçenekleri oluyor. onu kullanarak çizin. dikdörtgeni aynı koordinata ikinci kez çizdiğinizde silinmiş oluyor ! sonra yeni koordinata çizin
yada böyle birşey yapabilirsiniz
1) Çizim yapacağınız alanı hafızaya alın.
2) Dikdörtgeni çizdirin.
3) Hafızaya aldığınız Arka planı ekrana yerleştirin - Dikdörtgen silindi -
4) Dikdörtgen için yeni alan hesapla
5) Goto 1 !
VanlochMonster
17/06/2008, 12:42
işlem şu,
Dikdortgeni ciz, kaydır koordinatları, sil tekrar ciz, kaydır,sil tekrar ciz. Bu işlemi efektif hale getirmek icin double buffering diye bir kavram var, hızı artırmak ve flicker denilen seyi engellemek icin (bazı pencereleri tasırken mesela surekli cizer onu ve istenmeyen bir goruntu olur, sanki cok goz kırpıyorsun gibi). İki tane sayfa var diye dusun birinci sayfayı sistem cizerken, ikinci sayfayı sen dolduruyorsun birinci sayfa bitti, ikincine gecmen gerekiyor, hop karsında.
Eğer sorun dikdortgense, InvalidateRect diye birseyler vardı hatırladığım kadarıyla Windows API de, bir de Keith Rule un CMemDC gibi bir sınıfı vardı onceden kullanmıştım, codeproject te araştır.
OpenGL kullanabilirsiniz bu arada, GLUT + OpenGL veya Windows API + OpenGL bu isi hayli hayli cozecektir. Hatta OpenGL Super Bible kitabının ilk orneklerinden biri bir dikdortgeni oklarla sağa sola goturmektir bir bak derim.
Hatırladığım kadarıyla kaynak kodu açık bir tetris oyunu bile bulabilirsin :)
Bekir.
neden ekranı tümden silmiyorsunuz ?
BetulSahin
17/06/2008, 15:01
Kodum çalışıyor şuan ,daha önce niye çalışmadıgını anlıyabilmis değilim .
Sanırım bilgisayarın fazla ısınmasında felan kaynaklanıyodu.
Cevaplar için teşekkürler yinede.
Forum Yazılımı : vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.