top oyunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

top oyunu

Mesaj gönderen naturelmania »

Kod: Tümünü seç

procedure TForm2.Timer1Timer(Sender: TObject);
begin


begin
if dikeyyon1.Caption='-' then shape1.Top:=shape1.Top-10;
if dikeyyon1.Caption='+' then shape1.Top:=shape1.Top+10;
if yatayyon1.Caption='-' then shape1.left:=shape1.left-10;
if yatayyon1.Caption='+' then shape1.left:=shape1.left+10;
if shape1.Top<0 then dikeyyon1.Caption:='+';
if shape1.Left<0 then yatayyon1.Caption:='+';
if shape1.top+shape1.Height>form2.Height then dikeyyon1.Caption:='-';
if shape1.Left+shape1.Width>form2.Width then yatayyon1.Caption:='-';
end;
begin
if dikeyyon2.Caption='+' then shape2.Top:=shape2.Top+10;
if dikeyyon2.Caption='-' then shape2.Top:=shape2.Top-10;
if yatayyon2.Caption='+' then shape2.left:=shape2.left+10;
if yatayyon2.Caption='-' then shape2.left:=shape2.left-10;
if shape2.Top<0 then dikeyyon2.Caption:='+';
if shape2.Left<0 then yatayyon2.Caption:='+';
if shape2.top+shape2.Height>form2.Height then dikeyyon2.Caption:='-';
if shape2.left+shape2.width>form2.width then yatayyon2.Caption:='-';

    end;
    begin
if dikeyyon3.Caption='+' then shape1.Top:=shape1.Top+10;
if dikeyyon3.Caption='-' then shape3.Top:=shape3.Top-10;
if yatayyon3.Caption='+' then shape3.left:=shape3.left+10;
if yatayyon3.Caption='-' then shape3.left:=shape3.left-10;
if shape3.Top<0 then dikeyyon3.Caption:='+';
if shape3.Left<0 then yatayyon3.Caption:='+';
if shape3.top+shape3.Height>form2.Height then dikeyyon3.Caption:='-';
if shape3.Left+shape3.Width>form2.Width then yatayyon3.Caption:='-';
    end;
    begin
      if dikeyyon4.Caption='+' then shape4.Top:=shape4.Top+10;
if dikeyyon4.Caption='-' then shape4.Top:=shape4.Top-10;
if yatayyon4.Caption='+' then shape4.left:=shape4.left+10;
if yatayyon4.Caption='-' then shape4.left:=shape4.left-10;
if shape4.Top<0 then dikeyyon4.Caption:='+';
if shape4.Left<0 then yatayyon4.Caption:='+';
if shape4.top+shape1.Height>form2.Height then dikeyyon4.Caption:='-';
if shape4.Left+shape1.Width>form2.Width then yatayyon4.Caption:='-';
    end;
    end;
end.
elimdekii topları oyatıyorum ama bunların birinin içinden geçiyolar. amacım bunların birbiri ile çarpışması nasıl yapabilirim acaba ?
yardım için teşekkür ederim
herkese kolay gelsin
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Çarpışma kontrolü için iki yöntem var.
1-Cisimlerin etrafında bir dikdörtgen olduğu varsayılır.
Bu dikdörtgenlerin ortak kısımlarının olup olmadığı kontrol edilir, ki bu kolaydır.

x'i küçük olan bulunur. buna x1 diyelim, diğeri x2 olsun.
x1'in genişliği g olsun.
y'si küçük olana y1, diğerine y2 diyelim. y1'in yüksekliği h olsun.

x2<x1+g ve y2<y1+h ise cisimler çarpışmıştır...
Bu yöntem son derece kötüdür, yazıklar olsundur...
iki çemberin çarpışma kontrolünü bu şekilde yaptığınızı düşünün...
bunları çevreleyen dikdörtgenlerin köşeleri kesiştiğinde çemberler kesişmemiş olabilir.

2-Cisimlerin her bir noktası kaydedilir.
Bu noktalar tek tek karşılaştırılır.
Aynı noktadan iki cisimde de varsa, cisimler kesinlikle çarpışmıştır.

Peki ilk kontrolü neden anlattım? ilk kontrole göre kesişmemiş olan cisimler kesinlikle kesişmemiştir. Bu nedenle ikinci fonksiyon kullanılmadan önce ilk fonksiyona bakılarak hız kazanılabilir.

Kolay gelsin...
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

teşekkürler ulu coder ama bilgim yok cahilliğimi bağışla ben bunları peki nasıl kayıt altına alabilirim acaba kısa bir örnekle açıklayabilirmisin...
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Estağfirullah, ne cahilliği...
Bu aklıma gelen bir yöntem, kod olarak hiç düşünmedim, ilk kez düşünüyorum;

iki boyutlu dizi tanımlayın. değişken uzunluklu, boolean olsun.
(Kayıt alma işlemini bir kez yapın ki bilg. fazla yorulmasın)

diziyi en, boy olarak boyutlandırın.
iç içe iki döngüyle bütün noktaları tarayın.
eğer noktanın rengi MaskColor'dan farklıysa(yani varsa), dizinin o elemanı True olsun, değilse false olsun.

Karşılaştırm yapacağınız zaman, yine iki cismin bütün noktalarını tarayın.
if (Eleman1[x1,y1]) and (eleman2[x2,y2]) durumu bir kez doğrulanırsa çarpışmışlardır.
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

ya kısa bi kodunu yazarmısın nasın sana zahmet
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

yazabilcek olsam oyunlarımı delphi'de yazarım :)
Bunları sana, yola çıkış noktan olsun diye anlattım.
DelphiX diye bi şey var, içinde türlü bileşenler var.
Onlardan birinde 'çarpışma fonksiyonu' var deniyordu.
Ben bulamamıştım, sen bulabilirsin belki.

(vaktim olsa yazardım)
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

"Collision Detection" diye aratırsan pek çok sonuca ulaşabilirsin
ama gördüğüm kadarıyla shape kullanmışlsın stCircle olarak kullandıysan

çemberlerin merkezleri arasındaki mesafeyi hesaplayıp çemberlerin yarıçaplarının toplamıyla karşılaştır, mesafe eğer küçük veya eşitse çarpışma var büyükse çarpışma yoktur

Kod: Tümünü seç

Şekil            Yarı çap        merkez X     merkez Y
Çember1        r1                Mx1                My1
Çember2        r2                Mx2                My2


merkezler arası mesafe d


d=( (Mx1-Mx2)^2  + (My1-My2)^2 )^½         
 
if d <= (r1+r2) çarpışma var ...

Merkez X =Shape.Left + r
Merkez Y =Shape.Top + r

Shape.Width= 2*r
Shape.Height= 2*r olmalı
Cevapla