çarpışan toplar

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
magnitude
Üye
Mesajlar: 2
Kayıt: 03 Tem 2007 01:32

çarpışan toplar

Mesaj gönderen magnitude »

Kod: Tümünü seç

procedure TForm1.Timer1Timer(Sender: TObject);
var
A,B,e,f:integer;
begin
A:=RANDOM(3);
B:=RANDOM(3);
e:=RANDOM(3);
f:=RANDOM(3);
begin
if shape1.left=form1.Left
then
shape1.left:=shape1.Left-A
else shape1.left:=shape1.Left+A;

if shape1.top=form1.top
then
shape1.top:=shape1.top-B
else shape1.top:=shape1.top+B;
if shape1.Top<0 then dikeyyon.Caption:='+';
if shape1.Left<0 then yatayyon.Caption:='+';
if shape1.Top>410 then dikeyyon.Caption:='-';
if shape1.Left>552 then yatayyon.Caption:='-';
if shape1.Top=shape2.top then shape1.Top:=shape1.Top+10;
if shape1.Left=shape2.left then shape1.left:=shape1.Left+10;


if dikeyyon.Caption='+' then shape1.Top:=shape1.Top+10;
if dikeyyon.Caption='-' then shape1.Top:=shape1.Top-10;
if yatayyon.Caption='+' then shape1.left:=shape1.left+10;
if yatayyon.Caption='-' then shape1.left:=shape1.left-10;
end;
end;
Kodları bizim forumdan yola çıkarak yapmaya çalıştım ve bu koda göre iki shape nesnesi birbiri ile çarpışmasını istiyorum.İki shape nesnesinin top yada left öz birbirine eşit olunca sorun yok farklı yönlere gidiyolar benim shape nesnelerim 17*17 ebatlrında eğer top yada left özellikleri birbirine eşit olmaz ise toplar birbirinin içinden geçerek yollarına dewam ediyolar bense çarpışmalırını ve farklı yönlere gitmelerini istiyorum umarım anlatabilmişimdir
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
çarpışmada kontrolu sadece left=left ve top=top şeklinde yaptığınız için sadece onları kontrol ediyor. = yerine aralık belirtirseni istediğiniz gibi olacaktır.
tabi aralığı yönlerine göre vermenizde lazım.
mesala shape 1 in sağa doğru gittiğini varsayalım.
kontrol ederken shape1 in sağ çizgisini kontrol etmen lazım.
(shape1.left+shape1.width ) bu çizgi ile shape 2 nin leftini kontrol etmen lazım

Kod: Tümünü seç

if ((shape1.left+shape1.width)>=(shape2.left)) and
   ((shape1.left+shape2.width)<(shape2.left+shape2.width)) then
begin
  //burda shape 1 sağa doğru giderken sahpe 2 nin soluna çarptığını tespit ettik. ancak [b]top[/b] larınıda kontrol etmek lazım.
  if ((shape1.top)<(shape2.top+shape2.heigth)) and
     ((shape1.top)>=(shape2.top)) then
  begin
     //burda bi çarpışma var.
  end;
  
end;
bu şekilde kontroller koyman lazım.
kodlar tam çalışmayabilir şuan kafadan yazdım ama bu tarz bir karşılaştırma yapman lazım.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Nesnelerin collision detection and response konusu gercekten daha ayrintili bir konudur. Basit $eyler degil de daha komplex $eylerin hesaplanmasinda matrisler ve vektörler kullanilmaktadir..
Collision detection icin bir kac tane algoritma var.

1. Bounding Sphere (Girintili cikintili, veya daire seklinde, yani bir küp'ün tam fit olamadigi onun yerine bir dairenin nesneyi tam olarak bosluklarini kapatabilecegi sekilde cevreleyebilen nesneler icin)

Shape'in etrafini en iyi sekilde bir daire yerlestirilebiliyorsa, collision detection kismini yerlestirilen nesnelerin yaricaplarina bakarak anlayabilirsiniz.

Yani eger, 1. Nesne yaricapi: 15cm, 2. esne yaricapi 15cm olursa,

(1. Dairenin Pozisyon vektörü + 1. Dairenin yaricapi) - (2. Dairenin pozisyon vektörü + 2. Dairenin yaricapi) = 0 ise collision vardir, degilse collision yoktur.

2. Bounding Box (Basit, girintisi cikintisi cok fazla olmayan nesneler icin)

Shape'in etrafina fit olacak sekilde bir küp yerlestirilir,

Eğer 2. nesnenin pozisyon vektörü,

Box'in max X inden büyükse collision YOK
Box'in min X inden kücükse collision YOK
Box'in max Y sinden büyükse collision YOK
Box'in min Y sinden kücükse collision YOK
Box'in max Z sinden büyükse collision YOK
Box'in min Z sinden kücükse collision YOK
Bunlarin hic biri degilse Collision var..

Collision detection cok da komplex bir konu degil, ancak response kismina gelince sanirim oturup fizik kitaplarini karistirmakta fayda var. Cünkü eger nesneler carpistiktan sonra gidecekleri yon gercekci olmasi isteniliyorsa kafaniza göre $uraya git buraya git $eklinde degerler vermeniz pek dogru olmaz.

Bu dediklerim 3 boyutlu ve gercekci ortamlarda gecerli seyler, tabi daha basit seyler yapmak istiyorsaniz gecici cözümlerin kullanilmasinda zarar yoktur sanirim...

Umarim faydali olabilmistir. Iyi calismalar, kolay gelsin.
Cevapla