You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SFML:为何vector中多个sf::RectangleShape仅最后一个应用设置尺寸?

解决SFML矩形容器仅最后一个尺寸生效的问题

嘿,我来帮你搞定这个SFML的小麻烦!你说循环创建的矩形只有最后一个有正确尺寸,结合你的代码来看,大概率是这几个原因之一:

1. 位置重叠造成的视觉错觉

你代码里用i*WEIGHT_RECTANGLE给每个矩形设X坐标,首先得吐槽下这个变量名——WEIGHT是“重量”的意思,应该是WIDTH_RECTANGLE(宽度)才对吧?😂 言归正传,如果这个变量的值小于等于你设置的矩形宽度200,后面的矩形就会叠在前面的上面,甚至完全盖住,看起来就像只有最后一个矩形有尺寸。

解决办法:

先把变量名改对,再给它设个比200大的值(比如220,留点间距看着舒服):

const float WIDTH_RECTANGLE = 220;

然后位置设置改成:

r.setPosition(i * WIDTH_RECTANGLE, 0);

2. 渲染时只画了最后一个矩形

如果你在渲染循环里偷懒了,比如只写了window.draw(rectangles.back());,那当然只会显示最后一个啊!

解决办法:

一定要遍历整个容器来绘制:

// 放到你的渲染循环里
for (const auto& rect : rectangles) {
    window.draw(rect);
}

3. 拷贝导致的小意外(概率低,但可以试试)

虽然SFML的RectangleShape是可以拷贝的,但有时候用push_back拷贝局部变量可能会有奇怪的问题(虽然很少见),你可以试试直接在容器里构造矩形:

解决办法:

用emplace_back直接创建,避免拷贝步骤:

std::vector<sf::RectangleShape> rectangles;
rectangles.reserve(N); // 提前留好内存,运行更快
for (int i = 0; i < N; i++) {
    rectangles.emplace_back(sf::Vector2f(200, 100));
    auto& r = rectangles.back(); // 拿到刚创建的矩形引用
    r.setOutlineColor(sf::Color::Red);
    r.setOutlineThickness(1);
    r.setPosition(i * WIDTH_RECTANGLE, 0);
    r.setFillColor(sf::Color(150, 50, 250));
}

快速验证方法

你可以在循环里加个打印,看看每个矩形的尺寸和位置是不是正确的:

for (int i = 0; i < N; i++) {
    // ... 你的创建代码 ...
    rectangles.push_back(r);
    std::cout << "第" << i << "个矩形:尺寸(" 
              << r.getSize().x << "," << r.getSize().y 
              << "),位置(" << r.getPosition().x << "," << r.getPosition().y << ")\n";
}

如果打印出来所有矩形尺寸都是200x100,那肯定是渲染或者位置重叠的问题;如果尺寸不对,那就要找找有没有其他代码偷偷改了矩形尺寸啦~

内容的提问来源于stack exchange,提问作者Joeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:21:09