2016-11-01 5 views
3

Ich schreibe ein einfaches Spiel mit einem einfachen Kollisionserkennungssystem.Iteration Array über Array ohne Duplikate

Im Moment habe ich diesen Code für das Array gegenüber dem gleichen Array iteriert, so kann ich überprüfen, ob die Objekte dicht beieinander sind und wenn sie kollidieren:

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 
 
    } 
 
    } 
 
}

Aber die Hauptproblem mit diesem Code ist, dass ich Duplikate habe. Zum Beispiel überprüfe ich i und a, aber irgendwo später überprüfe ich a und i mit den gleichen Werten.

Ich habe versucht mit einem Array, das speichert, welche Objekte mit welchen Objekten überprüft werden, aber es gibt mir einen großen fps-Drop.

Was ist die beste Methode, dies zu tun?

+1

was ist der Inhalt des 'objects' Array? –

+0

Es ist nur und Array, die Kreise mit X-Position, Y-Position, Radius und X-und Y-Vektor enthält. – ruttydm

Antwort

7

Ihre zweite for Schleife im aktuellen Ort der ersten for Schleife Start:

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

diese Weise können Sie jedes Element im Array überprüfen nur gegen die Artikel vor der aktuellen Position.

können überprüfen Sie die Original-Code:

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]); 
 
    } 
 
    } 
 
}

Nun lässt mein Beispiel überprüfen:

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]); 
 
    } 
 
}

Die allgemeine id ea ist jedes Element zum Vergleich nur auf die Elemente, die in der Anordnung gefolgt sind:

[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

Irgendein Kommentar vom Downvoter? – Dekel

+0

Es ist nicht der gleiche Code, das ist besser, da es nicht die gleichen Prüfungen macht .... – epascarello

+0

@Roberrrt, das ist nicht. Auf diese Weise haben Sie keine Duplikate auf Objekte [2] vs. Objekte [5] und spätere Objekte [5] vs. Objekte [2]. – Dekel

1

Wenn Sie ES2015 verwenden können, Set erlaubt nur einzigartige Mitglieder des Satzes. Von MDN:

Mit dem Set-Objekt können Sie eindeutige Werte eines beliebigen Typs speichern, unabhängig davon, ob es sich um primitive Werte oder Objektreferenzen handelt.

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

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

Ich glaube, Sie verstehen nicht, was das OP braucht. OP fragt nicht nach einer Möglichkeit, Duplikate zu verhindern. OP benötigt einen Weg, um einzigartige Vergleiche zu machen (ohne zweimal den gleichen Vergleich zu machen). –

+0

Oh, das war nicht klar, als ich meine Antwort gepostet habe. Danke @devlincarnate für die Klärung – colecmc