SFML 3.0编译提示FloatRect无intersects成员问题咨询
报错原因
SFML 3.0对sf::Rect类的API做了破坏性调整:原2.x版本中属于sf::Rect成员方法的intersects,在3.0版本中被移除,改为定义在sf命名空间下的全局自由函数,因此直接通过矩形实例调用.intersects()会触发找不到成员的编译错误。
代码适配方法
将原有的成员函数调用写法,替换为全局函数调用即可。SFML 3.0中sf::intersects接收两个矩形作为入参,返回值为std::optional<sf::FloatRect>:当两个矩形相交时返回包裹相交区域矩形的optional对象,不相交时返回空optional,可直接放在if条件中做布尔判断。
适配后的可正常编译的代码如下:
if(sf::intersects(playerRect.getGlobalBounds(), targetRect.getGlobalBounds())) window.close();
如果需要获取两个矩形的具体相交区域,可直接接收返回值使用:
if (auto overlapRect = sf::intersects(playerRect.getGlobalBounds(), targetRect.getGlobalBounds())) { // 可通过overlapRect->left/top/width/height访问相交区域的属性 window.close(); }
SFML 2.5.1与3.0版本差异参考
- 你拉取的SFML 3.0源码根目录下的
changelog.md文件是最准确的版本差异文档,所有破坏性变更、新增特性、API调整都按版本节点做了明确标注,无需单独查找官网公示内容 - 除了
intersects的调整外,几个高频适配踩坑点包括:原事件结构体中的按键编码拆分为物理扫描码和逻辑键值两个独立字段、资源加载类函数从返回bool+输出参数的形式改为返回expected类型、部分工具函数从类成员调整为全局constexpr函数 - 对照2.x教程/书籍编写代码遇到找不到类成员的报错时,可直接打开SFML对应模块的头文件检索目标函数名,3.0版本头文件附带了完整的接口注释,可直接查到正确的调用方式
内容的提问来源于stack exchange,提问作者DailyLearner
相关产品推荐
相关产品推荐

