Ich komme gleich heraus und sage, dass ich nicht weiß, wie ich das in der Frage beschriebene Problem lösen soll (Kollisionserkennung zwischen isofliesenförmigen Rechtecken), aber ich kann Ihnen sagen, wie andere es in der Vergangenheit gelöst haben ::
In anderen Spielen wird die Spielwelt von der Bildschirmwelt getrennt . Wenn Sie anfangen, ist es üblich, sich vorzustellen, dass sie dasselbe sind, aber dann führt dies zu Problemen wie dem, das Sie beschreiben.
Die allgemeine Idee ist, dass die Spielwelt vollständig im Speicher gespeichert ist, hinter den Kulissen sind es nur Zahlen, Referenzen und Logik. Die Tatsache, dass Sie die Spielwelt isometrisch zeichnen, spielt keine Rolle. Ihre Spielwelt sollte nicht das Konzept einer Isometrie oder eines Quadrats haben oder auch nicht, wenn der Bildschirm als 3D gezeichnet wird. All dies wird erledigt, wenn Sie die Spielwelt auf den Bildschirm (auch bekannt als Bildschirmwelt ) zeichnen . Die Spielwelt sollte auf die einfachste Art und Weise gespeichert und gepflegt werden, die für das Spiel sinnvoll ist. Bei isometrischen Spielen ignorieren Sie normalerweise die Tatsache, dass es sich um eine ISO handelt, und speichern die Positionen stattdessen so, als ob Sie ein achsenausgerichtetes Gitter verwenden würden. Die meisten Spiele haben Methoden zum Konvertieren von Koordinaten zwischen den beiden Welten, ich nenne meine ScreenToWorld(x, y)
undWorldToScreen(x, y)
. Die Konvertierung erfolgt häufig mit Matrix-Mathematik, kann aber auch auf andere Weise erfolgen. Sie verwenden ScreenToWorld, wenn Sie die Maus verwenden, und WorldToScreen, wenn Sie zeichnen.
Die Aufteilung der Spielwelt und der Bildschirmwelt bietet mehrere Vorteile . Einer der Vorteile ist, dass Kollisionserkennung und -bewegung alle in der Spielwelt stattfinden und daher normalerweise recht einfach sind, da Sie nicht mit einem schrägen Gitter oder verzerrten Koordinaten zu tun haben oder wo sich der Bildschirm befindet usw. In Ihrem Fall Sie würden es mit achsenausgerichteten Rechtecken und Quadraten zu tun haben. Sobald die Spielwelt aktualisiert wurde, zeichnen Sie eine Darstellung der Spielwelt auf den Bildschirm, Stichwort: Darstellung. Es mag zunächst kontraintuitiv erscheinen, aber Ihr Bildschirm ist nur eine Darstellung dessen, was in der Spielwelt vor sich geht. Dies ermöglicht Dinge wie dedizierte Server und terminalähnliche Clients.
FreeCiv ist tatsächlich ein großartiges Beispiel für all diese Dinge. Sie können dieselbe exakte Welt wie jede andere anzeigen: ein quadratisches Nord / Süd-Gitter, eine isometrische oder sogar eine hexadezimale. Jedes Spiel, das Sie ausführen, verfügt über einen dedizierten Server, der im Hintergrund ausgeführt wird, auch für Einzelspieler-Spiele. Daher ist der Client auch nur ein Anzeigeport, nichts weiter.
Lange Rede kurzer Sinn : die Spielwelt und Logik aus dem Bildschirm Welt vereinfacht die Spiellogik trennen, reduziert das Spiel <-> Anzeige Kopplung , und wiederum macht Kollisionserkennung zwischen „iso“ Fliesen leichter zu handhaben und leichter zu visualisieren.