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.1
和 SFML 3.0
之间有一些重大变化,但这些变化没有在 SFML 网站上列出。
有人可以让我知道如何编译上面的代码,并指出任何强调 SFML 2.5.1
和 SFML 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 的人有所帮助。
我从 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.1
和 SFML 3.0
之间有一些重大变化,但这些变化没有在 SFML 网站上列出。
有人可以让我知道如何编译上面的代码,并指出任何强调 SFML 2.5.1
和 SFML 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 的人有所帮助。