Frage

ich dabei bin mein 2D-Engine macht für ein Beat'em Up Spiel (Castle Crashers ist, was ich als Beat'em Up oder Brawler Art von Spiel).

ich 2D-Sprites und 2D-Partikelemitter unterstützen. Dies alles wird nun in dem Motor durchgeführt. Aber ich habe zu einem Problem kommen, dass ich um Rat fragen möchte:

Es geht um „Raum“ Management, was ich dachte, war, etwas zu tun, wie dieses Bild zeigt:

alt text http://img337.imageshack.us/img337/9162/spacingprototype1 .png

Meine Idee ist es, ein Gitter (Spatial Hash oder Grid), des Bodens, auf die mein Partikelemitter / 2D-Sprites lebt zu machen. In meinem Bild habe ich diese Slots aufgezählt von 1 bis N, (muß nicht 35 sein, es ist nur für Zwecke zeigen). Meine Idee ist es, die „GameElements“ (Sprites / Emitters), um von 0 bis N, (gehen von Eimer 0 bis Schaufel N) zu zeichnen, so ist, dann werde ich bekommen sie auf dem Bildschirm korrekt überlappt angezeigt werden soll. (Zurück zu weiterleiten)

Ich weiß, das nur durch den Vergleich der untere Y-Achse jeden Elements und die Durchführung einen „quicksort“ auch getan werden könnte, aber mit der Grid ermöglichen könnte mir Kollisionserkennung in einer besseren Art und Weise durchzuführen, und wenn ich so etwas wie ein * eine Art von AI zu implementieren, könnte es mir auch helfen.

War es hilfreich?

Lösung

Wenn Sie irgendeine Art von Optimierung für die Anzahl der Objekte haben wollen Sie gegeneinander testen müssen, könnte man denken möchte ein Quadtree über die Verwendung von http://en.wikipedia.org/wiki/Quadtree

Die Idee ist, den Bildschirm nach oben in 4 Knoten zu teilen, alle Elemente im Knoten platzieren sie gehören, dann die Knoten teilen Sie gerade in einer anderen 4 erstellt, wenn es Sprites / Artikel / was auch immer da drin, dass Bedarf getestet werden . Halten Sie tun dies, bis eine bestimmte Größe oder Menge der Elemente in einem Knoten erreicht ist.

Sie können dann fragen Sie den obersten Knoten, wenn es das Element enthält, die Sie testen möchten. Dieser Knoten wird dann fragen Sie die Kind-Knoten, wenn sie das Element enthält, die ihrerseits ihre Kinder fragen. Auf diese Weise ein großer Teil des Bildschirms bereits übersprungen werden kann (wenn es in den Kindern 00 gelegen ist, können Sie Kind überspringen 01, 10 und 11). Dann erhalten Sie eine Liste der Artikel, die Sie spezifischere Kollisionserkennung durchführen, wenn es gewünscht ist, dies zu tun.

Wenn Sie es visuell machen, wäre es ein bisschen wie folgt aussehen:

alt text http: // geodata.ethz.ch/geovite/tutorials/L2GeodataStructuresAndDataModels/en/images/quadtree.gif

Andere Tipps

Feuer, um sie zu den Z-Puffern aus und lassen Sie diese Sorge um sie.

Wenn Sie feststellen, dass es in Zukunft zu langsam ist (über Profilierung offensichtlich), dann schauen Sie es zu optimieren.

Nehmen Sie die einfachste Lösung und ziehen weiter.

Ihre Methode schlägt fehl, wenn Sie zwei Sprites die gleiche Box im Netz zu besetzen. Angenommen, Sie haben zwei Feinde beide im selben Feld stehen. Man steht etwas vor dem anderen. Welche ziehen Sie zuerst? Sie würden zwei Algorithmen benötigen -. Eine, die die Sprites in das Netz teilt, und die zweite, die an den z-Koordinaten aller Sprites in einem bestimmten Gitterbox sie sieht und zieht auf der Grundlage dieser Wert

Eine weitaus einfachere Methode ist eine einzige Sammlung aller Sprites zu haben. Es sollten alle Sprites durch ihre z-Koordinaten sortiert speichern (von der Rückseite des Bildschirms an der Spitze der Liste der vor dem Bildschirm auf der Rückseite). Schleife durch die Erhebung und jedes Sprite zeichnen, wie es angezeigt wird. Wenn ein Sprite bewegt sich in den oder aus dem Bildschirm (dh. Seine z-Koordinatenänderungen) Sie eine sehr einfache Art durchführen kann, dass einzelne Sprite innerhalb der Sammlung zu bewegen. Halten Sie es mit dem nächsten Sprite in der Liste tauschen, bis die z-Koordinate des nächsten Sprite größer / kleiner als (gegebenenfalls) die veränderte Sprites Koordinaten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top