C++ SFML迭代渲染矩形问题:如何正确生成9×9迷宫图形
解决SFML数组内矩形形状位置不生效的问题
嘿,我看你在做9×9迷宫的时候遇到了个头疼的问题:单个矩形能正常改颜色和位置,但数组里的大部分矩形都不显示,只有右上角一个蓝色的。咱们来看看问题出在哪,怎么解决。
问题根源
你代码里的数组初始化有个容易踩的坑:
sf::RectangleShape tiles[81] = {sf::RectangleShape(sf::Vector2f(20, 20))};
在C++里,这种初始化方式只会给数组的第一个元素创建一个20×20的矩形,剩下的80个元素都是用默认构造函数生成的——默认矩形的大小是(0, 0),哪怕你设置了位置和颜色,它们也因为没有尺寸而无法被绘制出来,自然看不见。
修复方案
我们需要确保数组里的每一个矩形都被设置了正确的大小。最简单的方式是在循环里先给每个矩形设置尺寸,再处理颜色和位置。
修改后的完整代码
#include <SFML/Graphics.hpp> #include <iostream> int main() { sf::RenderWindow window(sf::VideoMode(1920, 1080), "Baphomet"); // 先声明数组,不做部分初始化 sf::RectangleShape tiles[81]; char maze[81] = { 0,0,0,0,0,0,0,0,0, 0,1,0,1,0,1,1,1,0, 0,1,0,1,0,1,0,1,0, 0,1,1,1,0,1,0,1,0, 0,0,0,1,0,1,0,1,0, 0,1,1,1,0,1,1,1,0, 0,0,0,1,0,0,0,1,0, 0,0,0,0,1,1,1,1,1, 1,0,0,0,0,0,0,0,0 }; int x; int y; for (int i = 0; i < 81; i++) { // 先给每个矩形设置20x20的大小 tiles[i].setSize(sf::Vector2f(20, 20)); // 处理颜色逻辑 if (maze[i] == 0) { tiles[i].setFillColor(sf::Color::Blue); } else if (maze[i] == 1) { tiles[i].setFillColor(sf::Color::Red); } // 计算并设置位置 x = (i % 9) * 20; y = (i / 9) * 20; std::cout << x << " " << y << std::endl; tiles[i].setPosition((float)x, (float)y); } while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } window.clear(); for (int i = 0; i < 81; i++) { window.draw(tiles[i]); } window.display(); } return 0; }
关键修改点
- 把数组声明改成
sf::RectangleShape tiles[81];,不再做部分初始化 - 在循环里增加
tiles[i].setSize(sf::Vector2f(20, 20));,确保每个矩形都有可见的尺寸 - 原有的颜色和位置计算逻辑是正确的,只要矩形有尺寸就能正常显示
这样修改后,每个矩形都会按照你设定的位置和颜色绘制出来,9×9的迷宫就能正常显示啦!
内容的提问来源于stack exchange,提问作者Constantine Freak
相关产品推荐
相关产品推荐

