РЕДАКТИРОВАТЬ Скорректированы все опубликованные алгоритмы. Сейчас работает ПОЧТИ без нареканий. Это только самые левые 9 плиток, на которых он не работает (изображение внизу). В большинстве случаев он выбирает совершенно неправильную плитку при наведении курсора на одну из этих девяти.
EDIT2 Теперь я почти уверен, что проблема связана с ошибками, когда screenX или screenY отрицательны, поэтому, вероятно, это связано с использованием math.abs на tilePixelX/Y, но это не может быть просто так, иначе результаты не были бы быть так далеко (хотя это вполне может способствовать)
Я делаю изометрическую игру и сейчас работаю над движком рендеринга карт. Теоретически это должно быть довольно просто, но я просто не могу получить координаты плитки по положению мыши.
Мои плитки 64 в ширину и 32 в высоту. Изображение показано ниже:
Моя карта отображается довольно хорошо:
Актуальная проблема описана вверху.
Вот код, который я использую прямо сейчас:
int screenX = sf::Mouse::getPosition(window).x - 250;
int screenY = sf::Mouse::getPosition(window).y - 250;
int tilex = floor((screenY / 32) + (screenX / 64));
int tiley = floor((screenY / 32) - (screenX / 64));
int tilePixelX = abs(screenX % 64); // I believe part of the problem
int tilePixelY = abs(screenY % 32); // is absoluting these. Not all though.
sf::Color mCol = mouseMap.getPixel(tilePixelX, tilePixelY);
if (mCol.r == 20)
tilex -= 1;
else if (mCol.r == 40)
tiley -= 1;
else if (mCol.r == 60)
tilex += 1;
else if (mCol.r == 80)
tiley += 1;
Теперь я использую карту мыши, которая работает фантастически, однако, как было сказано выше, она по-прежнему не работает на самых левых девяти плитках в ромбе (когда вы наводите на них курсор, она выбирает, казалось бы, случайную около 4-5 плиток или вообще не выбирает плитку). (Я предполагаю, что за пределами карты):
Это также показывает проблемные плитки, выделенные красным цветом.
Вот как выглядит карта, чтобы дать вам представление о том, как работает мой движок рендеринга. Обратите внимание, что прозрачные пиксели считаются пустыми, а черные пиксели считаются стенами (которые я не визуализировал для приведенного выше примера изображения, поэтому ни одна из плиток, отображаемых на изображении выше, не является 0-й колонкой или 0-й строкой, и при этом они не являются последний ряд.
Моя карта мыши определенно правильная, потому что большая часть карты работает, но в любом случае вот она:
Редактировать:
Я упаковал необходимые файлы и библиотеки DLL в zip-архив, чтобы вы могли запустить его и сами убедиться, что происходит:
https://dl.dropbox.com/u/37019412/Broken.zip
Формула рисования:
(x - y) * 32 + 250, (x + y) * 16 + 250
Где до запятой — X, после — Y, а внутри x и y — координаты плитки.