Положение мыши с прокруткой экрана в SFML

0

Я пытаюсь создать размещение блоков с привязкой к сетке. Все работает, и в моей голове это должно обновить положение мыши относительно окна в каждом кадре правильно?

sf::Vector2i position = sf::Mouse::getPosition(window.mywindow);

//get position
int xSnap = (position.x / gridWidth) * gridWidth;
int ySnap = (position.y / gridHeight) * gridHeight;

Но у меня также есть прокрутка экрана, используя

if (player.playerSprite.getPosition().x + 16 > screenDimensions.x / 2)
        position.x = player.playerSprite.getPosition().x + 16;
    else
        position.x = screenDimensions.x / 2;

    //Y
    if (player.playerSprite.getPosition().y + 16 > screenDimensions.y / 2)
        position.y = player.playerSprite.getPosition().y + 16;
    else
        position.y = screenDimensions.y / 2;

Когда экран прокручивается в любом направлении от исходного положения, он не обновляет положение мыши, поэтому, например, можно сказать, что размер окна составляет 800x600, в этом окне 800x600 положение работает нормально, но позволяет сказать, что мой спрайт перемещается на 200 пикселей справа (он начинает прокрутку когда спрайт достигает середины экрана) мимо исходного положения, объект im, помещающий с помощью этого кода, появляется 200px слева от мыши. То же самое происходит с осью y.

Я надеюсь, что это имеет смысл

  • 0
    В чем вопрос?
Теги:
grid
scroll
sfml
mouse

1 ответ

3

Вам нужно вызвать window.mapPixelToCoords() чтобы преобразовать позицию пикселя в систему координат вашего представления.

sf::Vector2i pixel_pos = sf::Mouse::getPosition(window.mywindow);
sf::Vector2f coord_pos = window.mywindow.mapPixelToCoords(pixel_pos);

И как общий совет: не используйте публичных членов класса - mywindow и playerSprite не должны быть доступны снаружи.

  • 0
    Спасибо, это похоже на работу, однако я больше не получаю функцию привязки к сетке, она просто следует за мышью вместо привязки. есть идеи почему?
  • 0
    Скорее всего, поскольку position не является sf::Vector2<float> , таким образом, деление будет делением с float и окончательный результат будет приведен только (с предупреждением) к назначению. Возможно, вы захотите использовать static_cast<int>(position.x) . Я также советую вам использовать векторы вместо двух переменных x и y.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню