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
Ç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.
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.
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.
"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
Ş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ı