Как настроить координаты мыши в изометрической координате плитки, чтобы компенсировать плитки ромбовидной формы?

Моя функция рисования выглядит так:

    for(std::size_t y = 0; y < mapSizeY; ++y)
{
for(std::size_t x = mapSizeX-1; x != static_cast<std::size_t>(-1); --x)
{
auto tile = GetTile(x,y);

int64_t xPos = (x * TILE_WIDTH / 2) + (y * TILE_WIDTH / 2);
int64_t yPos = (y * TILE_HEIGHT / 2) - (x * TILE_HEIGHT / 2);

xPos += camera.GetXOffset();
yPos += camera.GetYOffset();

yPos -= tile->z * TILE_HEIGHT/2; // everything is at height 1 for now

auto zoom = camera.GetZoomFactor();

xPos *= zoom;
yPos *= zoom;

if(xPos < 0-TILE_WIDTH*zoom || yPos < 0-TILE_HEIGHT*zoom)
continue;
if(xPos > GetScreenDimensions().x || yPos > GetScreenDimensions().y)
continue;

// x is up right
// y is down right

Blit(m_grass,{xPos,yPos,TILE_WIDTH*zoom,TILE_HEIGHT*zoom+TILE_HEIGHT/2*zoom});
}
}

Когда пользователь щелкает мышью, я пытаюсь получить координаты x, y плитки. Чтобы перевести координаты мыши в координаты карты, я делаю следующее:

        // x and y are the mouse coords
auto zoom = camera.GetZoomFactor();
auto xOffset = camera.GetXOffset();
auto yOffset = camera.GetYOffset();
int z = 1; // every tile is at height 1 for now

int32_t xTile = -(TILE_HEIGHT * (2 * xOffset * zoom + TILE_WIDTH * z * zoom - 2 * x) + 2 * TILE_WIDTH * (y - yOffset * zoom)) / (2 * TILE_HEIGHT * TILE_WIDTH * zoom);
int32_t yTile = (-2 * TILE_HEIGHT * xOffset * zoom + TILE_HEIGHT * TILE_WIDTH * z * zoom + 2 * TILE_HEIGHT * x - 2 * yOffset * TILE_WIDTH * zoom + 2 * TILE_WIDTH * y) / (2 * TILE_HEIGHT * TILE_WIDTH * zoom);

Я придумал выше решить мои позиции ничьей для х, у

Результаты, которые я получаю, отображаются на правильной плитке. Но проблема в том, что, если я щелкаю точку «на полпути» плитки, либо в координатах x, либо y, она приписывает ее следующей плитке (потому что это квадраты с прозрачными углами для придания формы «ромба»).

Как я могу настроить выше, чтобы компенсировать?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]