Я искал формулу для построения (мир-> экран) и выбора мыши (мир-> экран) изометрических плиток в ромбовидном мире. Те, которые я пробовал, всегда, кажется, выключены. Какой обычный / правильный способ сделать это?
Я искал формулу для построения (мир-> экран) и выбора мыши (мир-> экран) изометрических плиток в ромбовидном мире. Те, которые я пробовал, всегда, кажется, выключены. Какой обычный / правильный способ сделать это?
Ответы:
Исходя из вашего комментария, вот код, который я использую для преобразования значений тайла x, y в экранные координаты. Теперь он не учитывает «3d плитки», все считается находящимся в одной плоскости, поэтому, если вы пишете игру, где это важно, этот код не будет работать.
//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 - это просто структура, содержащая x и y ints, TILE_WIDTH в вашем случае будет 64, а TILE_DEPTH имеет неправильное имя (на самом деле это высота мозаичного изображения), но в вашем случае это будет 32. Смещения, если вы хотите, чтобы ваша карта тайлов «начиналась» в другом месте x, y (например, если вы хотите, чтобы плитки были выше другого набора плиток). Обычно смещение может быть 0,0.
Это сгенерирует карту с 0,0 сверху, посередине, вот так:
0,0
0,1 1,0
0,2 1,1 2,1
Что касается нахождения плитки x, y курсора:
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;
В этом фрагменте кода mX и mY - это координаты экрана мыши, которые мы объединяем со значениями камеры, чтобы выяснить, где мы находимся в «мировых координатах». Все остальное такое же, как в предыдущем примере кода.
Еще раз, это предполагает плоскую 2-мерную изометрическую карту тайлов. Есть некоторая дополнительная работа, если вы хотите использовать полу-3d вид карты, и все это предполагает, что вы все равно работаете в 2D.