2010-11-20 23 views
2

Merhaba çarpmayacak ekle aşağıdaki HTML5 Canvas uygulaması var: Eğer etrafında fare topları etrafında hareket etmesine sebep olacaktır taşıdığınızda http://dev.driz.co.uk/app/HTML5 Canvas

, sorun ancak topları birbirlerine tepki kalmamasıdır . Bunun yerine sadece birbirlerinin üzerinden geçiyorlar.

HTML5 Canvas için bazı çakışma algılama bilgilerini arıyorsunuz.

Teşekkürler.

+1

olası yinelenen [Topu Çarpışma için top - Algılama ve Taşıma] (http: // stackoverflow.com/questions/345838/ball-to-ball-collision-detection-and-handling) –

+0

HTML5 Canvas için herhangi bir JavaScript örneğini biliyor musunuz? Şimdiye kadar – Cameron

+0

güzel bilardo oyunu. Senin topları bazen ara sıra garip bir davranış sergilediğini fark ettim. garip davranış: toplar birbirine yapışır ve birbirinin etrafında dönerler. Bazen birbirlerinden uzaklaşırlar, ama genellikle sadece sıkışırlar. Bunun neden olacağını biliyor musun? Ben bir matematik wiz değilim, aksi takdirde daha fazla yardımcı olurum :) –

cevap

1

Herkese merhaba. Bunu zaten bulduğunuzdan emin değilsiniz ama tuvalette bilardo oyunu oluşturma aşamasındayım. Toplarımın çarpışma tespiti/kullanımı aşağıdaki gibidir. Şu anda trig kullanıyor ancak bunun yerine bazı vektör matematiği kullanılarak optimize edilebilir. Neyse, eylem onunla ilerleme görebilirsiniz ->here

Bu döngü benim hareketlendirmek işlevinde çalıştırır:

// checks if the any of the balls have collided with each other 
for(i=0;i<ballArray.length;i++) 
{ 
    for(j=i;j<ballArray.length;j++) 
    { 
     if(j != i) 
     { 

      if(Math.pow((ballArray[j].x - ballArray[i].x),2) + Math.pow((ballArray[j].y - ballArray[i].y),2) <= (ballArray[i].radius + ballArray[j].radius) * (ballArray[i].radius + ballArray[j].radius)) 
      { 
       dx = ballArray[i].x - ballArray[j].x; 
       dy = ballArray[i].y - ballArray[j].y; 
       // collision angle is often refered to as the greek character 'phi' 
       phi = Math.atan2(dy, dx); 

       magnitude_1 = Math.sqrt(ballArray[i].vx * ballArray[i].vx + ballArray[i].vy * ballArray[i].vy); 
       magnitude_2 = Math.sqrt(ballArray[j].vx * ballArray[j].vx + ballArray[j].vy * ballArray[j].vy); 

       direction_1 = Math.atan2(ballArray[i].vy, ballArray[i].vx); 
       direction_2 = Math.atan2(ballArray[j].vy, ballArray[j].vx); 

       new_xspeed_1 = magnitude_1 * Math.cos(direction_1 - phi); 
       new_yspeed_1 = magnitude_1 * Math.sin(direction_1 - phi); 

       new_xspeed_2 = magnitude_2 * Math.cos(direction_2 - phi); 
       new_yspeed_2 = magnitude_2 * Math.sin(direction_2 - phi); 

       final_xspeed_1 = ((ballArray[i].mass - ballArray[j].mass) * new_xspeed_1 + (ballArray[j].mass + ballArray[j].mass) * new_xspeed_2)/(ballArray[i].mass + ballArray[j].mass); 
       final_xspeed_2 = ((ballArray[i].mass + ballArray[i].mass) * new_xspeed_1 + (ballArray[j].mass - ballArray[i].mass) * new_xspeed_2)/(ballArray[i].mass + ballArray[j].mass); 

       final_yspeed_1 = new_yspeed_1; 
       final_yspeed_2 = new_yspeed_2; 

       ballArray[i].vx = Math.cos(phi) * final_xspeed_1 + Math.cos(phi + Math.PI/2) * final_yspeed_1; 
       ballArray[i].vy = Math.sin(phi) * final_xspeed_1 + Math.sin(phi + Math.PI/2) * final_yspeed_1; 
       ballArray[j].vx = Math.cos(phi) * final_xspeed_2 + Math.cos(phi + Math.PI/2) * final_yspeed_2; 
       ballArray[j].vy = Math.sin(phi) * final_xspeed_2 + Math.sin(phi + Math.PI/2) * final_yspeed_2; 
      } 
     } 
    } 
} 
ait
İlgili konular