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
相关产品推荐
相关产品推荐

