Ich schreibe ein isometrisches 2D-Spiel und habe Schwierigkeiten, genau herauszufinden, auf welcher Kachel sich der Cursor befindet. Hier ist eine Zeichnung:
Dabei sind xs und ys Bildschirmkoordinaten (Pixel), xt und yt Kachelkoordinaten, W und H Kachelbreite bzw. Kachelhöhe in Pixel. Meine Notation für Koordinaten ist (y, x), was verwirrend sein kann, tut mir leid.
Das Beste, was ich bisher herausfinden konnte, ist Folgendes:
int xtemp = xs / (W / 2);
int ytemp = ys / (H / 2);
int xt = (xs - ys) / 2;
int yt = ytemp + xt;
Dies scheint fast richtig zu sein, führt jedoch zu einem sehr ungenauen Ergebnis, wodurch es schwierig wird, bestimmte Kacheln auszuwählen, oder manchmal wird eine Kachel neben der ausgewählt, auf die ich klicken möchte. Ich verstehe nicht warum und möchte, dass mir jemand helfen kann, die Logik dahinter zu verstehen.
Vielen Dank!
Ich hatte das gleiche Problem für ein Spiel, das ich schrieb. Ich stelle mir vor, dass dieses Problem davon abhängt, wie genau Sie Ihr isometrisches System implementiert haben, aber ich werde erklären, wie ich das Problem gelöst habe.
Ich habe zuerst mit meiner Funktion tile_to_screen begonnen. (Ich gehe davon aus, dass Sie die Kacheln auf diese Weise an der richtigen Stelle platzieren.) Diese Funktion hat eine Gleichung zur Berechnung von screen_x und screen_y. Meins sah so aus (Python):
Ich nahm diese beiden Gleichungen und machte sie zu einem System linearer Gleichungen. Lösen Sie dieses Gleichungssystem mit einer beliebigen Methode. (Ich habe eine rref-Methode verwendet. Außerdem können einige Grafikrechner dieses Problem lösen.)
Die endgültigen Gleichungen sahen folgendermaßen aus:
Wie Sie sehen können, ist es nicht so einfach wie die Anfangsgleichung. Aber es funktioniert gut für das Spiel, das ich erstellt habe. Gott sei Dank für die lineare Algebra!
Aktualisieren
Nachdem ich eine einfache Point-Klasse mit verschiedenen Operatoren geschrieben hatte, vereinfachte ich diese Antwort auf Folgendes:
quelle
Sie verwenden ein gutes Koordinatensystem. Wenn Sie versetzte Spalten verwenden, wird es viel schwieriger.
Eine Möglichkeit, über dieses Problem nachzudenken, besteht darin, dass Sie eine Funktion haben, mit der Sie (xt, yt) in (xs, ys) umwandeln können. Ich werde Thanes Antwort folgen und sie anrufen
map_to_screen
.Sie möchten die Umkehrung dieser Funktion. Wir können es nennen
screen_to_map
. Funktionsumkehrungen haben folgende Eigenschaften:Diese beiden sind gute Dinge für den Unit-Test, wenn Sie beide Funktionen geschrieben haben. Wie schreibt man die Umkehrung? Nicht alle Funktionen haben Inversen, aber in diesem Fall:
Stellen Sie sicher, dass Sie testen, ob die Funktion inverse + original die Antwort zurückgibt, mit der Sie begonnen haben. Thane's besteht beide Tests, wenn Sie den
+ TILE_HEIGHT/2
Render-Offset herausnehmen. Als ich die Algebra gelöst habe, habe ich mir Folgendes ausgedacht:was ich glaube, ist das gleiche wie das von Thane
screen_to_map
.Die Funktion verwandelt die Mauskoordinaten in Gleitkommazahlen. Verwenden Sie
floor
diese Option, um sie in ganzzahlige Kachelkoordinaten umzuwandeln.quelle