Según su comentario, aquí está el código que estoy usando para convertir los valores de mosaico x, y en coordenadas de pantalla. Ahora, no tiene en cuenta las "fichas 3D", todo se considera que está en el mismo plano, por lo que si está escribiendo un juego donde eso importa, este código no funcionará.
//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;
}
El punto es simplemente una estructura que contiene entradas x e y, TILE_WIDTH sería 64 en su caso, TILE_DEPTH está mal nombrado (en realidad es la altura de los gráficos de mosaico), pero sería 32 en su caso. Los desplazamientos son si desea que su mapa de mosaicos "comience" en una ubicación x, y diferente (como si desea que los mosaicos estén por encima de otro conjunto de mosaicos). Típicamente el desplazamiento puede ser 0,0.
Esto generará un mapa con 0,0 en la parte superior, en el medio, así:
0,0
0,1 1,0
0,2 1,1 2,1
En cuanto a encontrar el mosaico x, y del cursor:
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;
En este fragmento de código, mX y mY son las coordenadas de la pantalla del mouse, que estamos combinando con los valores de la cámara para averiguar dónde estamos en las "coordenadas mundiales". Todo lo demás es igual que el ejemplo de código anterior.
Una vez más, esto supone un plano plano de mosaico isométrico 2D. Hay algún trabajo adicional si desea utilizar una vista semi-3d del mapa, y todo esto supone que está trabajando en 2d de todos modos.