Isometrisches Rendern und Kommissionieren?

23

Ich habe nach einer Formel gesucht, um isometrische Kacheln in einer rautenförmigen Welt zu zeichnen (Welt-> Bildschirm) und mit der Maus auszuwählen (Welt-> Bildschirm). Die, die ich immer versucht habe, scheinen gut weg zu sein. Was ist der übliche / richtige Weg, um dies zu tun?

mpnk121
quelle
Die genaue Methode und Formel hängt ein wenig von der Form Ihrer Kacheln ab und wahrscheinlich auch davon, wie Sie die Karte zeichnen (0,0 oben, unten oder an einer der Seiten der Karte). Weitere Details über dein Problem würde helfen.
Donnerstag,
1
Die Kacheln sind 2: 1 (genauer gesagt 64x32). Das Koordinatensystem spielt keine Rolle, da ich den Editor schreibe. (0,0 oben oder links scheint jedoch sinnvoll.)
mpnk121
Sehr spät auf die Frage und ich habe noch nicht einmal eine vollständige Antwort, aber es gab einen sehr guten Google Tech Talk zu diesem genauen Thema. Ihr Setup umfasst das Auswählen des nicht transparenten Teils beliebiger Bilder (in Javascript, nicht weniger). youtube.com/watch?v=_RRnyChxijA
Seth Battin

Antworten:

21

Basierend auf Ihrem Kommentar ist hier der Code, den ich verwende, um Kachel-XY-Werte in Bildschirmkoordinaten umzuwandeln. Jetzt werden "3D-Kacheln" nicht berücksichtigt, alles wird als auf derselben Ebene liegend betrachtet. Wenn Sie also ein Spiel schreiben, bei dem es darauf ankommt, funktioniert dieser Code nicht.

//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
        point screen;
        //calculate the screen coordinates
        //note: these will then be modified by the camera
        screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
        screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
        return screen;
 }

point ist einfach eine Struktur mit x und y ints, TILE_WIDTH wäre in Ihrem Fall 64, TILE_DEPTH ist irgendwie falsch benannt (es ist tatsächlich die Höhe der Kachelgrafiken), aber es wäre in Ihrem Fall 32. Die Offsets lauten, wenn Ihre Kachelkarte an einer anderen x, y-Position "beginnen" soll (z. B. wenn sich die Kacheln über einer anderen Kachelgruppe befinden sollen). Typischerweise kann der Versatz 0,0 sein.

Dies erzeugt eine Karte mit 0,0 oben, in der Mitte, wie folgt:

        0,0
    0,1     1,0
0,2     1,1     2,1

Zum Finden der Kachel x, y des Cursors:

point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;

In diesem Codebit sind mX und mY die Koordinaten des Mausbildschirms, die wir mit den Kamerawerten kombinieren, um herauszufinden, wo wir uns in "Weltkoordinaten" befinden. Alles andere ist das gleiche wie im vorherigen Codebeispiel.

Dies setzt wiederum eine flache isometrische 2D-Kachelkarte voraus. Wenn Sie eine Halb-3D-Ansicht der Karte verwenden möchten, ist zusätzliche Arbeit erforderlich, und dies setzt voraus, dass Sie ohnehin in 2d arbeiten.

thedaian
quelle
1
Vielen Dank! - Dies funktioniert hervorragend für flache Karten. Können Sie mir etwas mehr darüber erzählen, wie ich Kacheln beliebiger Größe (dh mit einer Z-Tiefe) hinzufügen kann, die sich auf einer anderen Ebene befinden? (Wie Requisiten wie ein Brunnen oder eine Straßenlaterne)
mpnk121
2
In diesem Fall verwenden Sie die Werte offsetY und offsetX. Wenn Ihre Straßenlaterne 64x64 ist, sollte die Eingabe eines negativen 32 für den OffsetY-Wert dazu führen, dass sie an der richtigen Stelle angezeigt wird. Hoffentlich reicht das für den Anfang.
thedaian
6
Sollte die Koordinate "2,1" in Ihrem Beispiel nicht "2,0" sein?
Chris