Zuallererst habe ich nur eine kurze Zeit lang meine eigene Spielelogik geschrieben, also entschuldige ich mich, wenn dies unkompliziert erscheint.
Ich habe viel über Quad-Bäume und gitterbasierte Kollisionserkennung gelesen. Ich verstehe die Logik - prüfe grundsätzlich nicht auf Kollisionen, es sei denn, Objekte sind im Grunde genommen in der Nähe. Es wird aber nie erwähnt, wie die das tatsächlich ausführen.
Ich habe ein paar mögliche Methoden im Kopf, bin mir aber nicht sicher, welche die beste ist
Allgemeiner Kollisionstest - keine Optimierung
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
Nachbarn speichern (Methode 1) Aber was ist, wenn wir die Kollisionen optimieren möchten, um nur Objekte zu überprüfen, die sich in der Nähe befinden. Durchlaufen wir immer noch alle Objekte oder erstellen wir ein Array mit Near-Objekten, die überprüft werden sollen?
var objects:Array = new Array();
var neighbours:Array = new Array();
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
neighbours.push(objectA, objectB);
}
}
}
//somewhere else
for(i:int = 0; i < neighbours.length; i++){
//only check neighbours
for(j:int = i + 1; j < neighbours.length; j++){
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
Schleifen Sie alle Objekte, aber überprüfen Sie nur die Nachbarn auf Kollision (Methode 3). Die andere Möglichkeit besteht darin, dass Sie immer noch alles durchlaufen, aber prüfen Sie, ob sich die Objekte in der Nähe befinden, bevor Sie die Kollision testen.
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
//they are near - check collision!
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
}
Objekte in Kacheldaten speichern (Methode 3) Bei Verwendung eines Kachelsystems ist eine andere Option zulässig. Speichern Sie die Objekte, die sich auf einer bestimmten Kachel befinden, in den Kacheldaten. Überprüfen Sie, auf welcher Kachel sich das Objekt befindet. Die umgebenden Kacheln enthalten alle Objekte, mit denen es kollidieren könnte:
var ObjectA;
for(var i:int = 0; i < 4; i ++){
//check 4 surrounding tiles from object A
if(Object.currentTile + surroundingTile[i] CONTAINS collidable object){
//check collision!
if(objectA.collidesWith(surroundingTile.object){
//handle collision logic
}
}
}
Ich versuche immer, die reale Welt als Beispiel zu betrachten. Wenn ich Elemente mit derselben Farbe vergleichen möchte, erscheint es unlogisch, alle Elemente zu überprüfen, auch wenn sie nicht mit der Farbe übereinstimmen (Methode 2, überprüfen Sie jedes Element). Ich würde wahrscheinlich die Gegenstände mit der gleichen Farbe (Objekte, die nahe beieinander liegen) sammeln und diese prüfen (Methode 1), anstatt alles zu überprüfen.
Dies ist kein angemessener Vergleich, da sich die Elemente in der Kollisionsprüfung ständig bewegen, sodass die Reihenfolge vertauscht wird. Das verwirrt mich.
Wäre es effizienter, jedes Element zu überprüfen und so die Belastung durch die Erzeugung einer Reihe von Nachbarn zu verringern?
Oder ist es effizienter, Nachbarn zu finden, um nicht so viele Objekte durchlaufen zu müssen, um die Kollision zu überprüfen?
Das Ändern der Daten auf jeder Kachel scheint ebenfalls sehr intensiv zu sein, daher bin ich mir nicht sicher, ob das eine gute Idee ist.
Ich habe über ein Tower Defense-Spiel nachgedacht, bei dem der Tower Objekte erkennen muss, die sich in Reichweite befinden, bevor er auf sie schießt. Und es scheint einfach albern, alle Gegenstände zu überprüfen, während manchmal überhaupt keine Gegenstände in der Nähe sind.
Ich entschuldige mich für den langen Beitrag und habe immer Probleme, mich selbst zu erklären!