Ich versuche, den sichtbaren Teil einer rautenförmigen isometrischen Karte zu rendern. Das "Welt" -Koordinatensystem ist ein kartesisches 2D-System, bei dem die Koordinaten entlang der Achsen diagonal (in Bezug auf das Ansichtskoordinatensystem) zunehmen. Die "Ansicht" -Koordinaten sind einfach Mausversätze relativ zur oberen linken Ecke der Ansicht.
Mein Rendering-Algorithmus zeichnet diagonale Bereiche, beginnend in der oberen rechten Ecke der Ansicht und diagonal nach rechts und unten, bis zur nächsten Zeile, wenn sie die rechte Ansichtskante erreicht. Wenn die Rendering-Schleife die untere linke Ecke erreicht, stoppt sie.
Es gibt Funktionen, um einen Punkt von Ansichtskoordinaten in Weltkoordinaten und dann in Kartenkoordinaten umzuwandeln.
Beim Rendern von Kachel 0,0 funktioniert alles, aber wenn die Ansicht durch das Rendering rollt, muss von einer anderen Kachel ausgegangen werden. Ich kann nicht herausfinden, wie ich feststellen kann, welche Kachel der oberen rechten Ecke am nächsten liegt.
Im Moment konvertiere ich einfach die Koordinaten der oberen rechten Ecke in Kartenkoordinaten. Dies funktioniert so lange, wie sich der Ansichtsursprung (obere rechte Ecke) innerhalb der Welt befindet. Wenn Sie sich jedoch den Rändern der Karte nähern, wird die Koordinate der Startkachel offensichtlich ungültig.
Ich denke, das läuft darauf hinaus zu fragen: "Wie kann ich den Schnittpunkt zwischen der X-Achse der Welt und der X-Achse der Ansicht finden?"
Antworten:
Nicht wirklich, Sie haben möglicherweise keine Daten für den Spot, aber es sollte nichts Falsches daran sein, dieselbe Formel zu verwenden.
Wenn Sie Vorschläge zur Überwindung potenzieller Probleme wünschen, möchten Sie uns möglicherweise den entsprechenden Code zeigen.
Bearbeiten:
Nehmen wir zur Verdeutlichung an, Sie haben eine Karte mit 100 x 100 Kacheln, die von 0 bis 99 indiziert ist. Zum Rendern würden Sie Folgendes tun:
quelle
continue
die Rendering-Schleife, bis sich die aktuelle Kachel innerhalb der Karte und der Ansicht befindet. Ich werde es versuchen, sobald ich etwas Zeit finde! :)