Ошибка The content view is not a valid SFOpenGLView. Почему?
Пишу игру на SFML. Создал свой класс кнопки и пытаюсь отслеживать нажатие в другом потоке. Возникает ошибка.
Создаю потоки для метода одного и того же класса, но для разных экземпляров.
SpriteButton BTN_two_players(window, T_two_players_btn_upr, T_two_players_btn_pr);
BTN_two_players.SetRect(sf::IntRect(0, 0, 256, 128));
BTN_two_players.SetPosition(220, 260 + 128);
sf::Thread TH_BTN_two_players(&SpriteButton::CheckPressed, &BTN_two_players);
SpriteButton BTN_single_player(window, T_single_player_btn_upr, T_single_player_btn_pr);
BTN_single_player.SetRect(sf::IntRect(0, 0, 256, 128));
BTN_single_player.SetPosition(220, 250);
sf::Thread TH_BTN_single_player(&SpriteButton::CheckPressed, &BTN_single_player);
После этого запускаю эти методы:
TH_BTN_two_players.launch();
TH_BTN_single_player.launch();
И проверяю, не нажаты ли кнопки:
while (window.isOpen()) {
sf::Event event;
if (BTN_single_player.IsButtonPressed()) {
TH_BTN_single_player.terminate();
TH_BTN_two_players.terminate();
window.close();
Snd_game_begin.play();
SinglePlayer single_player_mode(cell_cnt, cell_size, boarder_size);
single_player_mode.Start();
return;
}
if (BTN_two_players.IsButtonPressed()) {
TH_BTN_single_player.terminate();
TH_BTN_two_players.terminate();
window.close();
Snd_game_begin.play();
TwoPlayersMode two_players_mode(cell_cnt, cell_size, boarder_size);
two_players_mode.Start();
return;
}
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
TH_BTN_single_player.terminate();
TH_BTN_two_players.terminate();
window.close();
}
}
window.clear(sf::Color(50, 50, 50));
window.draw(S_logo);
window.draw(BTN_single_player.GetButton());
window.draw(BTN_two_players.GetButton());
window.display();
}
Выдаёт ошибку, а я не понимаю, в чём дело:
The content view is not a valid SFOpenGLView
Вот класс SpriteButton:
class SpriteButton {
private:
bool is_pressed;
sf::Texture T_pressed;
sf::Texture T_not_pressed;
sf::Sprite button;
sf::RenderWindow& window;
public:
SpriteButton(sf::RenderWindow& win, sf::Texture not_pressed) : T_pressed(not_pressed), T_not_pressed(not_pressed), window(win) {
button.setTexture(T_not_pressed);
is_pressed = false;
}
SpriteButton(sf::RenderWindow& win, sf::Texture not_pressed, sf::Texture pressed) : T_pressed(pressed), T_not_pressed(not_pressed), window(win) {
button.setTexture(T_not_pressed);
is_pressed = false;
}
void SetRect(sf::IntRect rect) {
button.setTextureRect(rect);
}
void CheckPressed() {
sf::Vector2f size(button.getTextureRect().width * button.getScale().x,
button.getTextureRect().height * button.getScale().y);
while (!is_pressed) {
sf::Vector2i m_pos = sf::Mouse::getPosition(window);
bool inside = (m_pos.x <= button.getPosition().x + size.x && m_pos.x >= button.getPosition().x)
&& (m_pos.y <= button.getPosition().y + size.y && m_pos.y >= button.getPosition().y);
if (inside) button.setTexture(T_pressed);
else button.setTexture(T_not_pressed);
if (!sf::Mouse::isButtonPressed(sf::Mouse::Left) || !inside) continue;
while (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {}
m_pos = sf::Mouse::getPosition(window);
inside = (m_pos.x <= button.getPosition().x + size.x && m_pos.x >= button.getPosition().x)
&& (m_pos.y <= button.getPosition().y + size.y && m_pos.y >= button.getPosition().y);
is_pressed = inside;
}
}
bool IsButtonPressed() { return is_pressed; }
void SetPosition(float x, float y) { button.setPosition(x, y); }
void SetScale(float x, float y) { button.setScale(x, y); }
sf::Sprite& GetButton() { return button; }
};