Hello, I’m working on simple isometric engine. But I don’t understand how to convert coords of objects from Tiled to cartesian coords. For example:
In file:
I’m using a simple formaula for drawing tiles:
screen.x = (map.x - map.y) * TILE_WIDTH_HALF;
screen.y = (map.x + map.y) * TILE_HEIGHT_HALF;
Could you please provide a formula for converting or a basic algorithm how work coords in Tiled?
Is your map “Isometric” or “Isometric (staggered)”? The coordinates work differently in each.
If it’s the regular isometric, the same question was asked just a few days ago:
[tiled-coords]
While working on an isometric map, Tiled’s Object layer’s Insert Point tool saves an X and Y property (100/90 that refers to the isometric plane). I have also noticed that Tiled also shows in the bottom label the corresponding tile column and row (4, 3) as well as the canvas x and y properties (2409, 94). When I save the isometric map, I open the file and look into the object layer and I see that for every object only the isometric X and Y coords are saved. How can I configure T…
It is “Isometric”. I saw that topic thanks. But I want to get exact coordinates (not column and row).
For example, in a file my object is represented:
<object id="7" x="154" y="36" width="50" height="50"/>
I think maybe to use column and row and a offset. But I can’t derive a correct formula for the offset.
This is the Tiled code that does the translation from isometric tile coordinates to pixels. As you can see here, the location depends on both x and y, as well as the map’s height.
QPointF IsometricRenderer::tileToScreenCoords(qreal x, qreal y) const
{
const int tileWidth = map()->tileWidth();
const int tileHeight = map()->tileHeight();
const int originX = map()->height() * tileWidth / 2;
return QPointF((x - y) * tileWidth / 2 + originX,
(x + y) * tileHeight / 2);
}
Thank you! I find it!
QPointF IsometricRenderer::pixelToScreenCoords(qreal x, qreal y) const
{
const int tileWidth = map()->tileWidth();
const int tileHeight = map()->tileHeight();
const int originX = map()->height() * tileWidth / 2; // it doesn't need in my code
const qreal tileY = y / tileHeight;
const qreal tileX = x / tileHeight;
return QPointF((tileX - tileY) * tileWidth / 2 + originX,
(tileX + tileY) * tileHeight / 2);
}
QPolygonF IsometricRenderer::pixelRectToScreenPolygon(const QRectF &rect) const
{
QPolygonF polygon;
polygon << QPointF(pixelToScreenCoords(rect.topLeft()));
polygon << QPointF(pixelToScreenCoords(rect.topRight()));
polygon << QPointF(pixelToScreenCoords(rect.bottomRight()));
polygon << QPointF(pixelToScreenCoords(rect.bottomLeft()));
return polygon;
}
My object has coords: X: 134.0, Y: -91.0
2 Likes