Я пишу изометрическую 2D-игру, и мне трудно точно определить, на какой плитке находится курсор. Вот рисунок:
где xs и ys - координаты экрана (в пикселях), xt и yt - координаты элемента мозаичного изображения, W и H - ширина элемента мозаичного изображения и высота элемента в пикселях соответственно. Моя запись для координат (у, х), которая может сбивать с толку, извините за это.
Лучшее, что я мог понять, это:
int xtemp = xs / (W / 2);
int ytemp = ys / (H / 2);
int xt = (xs - ys) / 2;
int yt = ytemp + xt;
Это кажется почти правильным, но дает мне очень неточный результат, затрудняет выбор определенных плиток, или иногда он выбирает плитку рядом с той, на которой я пытаюсь щелкнуть. Я не понимаю почему, и я хотел бы, чтобы кто-нибудь помог мне понять логику этого.
Спасибо!
У меня была такая же проблема для игры, которую я писал. Я предполагаю, что эта проблема будет отличаться в зависимости от того, как именно вы внедрили свою изометрическую систему, но я объясню, как я решил проблему.
Я впервые начал с моей функции tile_to_screen. (Я предполагаю, что именно так вы и размещаете плитки в нужном месте.) Эта функция имеет уравнение для вычисления screen_x и screen_y. Моя выглядела так (питон):
Я взял эти два уравнения и превратил их в систему линейных уравнений. Решите эту систему уравнений любым методом, который вы выберете. (Я использовал метод rref. Кроме того, некоторые графические калькуляторы могут решить эту проблему.)
Окончательные уравнения выглядели так:
Как видите, это не так просто, как исходное уравнение. Но это хорошо работает для игры, которую я создал. Слава Богу за линейную алгебру!
Обновить
После написания простого класса Point с различными операторами я упростил этот ответ до следующего:
источник
Вы используете хорошую систему координат. Все становится намного сложнее, если вы используете шахматные столбцы.
Одним из способов решения этой проблемы является то, что у вас есть функция для преобразования (xt, yt) в (xs, ys). Я последую ответу Тейна и позвоню
map_to_screen
.Вы хотите обратную функцию. Мы можем это назвать
screen_to_map
. Обратные функции имеют следующие свойства:Эти две вещи полезны для модульного тестирования, если у вас есть обе функции. Как ты пишешь обратное? Не у всех функций есть обратные, но в этом случае:
Не забудьте проверить, что обратная + оригинальная функция возвращает ответ, с которого вы начали. Тейн проходит оба теста, если вы
+ TILE_HEIGHT/2
уберете смещение рендера. Когда я решил алгебру, я придумал:который я считаю такой же, как у Тейна
screen_to_map
.Функция превратит координаты мыши в поплавки; используйте
floor
для преобразования их в целочисленные координаты плитки.источник