Как конвертировать координаты мыши в координаты тайла?

Расположения тайла на экране считается по следующей формуле:
inline sf::Vector2f  tile2screen_pos(uint32_t  x, uint32_t  y) {
		return sf::Vector2f((m_tile_size / 2 * static_cast<float>(x)) + (m_tile_size / 2 * static_cast<float>(y)),
		                    (m_tile_size / 4 * static_cast<float>(y)) - (m_tile_size / 4 * static_cast<float>(x)));
	}

Прим.: Размер тайла (m_tile_size) равен 40px. Из них по высоте сам тайл занимает нижние 20px. Поэтому деления на 4.

Пытался считать следующим образом:
inline sf::Vector2u  screen2tile_pos(int32_t  x, int32_t  y) {
		return sf::Vector2u(
			(x / m_tile_size / 2 + y / m_tile_size / 2),
			(x / m_tile_size / 4 + y / m_tile_size / 4)
		);
	}

Однако, тайл выбирается далеко сверху-слева.
PS код вызова screen2tile_pos:
m_selection = this->screen2tile_pos(event.mouseButton.x + m_camera.getViewport().left, event.mouseButton.y + m_camera.getViewport().top);
  • Вопрос задан
  • 379 просмотров
Решения вопроса 1
DrMGC
@DrMGC Автор вопроса
Используя системы уравнения, удалось вывести следующее:

int  xs, ys; // Координаты на экране
unsigned int  xt, yt; // Координаты Тайлов
const int  T; // Размер тайла


Если
xs = (T / 2 * static_cast<float>(xt)) + (T / 2 * static_cast<float>(yt));
ys = (T / 4 * static_cast<float>(yt)) - (T / 4 * static_cast<float>(xt));


Тогда:
xt = (xs - ys) / T;
yt = (xs + ys) / T;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Olej
@Olej
инженер, программист, преподаватель
Мало понятно о чём вопрос ... но:
m_tile_size / 2 * static_cast(x) и x / m_tile_size / 2 - это записаны совершенно разные вещи.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы