2011-08-13 251 views
6

我想在JavaScript中做一個蛇的遊戲,但我正在努力與碰撞檢測。到目前爲止,我已經嘗試了各種方法,但是在絕望中,已經解決了存儲每個幀的所有位置,然後在動畫下一個之前檢查是否有任何重複。不幸的是,這種方法尚未證明是成功的。Javascript碰撞檢測

也許這是由於對JS如何對待數組的誤解。有一段時間我正在使用if(x in y),但從我可以告訴,如果完全相同的對象是在一個數組中返回。

下面是現場演示:http://jsfiddle.net/AScYw/2/

下面是代碼更容易閱讀:http://pastebin.com/ygj73me6

有問題的代碼是在蛇的對象,作爲函數collide

this.collide = function(){ 
      for(var z=0; z<this.positions.length-1; z++){ 
       for(var q=z+1; q<this.positions.length-1; q++){ 
        return this.positions[z][0] == this.positions[q][0] && this.positions[z][1] == this.positions[q][1]; 
       } 
      } 
+1

這個遊戲肯定很容易與碰撞檢測禁用! – bgw

+0

@PiPeep是啊不是很棒?! – danem

回答

5

你在這裏的功能需要一點工作,它可能會解決你的問題。

this.collide = function(){ 
    for(var z=0; z<this.positions.length-1; z++){ 
    for(var q=z+1; q<this.positions.length-1; q++){ 
     return this.positions[z][0] == this.positions[q][0] && this.positions[z][1] == this.positions[q][1]; 
    } 
    } 
} 

2件事情是錯誤的。

  1. 您正在退出循環的第一次比較。你會想做一些事情,如果(重疊的東西)返回true,然後在兩個循環之外返回false如果你成功通過
  2. 你會想要確保z segment!= q segment,否則你將永遠有一個碰撞

看起來很酷。讓我們看看馬里奧下一步;)

+0

我不確定我是否理解你的第一點,你是什麼意思,我已經退出了循環?並且不會在'z + 1'處啓動q,以確保它們不會相同?謝謝您的幫助!我不確定我是否準備重拍馬里奧。 D:也許俄羅斯方塊第一。 – danem

+0

你的return語句在循環中第一次被調用,所以你最終只能檢查一個段。 – thedaian

+0

@thedaian你的意思是它退出循環,不管它是否返回true?我已經更改了代碼,以便在傳遞條件後調用返回值,但現在總是返回true。 – danem