2011-08-13 10 views
6

私はjavascriptでヘビのゲームを作ろうとしていますが、私は衝突の検出に苦労しています。私はこれまでにいろいろな方法を試しましたが、絶望的に各フレームのセグメントのすべての位置を保存しておき、次にアニメーションを作成する前に重複があるかどうかを確認しました。この方法は不幸にもうまくいっていません。JavaScriptの衝突検出

これはおそらく、JSが配列をどのように扱うのかという誤解のためです。しばらくの間、私はif(x in y)を使っていましたが、まったく同じオブジェクトが配列内にあれば、私が返すことがわかるものからです。ここでは読みやすくコードですhttp://jsfiddle.net/AScYw/2/

はここでライブデモで機能collideとしてhttp://pastebin.com/ygj73me6

問題のコードは、ヘビのオブジェクトです、。

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. 最初の比較からループを脱落しています。あなたは何かのようにしたいと思うでしょう(何か重なり合う)が真を返すならば、両方のループの外側は偽を返すでしょう。
  2. あなたはzセグメント!= qセグメントか、衝突

ルックスクール。さあ、マリオを見てみましょう;)

+0

私はあなたの最初の点をかなり理解しているかどうか分かりませんが、私がループから脱出しているということはどういう意味ですか?そして、「z + 1」でqを開始しても、それらが同じではないことを保証していませんか?助けてくれてありがとう!私はどこでもマリオをリメイクする準備ができているかどうかは分かりません。 D:おそらくテトリスでしょう。 – danem

+0

あなたのreturnステートメントはループを介して最初に呼び出されるので、1つのセグメントのチェックだけが終了します。 – thedaian

+0

@thedaianあなたはそれがtrueを返すかどうかにかかわらずループを終了することを意味しますか?私は条件を渡した後に戻り値が呼び出されるようにコードを変更しましたが、現在は常にtrueを返しています。 – danem