Получить смещение X и Y sf::View

Как я могу получить смещение X и Y sf::View, я использую sf::View в качестве моей 2D-камеры, поэтому, когда я щелкаю мышью, я получаю координаты мыши X и Y плитки, на которую я нажимаю

void LMButtonDown(int mX, int mY)
{
    printf("[%d][%d]\n", mX / TILE_SIZE, mY / TILE_SIZE);
}

Это здорово, но как только я перемещаю камеру sf::View, координаты, как и ожидалось, не учитывают смещение sf::View. Я не вижу никакой функции для получения X или Y в 1View.php" rel="nofollow">документации, поэтому я можно учесть для смещения. Любая помощь в этом будет оценена по достоинству.

Спасибо.


person Elgoog    schedule 05.05.2012    source источник


Ответы (1)


Взгляните на sf::RenderTarget::mapPixelToCoords и mapCoordsToPixel. . Вы можете использовать этот метод для преобразования координат из «вида» в «мировое» пространство и обратно. В документации конкретно упоминаются ваши потребности в качестве примера:

Эта функция находит 2D-позицию, которая соответствует заданному пикселю цели рендеринга. Другими словами, он делает обратное тому, что делает видеокарта, чтобы найти начальное положение отображаемого пикселя.

Существуют также перегруженные версии методов, которые принимают Vector2i и преобразуют его на основе view RenderTarget без необходимости вручную указывать представление.

Если по какой-то причине вы не можете использовать (или не имеете доступа) RenderTarget, то вы можете выполнить перевод вручную. Это должно быть довольно просто, пока ваш sf::View не выполняет масштабирование или вращение (то есть он выполняет только перемещение).

Чтобы получить верхний левый угол представления, вы просто берете центр, а затем вычитаете половину ширины и высоты. Затем вы переводите координаты мыши, используя верхний левый угол представления.

Что-то вроде этого:

// Somewhere else...
sf::View view;

void LMButtonDown(int mX, int mY)
{
    sf::Vector2f viewCenter = view.getCenter();
    sf::Vector2f halfExtents = view.getSize() / 2.0f;
    sf::Vector2f translation = viewCenter - halfExtents;

    mX += static_cast<int>(translation.x);
    mY += static_cast<int>(translation.y);

    printf("[%d][%d]\n", mX / TILE_SIZE, mY / TILE_SIZE);
}
person Zack The Human    schedule 05.05.2012
comment
Большое спасибо :) также отличное объяснение! Один вопрос, с которым вы можете мне помочь: почему, когда я нажимаю [0][0], я получаю [0][0], но когда я нажимаю [-1][0], я получаю [0][0], но нажатие на [-2][0] возвращает [-1][0] Если это имеет смысл, то только в отрицательных направлениях (верхняя часть и слева), но не снизу и справа. это похоже на две строки/столбца 0 вдоль y и x. :С - person Elgoog; 05.05.2012
comment
Звучит как интересный вопрос;) Было бы полезно увидеть часть задействованного кода; могу ли я предложить вам опубликовать отдельный вопрос с изложением этой интереснейшей проблемы? - person Zack The Human; 05.05.2012