SFML, как изменить свойство прямоугольника при выполнении определенного условия - PullRequest
0 голосов
/ 04 апреля 2020

Итак, я только начал изучать SFML. Итак, я хочу взять вход х. И когда x = 1, цвет прямоугольника, который я создал, изменяется. Вот мой код:

#include <SFML/Graphics.hpp>
#include <iostream>
using namespace std;
int main()
{
     int x;

     sf::RenderWindow MW(sf::VideoMode(1200, 650), "Dominus", sf::Style::Close | 
     sf::Style::Titlebar);
     sf::RectangleShape bg(sf::Vector2f(1200.0f, 650.0f)); bg.setFillColor(sf::Color::Green);

     while (MW.isOpen()) {
         sf::Event evnt;
         while (MW.pollEvent(evnt)) {
             switch (evnt.type) {
             case sf::Event::Closed:
             MW.close(); break;
             } 
         }
        cin >> x;
        if (x == 1) {
            bg.setFillColor(sf::Color::Blue);
          }

        MW.clear();
        MW.draw(bg);          
        MW.display();
     }
     return 0;
}

Теперь проблема, с которой я сталкиваюсь, заключается в том, что окно не загружается должным образом. И когда я вытаскиваю 'cin' из l oop, я никак не могу принять какой-либо вклад.

1 Ответ

0 голосов
/ 04 апреля 2020

Вы можете использовать темы:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <mutex>
#include <thread>

int main() {
    std::mutex xmutex;
    int x = 0;
    std::thread thr([&]() {
        std::lock_guard<std::mutex> lock(xmutex);
        int x;
        std::cin >> x;
    });
    thr.detach();

    sf::RenderWindow MW(sf::VideoMode(1200, 650), "Dominus", sf::Style::Close | sf::Style::Titlebar);
    sf::RectangleShape bg(sf::Vector2f(1200.0f, 650.0f)); bg.setFillColor(sf::Color::Green);

    while (MW.isOpen()) {
        sf::Event evnt;
        while (MW.pollEvent(evnt)) {
            switch (evnt.type) {
            case sf::Event::Closed:
                MW.close(); break;
            }
        }

        {
            std::lock_guard<std::mutex> lock(xmutex);
            if (x == 1) {
                bg.setFillColor(sf::Color::Blue);
            }
        }

        MW.clear();
        MW.draw(bg);
        MW.display();
    }
}
...