Estive procurando uma fórmula para plotar azulejos isométricos (mundo-> tela) e escolher mouse (mundo-> tela) em um mundo em forma de diamante. Os que eu tentei sempre parecem estar bem. Qual é a maneira usual / correta de fazer isso?
Estive procurando uma fórmula para plotar azulejos isométricos (mundo-> tela) e escolher mouse (mundo-> tela) em um mundo em forma de diamante. Os que eu tentei sempre parecem estar bem. Qual é a maneira usual / correta de fazer isso?
Respostas:
Com base no seu comentário, eis o código que estou usando para converter os valores x, y do bloco em coordenadas na tela. Agora, ele não leva em conta "blocos 3d", tudo é considerado como estando no mesmo plano; portanto, se você estiver escrevendo um jogo onde isso importa, esse código não 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;
}
point é simplesmente uma estrutura contendo x e y ints, TILE_WIDTH seria 64 no seu caso, TILE_DEPTH é meio que mal nomeado (na verdade, é a altura dos gráficos do bloco), mas seria 32 no seu caso. As compensações são se você deseja que seu mapa de blocos "inicie" em um local x, y diferente (como se você deseja que os blocos estejam acima de outro conjunto de blocos). Normalmente, o deslocamento pode ser 0,0.
Isso irá gerar um mapa com 0,0 no topo, no meio, assim:
0,0
0,1 1,0
0,2 1,1 2,1
Quanto à localização do bloco x, y do 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;
Nesse pedaço de código, mX e mY são as coordenadas da tela do mouse, que estamos combinando com os valores da câmera para descobrir onde estamos nas "coordenadas mundiais". Tudo o resto é igual ao exemplo de código anterior.
Mais uma vez, isso pressupõe um mapa de blocos 2D isométrico plano. Há algum trabalho adicional se você quiser usar uma visualização semi-3d do mapa, e tudo isso pressupõe que você esteja trabalhando em 2D de qualquer maneira.