如何在SFML中创建可点击的精灵?

3

我一直在查看SFML文档,想要制作可点击的精灵,但是目前为止还没有找到任何相关内容。你们觉得能帮我解决这个问题吗?


SFML中目前没有类似于sf::ClickableSprite的东西,而且可能永远不会有 - SFML中当前类的列表。但是,您可以通过使用sf::Sprite对象和事件来获得此行为。这个想法很简单 - 一旦您获得了sf::Mouse::isButtonPressed(sf::Mouse::Left)事件,就检查鼠标是否在精灵内。如果是,则执行操作。当释放按钮时,您可以执行另一个操作(也许是撤消)。 鼠标类 - sjaustirni
1
那么我该如何检查鼠标是否在精灵中呢? - Skiddzie
1
有一个名为sf::Sprite::getGlobalBounds()的函数,它会返回精灵的位置和大小信息。还有一个叫做sf::Mouse::getPosition()的函数,用于获取鼠标当前的位置。只需要检查一下,如果鼠标的x坐标比精灵的X坐标大且小于精灵的X坐标加上宽度,就可以了。 - sjaustirni
1
if(sf::Mouse::getPosition(window).x > sprite.getGlobalBounds().left && sf::Mouse::getPosition(window).x < (sprite.getGlobalBounds().left + sprite.getGlobalBounds().width && sf::Mouse::getPosition(window).y > sprite.getGlobalBounds().top && sf::Mouse::getPosition(window).y < (sprite.getGlobalBounds().top + sprite.getGlobalBounds().height)) doAction(); - sjaustirni
2
以上有两点需要注意:(1)如果您正在使用视图,则需要将视图的位置添加到 sf::Mouse::getPosition(window),因为它获取相对于窗口坐标的鼠标位置;(2)您可以直接使用 sprite.getGlobalBounds().contains(mousePos)(可能在幕后执行相同的操作)。 - Chaosed0
@Chaosed0:是的,你说得对。完全忘记了这个。:D - sjaustirni
1个回答

9

目前SFML中没有像sf::ClickableSprite这样的东西,也许永远不会有。(在SFML当前类列表中查看)

但是,您可以使用sf::Sprite对象和事件来实现此行为。思路很简单-一旦获得sf::Mouse::isButtonPressed(sf::Mouse::Left)事件,检查鼠标是否在精灵内。如果是,则执行操作。当释放按钮时,您可以执行另一个操作(也许是撤消)。

有一个sf::Sprite::getGlobalBounds()函数,它返回精灵的位置和尺寸。还有一个sf::Mouse::getPosition()函数,它返回鼠标的当前位置。您可以使用sprite.getGlobalBounds().contains(mousePos)来检查鼠标是否在精灵内。

如果您正在使用视图,则需要将视图的位置添加到sf::Mouse::getPosition(window)中,因为它获取相对于窗口坐标的鼠标位置。

(感谢Chaosed0提供的其他注意事项。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接