-
Salut j'essaie de faire fonctionner une méthode "update" dans un thread.
Je ne sais pas comment m'y prendre.
main.cpp
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Game.hpp"
struct Params {
Game g;
sf::RenderWindow *win;
};
int main(void) {
sf::RenderWindow window(sf::VideoMode(800,600), ".");
window.setFramerateLimit(60.f);
Game game;
sf::Thread thread(&Game::update, &game);
thread.launch();
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) window.close();
}
window.clear();
game.render(window);
window.display();
}
thread.terminate();
thread.wait();
return 0;
}
Game.hpp
#ifndef GAME_HPP
#define GAME_HPP
#include <SFML/Graphics.hpp>
#include <iostream>
class Game {
private:
sf::RectangleShape m_shape;
float angle = 0.f;
public:
Game() {
m_shape.setSize(sf::Vector2f(100.f,100.f));
m_shape.setFillColor(sf::Color::Red);
m_shape.setOrigin(50.f,50.f);
m_shape.setPosition(400,300);
}
void update() {
while (true) {
std::cout << "Update thread!\n";
m_shape.setRotation(angle++);
}
}
void render(sf::RenderTarget &window) {
window.draw(m_shape);
}
};
#endif // GAME_HPP
En fait ça ne fonctionne pas du tout.. Au lieu d'avoir "while (true)" je devrais avoir "while(window->isOpen())" ou quelque chose du genre.. Je ne sais pas comment.
-
En fait ça ne fonctionne pas du tout..
Il va falloir être un peu plus précis... ;)
Et pourquoi utilises-tu un thread ? Normalement tu ne devrais pas en avoir besoin pour faire ça.
-
EDIT : J'ai trouvé!
Ce code fonctionne.. il est beau à mes yeux mais je sais pas si je fait quelque chose de mal
#ifndef GAME_HPP
#define GAME_HPP
#include <SFML/Graphics.hpp>
#include <iostream>
class Game {
private:
sf::RenderWindow m_window;
sf::Clock m_clock;
sf::Time m_deltaTime;
sf::RectangleShape m_shape;
float m_angle;
public:
Game() {
sf::ContextSettings contextSettings;
contextSettings.antialiasingLevel = 8;
m_window.create(sf::VideoMode(800,600,32), "thread", sf::Style::Close, contextSettings);
m_window.setFramerateLimit(60.f);
m_window.setActive(false);
m_shape.setSize(sf::Vector2f(100.f,100.f));
m_shape.setFillColor(sf::Color::Red);
m_shape.setOrigin(50.f,50.f);
m_shape.setPosition(400,300);
m_angle = 0.f;
sf::Thread updateThread(&Game::update, this);
updateThread.launch();
while (m_window.isOpen()) {
sf::Event event;
while (m_window.pollEvent(event)) {
if (event.type == sf::Event::Closed) m_window.close();
}
}
}
void update() {
while (m_window.isOpen()) {
m_angle += 2;
m_shape.setRotation(m_angle);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) m_shape.move(-2,0);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) m_shape.move(2,0);
render();
sf::sleep(sf::seconds(1.f/60.f));
}
}
void render() {
m_window.clear();
m_window.draw(m_shape);
m_window.display();
}
};
#endif // GAME_HPP
-
Ce n'est pas l'angle total qu'il faut multiplier par le temps écoulé depuis la dernière frame, mais l'incrément (= la variation d'angle que tu appliques durant le temps mesuré).
m_shape.rotate(100 * m_deltaTime.asSeconds());
Ce code fonctionne.. il est beau à mes yeux mais je sais pas si je fait quelque chose de mal
Non effectivement c'est pas mal. C'est la façon standard de procéder pour s'affranchir du bloquage lors d'un déplacement ou redimensionnement de la fenêtre.
Par contre évite d'éditer tes posts pendant qu'on te répond, ça rend la conversation bizarre à suivre après ;)
-
Là je comprend ;) merci beaucoup. Donc comme ça, je n'ai pas besoin de sf::sleep
Et m_shape.rotate(100 * m_deltaTime.asSeconds());
c'est 100 degrés par seconde