C++ SFML:如何成功地迭代渲染形状?

C++ SFML: How to successfully Iteratively render shapes?

我想迭代地创建一组不同颜色的矩形,并将它们显示在屏幕上的不同位置。这应该会产生一个由矩形组成的迷宫。

形状的位置应反映存储 9x9 迷宫的阵列。

我能够成功地创建一个单一的形状,改变它的颜色和位置。但是,当我尝试对数组内的形状执行相同操作时,它不起作用。屏幕右上角只生成一个蓝色矩形。

int main() {

sf::RenderWindow window(sf::VideoMode(1920, 1080), "Baphomet");
sf::RectangleShape tiles[81] = {sf::RectangleShape(sf::Vector2f(20, 20))};

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, 1, 0, 0, 0, 1, 0, 0,
                 0, 0, 1, 1, 1, 1, 1, 1, 0,
                 0, 0, 0, 0, 0, 0, 0, 0, 0};

int x;
int y;

for (int i = 0; i < 81; i++) {

    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;

}

如何让形状成功地改变它们对 x 和 y 变量的位置?

我认为主要问题是定义

sf::RectangleShape tiles[81] = {sf::RectangleShape(sf::Vector2f(20, 20))};

此处您仅显式初始化 first 元素 (tiles[0])。其余所有元素将只有默认构造的形状对象。

要将所有元素正确初始化为相同的值,请使用循环

for (auto& shape : tiles)
    shape = sf::RectangleShape(sf::Vector2f(20, 20));

或者使用向量

std::vector<sf::RectangleShape> tiles(81, sf::RectangleShape(sf::Vector2f(20, 20)));