2013-08-06 116 views
1

我創建了這個相當簡單的JavaScript;球或「分子」在屏幕上移動。我希望增加功能,當一個球與另一個球接觸時,他們交換速度。我們不必擔心任何角度,只是當他們彼此接觸時,速度會互換。 (而不是改變速度,雖然在代碼鏈接,我剛剛編碼顏色變化)Javascript:簡單粒子運動,粒子彈性彈跳其他粒子

我一直在試圖調用函數'someplace'來識別分子觸摸時,但我沒有運氣好。我不明白爲什麼。

鏈接代碼:

http://jsbin.com/arokuz/5/

似乎有三個主要問題:

  • 分子似乎是隨機變化的,而不是在兩個分子碰。

  • 當一個設置在陣列具有發言權,3個分子,只有兩個出現,第一個是實際存在的,但不響應.fillstyle變化,靠在帆布

  • 所以不可見隨着功能的方法我會只有當陣列中的一系列分子(1和2或4和5)接觸時才能夠識別...我如何檢查所有分子?

+0

你可能想看看四叉樹碰撞檢測與屏幕上的許多項目一次,因此快速移動:http://gamedev.tutsplus.com/tutorials/implementation/quick-tip-use-quadtrees-to-detect-likely-collisions-in-2d-space/ – eterps

+0

@eterps:你真的嘗試過這種解決碰撞的方式嗎?本文提出了一種不適合javascript的方法 - 創建了太多的垃圾回收,創建了太多的垃圾回收,並且提到了一些「細節」,這些細節只會......使其工作。除非有非常特殊的需求,否則簡單的空間散列表現會更好。 – GameAlchemist

回答

1

你只比較分子與其他2個項目,這實際上可能是任何地方。
碰撞檢測是一個很難解決的話題,但如果你想讓你的想法 快速工作,你可能會用2個嵌套for循環的n^2算法。

代碼頗爲期待:

// collision 
    for(var t = 0; t < molecules.length-1; t++) 
    for(var tt = t+1; tt < molecules.length; tt++) { 
     var p1 = molecules[t]; 
     var p2 = molecules[tt]; 
     if (sq(p1.x-p2.x) +sq(p1.y-p2.y) < sq(p1.radius+p2.radius)) 
      { 
      p1.collided = 8; // will diplay for next 8 frames 
      p2.collided = 8; // . 
     } 
    } 

小提琴是在這裏: http://jsbin.com/arokuz/10

0

當三個由是不是因爲第一個不使這是相當的最後一個不的原因只有兩個出現,這是因爲你如何吸引他們通過其距離與比較列表中的下一個 - 因爲它是最後一個沒有下一個,因此拋出一個空錯誤並繼續(檢查控制檯)。

他們似乎「隨機」檢測碰撞的原因是因爲他們沒有檢查所有其他分子 - 只有列表中的下一個,不幸的是唯一簡單的方法是通過所有其他分子每個球的球和檢查。

爲了讓分子探測距離,你可以用勾股定理,我通常使用它,例如:

var distx = Math.abs(molecule1.x - molecule2.x); 
var disty = Math.abs(molecule1.x - molecule2.y); 
var mindist = molecule1.radius + molecule2.radius; 
return Math.sqrt(distx*distx+disty*disty) < mindist; 
+0

將平方距離與平方最小距離進行比較將交易一平方sqrt:return(distx * distx + disty * disty) GameAlchemist