Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - trapster

Pages: [1]
1
Ben en fait la classe GraphicThread est sensée faire office de thread d'affichage d'un splashScreen le temps que mon thread principal fasse les initialisations nécessaire au programme (comme le chargement d'un niveau), du coup je n'aurai jamais deux threads qui agissent en même temps sur la même sf::RenderWindow

Bon en tout cas merci pour tes réponses plus que rapides ! Ça c'est du professionalisme  8)

2
Graphique / Re : [SFML 2.0] std::thread et sf::RenderWindow
« le: Mai 31, 2012, 04:59:54 pm »
Merci beaucoup ! Ça résout effectivement le problème !
Sinon un window.setActive(true) après le t.join() ne suffit pas pour réactiver la fenêtre depuis le thread principal ?

3
Graphique / [Résolu] [SFML 2.0] std::thread et sf::RenderWindow
« le: Mai 31, 2012, 04:46:24 pm »
Bonjour !

J'ai un programme qui créé un std::thread (norme C++11) qui exécute parallèlement une fonction modifiant ma sf::RenderWindow créée dans le thread principal depuis le thread secondaire... Sauf que lorsque je tente depuis le thread secondaire de, par exemple, dessiner une sf::RectangleShape, j'obtiens l'erreur suivante : Failed to activate the window's context

Voici un code minimal pour illustrer l'erreur :

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

class GraphicThread
{
        public:
                GraphicThread(sf::RenderWindow& window) : myWindowRef(window)
                {
       
                }

                void launch()
                {
                        sf::Clock clock;

                        sf::RectangleShape shape(sf::Vector2f(50, 50));
                        shape.setFillColor(sf::Color::Black);
                        shape.setOrigin(25, 25);

                        while(clock.getElapsedTime().asSeconds() < 10) {
                                shape.setRotation(clock.getElapsedTime().asSeconds() * 30.f);

                                myWindowRef.clear();
                                myWindowRef.draw(shape);
                                myWindowRef.display();
                        }
                }

                ~GraphicThread() {}

        private:
                sf::RenderWindow&        myWindowRef;
};

int main(int argc, char **argv)
{
        // Create window
        sf::RenderWindow window(sf::VideoMode(800, 600), "Threads");
        window.setVerticalSyncEnabled(true);

        // Create graphic thread
        GraphicThread gt(window);

        // Launch thread
        std::thread t(&GraphicThread::launch, &gt);

        // Thread join
        t.join();

        // Close window
        window.close();

        return 0;
}
 

Merci d'avance !

4
Merci, nickel !  ;D

Je savais qu'il existait une fonction de la sorte mais je savais pas où elle était !

5
Bonjour,

J'ai un programme banal dans lequel je change la vue de ma sf::RenderWindow principale. Lorsque l'utilisateur clique quelque part sur ma fenêtre, je récupère les coordonnées de la souris via sf::Mouse::getPosition(). Sauf que celles-ci ne sont pas affectées par la vue !

C'est à dire que je quelque soit la transformation que j'applique à ma vue, les coordonnées du coin en haut à gauche retournées par sf::Mouse::getPosition() seront toujours les même.

Y-a-t-il un moyen d'appliquer les transformations faites à ma vue aux coordonnées que je récupère ? J'ai essayer de manipuler la matrice de transformation de sf::View sans grand succès..

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

int main(int argc, char **argv)
{
    sf::RenderWindow window;

    sf::RectangleShape shape(sf::Vector2f(10, 50));
    shape.setFillColor(sf::Color::Black);

    // Create window
    window.setFramerateLimit(60);
    window.create(sf::VideoMode(1024, 768),
                  "Title",
                  sf::Style::Titlebar | sf::Style::Close,
                  sf::ContextSettings(0, 0, 8));

    sf::View view(window.getDefaultView());
    view.setCenter(0, 0);
    window.setView(view);

    // Rendering loop
    while(window.isOpen()) {

        // Poll event
        sf::Event event;
        while(window.pollEvent(event)) {

            // Want to quit
            if(event.type == sf::Event::Closed) {
                window.close();

            // Get mouse position
            } else if(event.type == sf::Event::MouseButtonPressed) {
                std::cout << view.getTransform().transformPoint((float) sf::Mouse::getPosition(window).x, (float) sf::Mouse::getPosition(window).y).x
                << ", "   << view.getTransform().transformPoint((float) sf::Mouse::getPosition(window).x, (float) sf::Mouse::getPosition(window).y).y
                << std::endl;
            }
        }

        // Render
        window.clear(sf::Color::White);
        window.draw(shape);
        window.display();
    }

    return 0;
}

 

Merci !

Pages: [1]