【问题标题】:Mouse position with screen scrolling in SFMLSFML 中屏幕滚动的鼠标位置
【发布时间】:2014-02-28 12:18:45
【问题描述】:

我正在尝试使用对齐网格创建块放置。一切正常,在我的脑海中,这应该更新鼠标相对于窗口的位置,对吗?

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 像素(当精灵到达屏幕中间时它开始滚动)超过原始位置,然后使用此代码放置的对象出现在鼠标左侧 200 像素处。 y 轴也是如此。

我希望这是有道理的

【问题讨论】:

  • 问题是什么?

标签: c++ grid scroll mouse sfml


【解决方案1】:

您需要调用window.mapPixelToCoords() 将像素位置转换为视图的坐标系。

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

作为一般建议:不要使用公共类成员 - mywindowplayerSprite 不应从外部访问。

【讨论】:

  • 谢谢,这似乎有效,但是我不再获得对齐网格功能,它只是跟随鼠标而不是捕捉。任何想法为什么?
  • 很可能是因为position 不是sf::Vector2<float>,因此除法将是float 除法,最终结果将仅在分配时强制转换(带有警告)。您可能想使用static_cast<int>(position.x)。我还建议您使用向量而不是两个 x 和 y 变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多