【问题标题】:C++ SFML: How to successfully Iteratively render shapes?C++ SFML:如何成功地迭代渲染形状?
【发布时间】:2019-06-04 03:20:16
【问题描述】:

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

形状的位置应反映存储 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 变量?

【问题讨论】:

    标签: c++ arrays graphics sfml


    【解决方案1】:

    我认为主要的问题是定义

    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)));
    

    【讨论】:

    • @ConstantineFreak 您也可以考虑只使用一个矩形,以免有 81 个不同的矩形(内存)。在这种情况下,渲染一个矩形,然后将其移动到下一个位置。
    • 哦,我明白了,所以我可以将一个矩形移动到一个位置,绘制它,然后将它移动到别处并再次绘制它。那么当我显示窗口时,绘制矩形的所有位置都会正确显示吗?太好了。
    • @ConstantineFreak 是的,可以这样做。这也是一种权衡,你是想快一点但使用更多内存,还是使用更少内存但使用更多 CPU 能力?虽然在这种情况下,额外的内存或 CPU 能力的数量可以忽略不计,而且基本上无法测量。
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2014-01-06
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多