C ++ SFML: как успешно итеративно отображать фигуры? - PullRequest
0 голосов
/ 09 января 2019

Я хочу, чтобы итеративно создать набор прямоугольников разных цветов и отобразить их на экране в разных положениях. Это должно создать лабиринт из прямоугольников.

Позиции фигур должны отражать массив, в котором хранится лабиринт 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?

1 Ответ

0 голосов
/ 09 января 2019

Я думаю, что главной проблемой является определение

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

Здесь вы явно инициализируете только первый элемент (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)));
...