Я пытаюсь создать размещение блоков с привязкой к сетке. Все работает, и в моей голове это должно обновить положение мыши относительно окна в каждом кадре правильно?
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.
Я надеюсь, что это имеет смысл
Вам нужно вызвать window.mapPixelToCoords()
чтобы преобразовать позицию пикселя в систему координат вашего представления.
sf::Vector2i pixel_pos = sf::Mouse::getPosition(window.mywindow);
sf::Vector2f coord_pos = window.mywindow.mapPixelToCoords(pixel_pos);
И как общий совет: не используйте публичных членов класса - mywindow
и playerSprite
не должны быть доступны снаружи.
position
не является sf::Vector2<float>
, таким образом, деление будет делением с float
и окончательный результат будет приведен только (с предупреждением) к назначению. Возможно, вы захотите использовать static_cast<int>(position.x)
. Я также советую вам использовать векторы вместо двух переменных x и y.