Kollisionserkennung mit VIELEN Objekten
Ich vor allem auf die Grafik-Aspekte zu schaffen, ein wenig 2DGame. Ich habe beobachtet/angeschaut, mehrere tutorials, aber keiner von Ihnen waren zufriedenstellend. Ich habe bereits ein Spieler(ein Platz) Bewegung und Kollision mit anderen Quadrate auf dem Bildschirm. Gewicht etc. Sind auch erledigt.
Wenn es nur so viel Objekte auf dem Bildschirm zu sehen ist (30*20), funktioniert alles bestens. Aber wenn ich erhöhen auf sagen wir mal 300*300 das Programm beginnt zu laufen sehr langsam, da es ist zu prüfen, für so viele Objekte.
Ich weiß wirklich nicht, wie Spiele wie Minecraft kann ALLE DIESE Blöcke und mein Programm gibt bereits bis auf 300*300 Blöcke.
Ich schon versucht, NUR überprüfen Sie auf Kollisionen, wenn die Objekte sichtbar sind, aber das führt zu das Programm prüfen jedes einzelne Objekt für Sichtbarkeit führt zu dem gleichen problem.
Was mache ich falsch? Hilfe zu schätzen.
Poste ich einige code, wie ich mit den Kollisionen.
player.collision(player, wall);
public void collision(Tile object1, Tile[] object2){
collisionCheckUp(object1, object2);
collisionCheckDown(object1, object2);
collisionCheckLeft(object1, object2);
collisionCheckRight(object1, object2);
}
public void collisionCheckDown(Tile object1, Tile[] object2){
for (int i = 0; i < Map.tileAmount; i++){
if(object2[i] != null && object2[i].visible)
{
if(object1.isCollidingDown(object2[i])){
object1.collisionDown = true;
return;
}
}
}
object1.collisionDown = false;
}
public void compileHullDown(){
collisionHull = new Rectangle((int)x+3, (int)y+3, width-6, height);
}
int wallCount = 0;
for (int x=0;x<Map.WIDTH;x++) {
for (int y=0;y<Map.HEIGHT;y++) {
if (Map.data[x][y] == Map.BLOCKED) {
wall[wallCount] = new Tile(x * Map.TILE_SIZE, y * Map.TILE_SIZE);
wallCount++;
}
}
}
InformationsquelleAutor der Frage Gjallar | 2011-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den üblichen Ansatz zur Optimierung der Kollisionserkennung ist die Verwendung eines space-partition zu klassifizieren/verwalten Ihrer Objekte.
Die generelle Idee des Ansatzes ist, dass Sie bauen einen Baum repräsentiert den Raum und setzen Ihre Objekte in diesem Baum, nach Ihren Positionen. Beim berechnen der Kollisionen, die Sie durchqueren den Baum. Auf diese Weise, Sie zu erfüllen haben deutlich weniger Berechnungen als mit der brute-force-Ansatz, weil Sie ignorieren alle Objekte, die in andere Zweige als den, den Sie durchqueren. Minecraft und ähnlichen wahrscheinlich octrees für die Kollision (und vielleicht auch zum Rendern).
Den häufigsten space partition Strukturen sind BSP-Bäumekd-Bäume (eine spezielle Art von BSP-Bäume). Der einfachere Ansatz wäre die Verwendung einer einheitlichen Raum-partition für den start - teilen Sie Ihre Raum in der Achse ausgerichtet Hälften.
Die beste Ressource auf Kollision, die ich entdeckt habe, ist dieses Buch. Es sollte klären alle Ihre Fragen zum Thema.
Dass, wenn Sie wollte, es richtig zu machen. Wenn Sie möchten, schnell zu tun, können Sie einfach eine Probe von der Farbe-Puffer um Ihren Charakter, oder nur in der Bewegung die Richtung zu bestimmen, wenn ein Hindernis in der Nähe ist.
InformationsquelleAutor der Antwort kostja
Als Kostja erwähnt, wird es nützlich sein für Sie, um die partition Ihren Platz. Jedoch, Sie benötigen, um QuadTrees statt Octrees, wie Sie nur in 2D, nicht 3D.
Hier ist eine schöne Artikel um Ihnen den Einstieg auf QuadTrees.
InformationsquelleAutor der Antwort GETah
Können Sie schneiden Sie Ihre overhead um den Faktor 4 durch, statt der Berechnung von Kollisionen für oben/unten/Links/rechts, Berechnung von Kollisionen einmal und mit den relativen Positionen der beiden Objekte, um herauszufinden, wenn Sie auf einen Boden, Wand oder Decke. Eine weitere gute Idee ist, nur achten Sie auf die Objekte, die in der Nähe sind - vielleicht einmal alle 0,25 Sekunden machen Sie sich eine Liste aller Objekte an, die sind wohl nahe genug, um die Konflikte mit den in den nächsten 0,25 Sekunden?
InformationsquelleAutor der Antwort Toomai