2016-11-01 15 views
3

私は単純な衝突検出システムで簡単なゲームを書いています。重複のない配列の配列の反復

オブジェクトが互いに近接している場合は、それらが衝突する場合、私がチェックできるように、私は現在、同じ配列上の配列を反復処理のために、このコードを持っている:

var objects = []; //assume this is not empty 
 

 

 
for(i=0;i<objects.length;i++){ 
 
    for(a=0;a<objects.length;a++){ 
 
    if(a != i){ 
 
     //collision handling 
 
    } 
 
    } 
 
}

しかし、このコードの主な問題は、重複があることです。 たとえば、私はiとaをチェックしますが、後でどこかでiとaを同じ値でチェックします。

どのオブジェクトでどのオブジェクトがチェックされているかを保存する配列を使ってみましたが、大きなfpsを落とします。

これを行うにはどのような方法が最適ですか?

+1

'objects'配列の内容は何ですか? –

+0

xの位置、yの位置、半径、x、yのベクトルを持つ円を含む配列です。 – ruttydm

答えて

7
最初 forループの現在の場所に二 forのループを開始し

:あなただけ先に、現在のアイテムのアイテムと照らし合わせて、アレイ内のすべての項目をチェック

for(i=0;i<objects.length;i++){ 
    for(a=i+1;a<objects.length;a++){ 
     //collision handling 
    } 
} 

この方法です。

あなたの元のコードをチェックすることができます:さて、私の例を確認できます

objects = ['a', 'b', 'c'] 
 
for(i=0;i<objects.length;i++){ 
 
    for(a=0;a<objects.length;a++){ 
 
    if(a != i){ 
 
     console.log("Checking "+ objects[i]+ "vs. "+objects[a]); 
 
    } 
 
    } 
 
}

を:

objects = ['a', 'b', 'c'] 
 
for(i=0;i<objects.length;i++){ 
 
    for(a=i+1;a<objects.length;a++){ 
 
    console.log("Checking "+ objects[i]+ "vs. "+objects[a]); 
 
    } 
 
}

一般的なIDをEAは唯一の配列に続いている項目にすべての項目を比較することです:

[a, b, c, d] 
a => vs b, c, d ar[0] vs ar[1], ar[2], ar[3] 
    b => vs c, d ar[1] vs  ar[2], ar[3] 
     c => vs d ar[2] vs    ar[3] 
+0

downvoterからのコメントはありますか? – Dekel

+0

これは同じコードではありませんが、これは同じチェックをしていないのでより良いです。 – epascarello

+0

@Roberrrt、これはありません。この方法では、オブジェクト[2]とオブジェクト[5]とそれ以降のオブジェクト[5]とオブジェクト[2]の重複チェックは行いません。 – Dekel

1

あなたはES2015を使用することができた場合は、Setはセットの唯一のユニークなメンバーが可能になります。 MDNから:

Setオブジェクトを使用すると、プリミティブ値でもオブジェクト参照でも、すべての型の一意の値を格納できます。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

[...new Set(objects)] 
+2

私は、OPが必要とするものを誤解していると思います。 OPは重複を防ぐ方法を求めていない。 OPには、同じ比較を2回行うことなく、独自の比較を行う方法が必要です。 –

+0

ああ、答えを投稿したときにはっきりしなかった。私はそれをクリアするための@devlincarnateありがとう – colecmc

関連する問題