Изометрия, неправильные координаты из формулы координат мыши.

РЕДАКТИРОВАТЬ Скорректированы все опубликованные алгоритмы. Сейчас работает ПОЧТИ без нареканий. Это только самые левые 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 — координаты плитки.


person Ashley Davies    schedule 26.05.2012    source источник


Ответы (2)


Глядя на учебник, кажется, что вам нужно вычесть 256 (224 плюс половина ширины) из координаты мыши. Расскажите нам, если это работает!

И, пожалуйста, не выделяйте динамически новый спрайт каждый раз, когда вы рисуете его, только для того, чтобы удалить его одним и тем же методом! Хорошо, я постараюсь воздержаться от дальнейших комментариев по вашему коду. ;)

person slartibartfast    schedule 26.05.2012
comment
Да, выделение было просто спешкой, чтобы сделать фактический код. Как только он полностью заработает, они будут в массиве класса карты :) - person Ashley Davies; 27.05.2012
comment
Я изменил его с 224 на 256, и единственное изменение заключается в том, что единственные, которые работали, теперь неверны на полтайла :( - person Ashley Davies; 27.05.2012
comment
Я просто добавил ссылку для загрузки, если вы хотите увидеть, как выглядит проблема визуально. - person Ashley Davies; 27.05.2012
comment
Я просто переписал вопрос, так как сейчас использую карту мыши, чтобы исправить большинство своих проблем. - person Ashley Davies; 27.05.2012
comment
@AshleyDavies, не могли бы вы показать, какие ячейки выбираются при помещении мыши в оранжевую область? Это может быть важно для диагностики. - person slartibartfast; 27.05.2012
comment
Это совершенно испорчено, выбирая совершенно неправильный выбор. Я поставлю ссылку для скачивания материала, чтобы запустить его, если хотите. Изменить: Хорошо, ссылка внизу вопроса - person Ashley Davies; 27.05.2012

В конце концов, это произошло из-за большого количества ошибок округления.

                if (screenX < 0 || tilePixelX < 0)
                    tilePixelX = 64 - abs(tilePixelX);
                if (screenY < 0 || tilePixelY < 0)
                    tilePixelY = 32 - abs(tilePixelY);
                if (tilePixelX >= 64)
                    tilePixelX = 63;
                if (tilePixelY >= 32)
                    tilePixelY = 31;

                if (screenX < 0 || screenY < 0)
                {
                    tilex--;
                    tiley++;
                }

Разобрался с этим, даже если местами это было немного некрасиво.

person Ashley Davies    schedule 28.05.2012