SFML 3.0 'intersects' 函数

SFML 3.0 'intersects' function

我从 github 下载了最新的 SFML 3.0 源代码,并在 Windows 10 上使用 MinGW GCC 11.2 编译了它。我尝试从 [=28= 编译示例程序]SFML Essentials 书。

以下代码导致编译错误:

if(playerRect.getGlobalBounds().intersects(targetRect.getGlobalBounds()))
    window.close();
error: 'using FloatRect = class sf::Rect<float>' {aka 'class sf::Rect<float>'} has no member named 'intersects'
   43 |         if(playerRect.getGlobalBounds().intersects(targetRect.getGlobalBounds()))

看起来 SFML 2.5.1SFML 3.0 之间有一些重大变化,但这些变化没有在 SFML 网站上列出。

有人可以让我知道如何编译上面的代码,并指出任何强调 SFML 2.5.1SFML 3.0 之间区别的资源。

谢谢

SFML 3.0 中有 API 处与 SFML 2.5 不兼容的更改。例如VideoMode构造函数定义如下:

// SFML 2.5
VideoMode(unsigned int modeWidth, unsigned int modeHeight, unsigned int modeBitsPerPixel = 32);

// SFML 3.0
explicit VideoMode(const Vector2u& modeSize, unsigned int modeBitsPerPixel = 32);

因此下面的代码使用 SFML 2.5 可以很好地编译,但是当使用 SFML 3.0 时会抛出错误。

// compiles fine with SFML 2.5
sf::RenderWindow window(sf::VideoMode(640, 480), "SFML-Test");  

// Gives following error in SFML 3.0
// error: no matching function for call to 'sf::VideoMode::VideoMode(int, int)'

下面的 table 总结了将应用程序从 SFML 2.5 移植到 SFML 3.0 所需的更改。

SFML 2.5 SFML 3.0
sf::VideoMode(640, 480) sf::VideoMode({640,480})
shape.setOrigin(0, 0) shape.setOrigin({0, 0})
shape.setPosition(0, 0) shape.setPosition({0, 0})
shape.setRotation(90.) shape.setRotation(sf::degrees(90.f))
rect1.getGlobalBounds().intersects(rect2.getGlobalBounds()) rect1.getGlobalBounds().findIntersection(rect2.getGlobalBounds())

以上列表为non-exhaustive。我只列出了到目前为止我使用 SFML 3.0.

学到的东西

同样在 SFML 3.0 中,如果我们忽略 Texture::loadFromImage 的 return 值,我们会收到一条很好的警告消息,这要归功于 C++17 [[nodiscard]] 属性。

sf::Texture texture;
texture.loadFromImage("sprite.png");  // no warning in SFML 2.5

// SFML 3.0 gives following warning
// warning: ignoring return value of 'bool sf::Texture::loadFromFile(const std::filesystem::__cxx11::path&, const IntRect&)', declared with attribute 'nodiscard'

希望这对想要将其应用程序从 SFML 2.5/2.6 移植到 SFML 3.0 的人有所帮助。