Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Problème lors du déplacement de la fenêre  (Lu 10660 fois)

0 Membres et 1 Invité sur ce sujet

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Problème lors du déplacement de la fenêre
« le: Avril 17, 2012, 10:53:11 pm »
Bonjour,

Alors voilà tout d'abord je ne sais pas si ce post est à mettre dans la partie Graphique ou Fenêtre mais j'ai choisi le forum Fenêtrage car le problème est en lien avec ceci.

Donc j'ai un problème lorsque je clique sur la barre de la fenêtre ou lorsque je la déplace. En effet, je gère la collision d'un sprite et lorsque je fais une des 2 actions ci-dessus, le système de collision est comme "endormi" c'est-à-dire qu'il ne marche plus jusqu'à ce que j’arrête de cliquer ou déplacer la fenêtre.
Voici un code qui fait cela :

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

int main()
{
        sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Window");

        sf::Image Image, image2;
        if (!Image.LoadFromFile("test.png"))
                return EXIT_FAILURE;

        image2.LoadFromFile("test2.png");

        sf::Sprite Sprite(Image);
        //Sprite.SetBlendMode(sf::Blend::None);
        Sprite.SetPosition(200.f, 500.f);

        int ok = 0;
        int descente = 0;
        int v = 0;

        sf::Image BackgroundImage;
    if (!BackgroundImage.LoadFromFile("background.jpg"))
        return EXIT_FAILURE;

        while (App.IsOpened())
        {
                sf::Event Event;
                while (App.GetEvent(Event))
                {
                        if (Event.Type == sf::Event::Closed)// Fenêtre fermée
                                App.Close();
                        if(Event.Type == sf::Event::KeyPressed && Event.Key.Code == sf::Key::Up)
                                ok = 1;
                        if(Event.Type == sf::Event::KeyPressed && Event.Key.Code == sf::Key::Down)
                        {
                                sf::Sprite s;
                                s.SetImage(image2);
                                Sprite = s;
                        }
                }

               
                float ElapsedTime = App.GetFrameTime();
               
                if (App.GetInput().IsKeyDown(sf::Key::Right)) Sprite.Move( 110 * ElapsedTime, 0);
                if (App.GetInput().IsKeyDown(sf::Key::Left)) Sprite.Move( -110 * ElapsedTime, 0);

                if(ok == 1)
                {
                        if(descente == 0)
                        {
                                if(Sprite.GetPosition().y > 425)
                                {
                                        Sprite.Move(0, (-100+v) * ElapsedTime);
                                        v -= 1;
                                }
                                else
                                {
                                        descente = 1;
                                }
                        }
                        else
                        {
                                if(Sprite.GetPosition().y < 500)
                                {
                                        Sprite.Move(0, (100+v) * ElapsedTime);
                                        v += 1;
                                }
                                else
                                {
                                        descente = 0;
                                        ok = 0;
                                        v = 0;
                                }
                        }
                               
                }

                App.Clear();

                App.Draw(Sprite);

                App.Display();
        }

        return EXIT_SUCCESS;
}
 
C'est un code que j'avais fait pour tester la SFML pour la première fois.
Savez-vous comment régler le problème car, à moins d'imposer le fullscreen, si l'utilisateur bouge la fenêtre le sprite et les pnj du jeu passeront à travers les murs ?

Merci.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #1 le: Avril 18, 2012, 08:18:40 am »
Il n'y a pas que les collisions qui sont bloquées, c'est tout ton thread principal qui l'est. La seule façon de continuer à tourner pendant le déplacement / redimensionnement de la fenêtre, c'est d'avoir du code dans un autre thread que celui qui gère les évènements.
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #2 le: Avril 18, 2012, 09:59:01 am »
Oui enfin là c'était pour l'exemple et merci pour la précision.
Mais dans ce cas, pour que l'application continue normalement, dois-je copier le thread principal dans le thread secondaire ? Et faut-il l'activer dès que le thread principal est bloqué (si on peut savoir) ?

EDITE: Ou peut-être faut il juste appeler la fonction collision et l'associer au thread secondaire ?
« Modifié: Avril 18, 2012, 10:04:57 am par yusera »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #3 le: Avril 18, 2012, 10:30:09 am »
Après tu t'organises comme tu veux, ça dépend de ton application, mais en gros la c'est la fonction GetEvent qui va bloquer ; donc tout ce que tu veux qui ne bloque pas, il faut que ce soit dans un autre thread que celui qui appelle GetEvent.
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #4 le: Avril 18, 2012, 11:11:31 am »
OK merci !
En fait, je dois faire "tourner" le thread secondaire tout le temps ?

J'ai une dernière question :
Est ce que le fait de faire une classe Thread secondaire fait la même chose que créer un sf::Thread et d'appeler une fonction qui  tourne en boucle du type :
void Fonction(void* UserData)
{
    bool value(true);
    while(value)
    {
        // Si on veut arreter la boucle
        value = false;
    }
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #5 le: Avril 18, 2012, 11:15:39 am »
J'ai pas très bien compris ta question.

Mais est-ce que tu es à l'aise avec les threads ? C'est un peu dangereux de les utiliser sans bien maîtriser le sujet -- même si je sais bien que c'est la seule solution pour régler ce problème-là.
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #6 le: Avril 18, 2012, 11:35:56 am »
À vrai dire, je ne m'en suis jamais servi.
En fait si j'ai bien compris son principe, il permet de faire d'autres instructions en même temps que le thread principal.
Mais dans les exemples du tutoriel, il ne fait qu'afficher 10 fois "Je suis le thread numero 1". Or je veux l'utiliser pour gérer les collisions, donc je dois bien le faire tourner en boucle vu que l'on appelle qu'une seule fois la fonction Launch() ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #7 le: Avril 18, 2012, 12:25:17 pm »
Oui c'est ça, ton thread secondaire doit boucler indéfiniment, de manière parallèle à la boucle d'évènements.
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #8 le: Avril 18, 2012, 02:38:57 pm »
Merci pour la réponse !
Mais comment fait-on pour passer un paramètre à la fonction car j'aimerai qu'elle est accès au sf::RenderWindow ? J'ai du mal à utiliser le code du tutoriel suivant :
void ThreadFunction(void* UserData)
{
    // Transtypage du paramètre en son type réel
    MyClass* Object = static_cast<MyClass*>(UserData);
}

En gros, je devrais faire :
int Classe::Run(sf::RenderWindow &App)
{
        Running = true;
        sf::Thread Thread(&ThreadFonction, &App);
        Thread.Launch();

        while(Running)
        {
       
        }
        //....
}

void Classe::ThreadFonction(void *UserData)
{
        sf::RenderWindow* App = static_cast<sf::RenderWindow*>(UserData);
        while(Running)
        {
       
        }
}
 

Mais ça ne marche pas, j'ai une erreur :
error C2276: '&' : opération non conforme sur l'expression d'une fonction membre liée

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #9 le: Avril 18, 2012, 02:48:46 pm »
Lis le tutoriel, c'est expliqué.
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #10 le: Avril 18, 2012, 03:15:01 pm »
C'est ce que j'ai fait mais là je trouve pas ... Ça bloque ici:
sf::Thread Thread(&ThreadFonction, &App);
Avec l'erreur sur mon post précédent.

Faut-il obligatoirement que la fonction ThreadFonction(void* UserData) soit globale ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #11 le: Avril 18, 2012, 03:22:55 pm »
Il faut utiliser ll'approche décrite dans le paragraphe "Utilisation de sf::Thread en tant que classe de base". La première approche ne marche que pour les fonctions non-membres.
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #12 le: Avril 18, 2012, 05:00:31 pm »
Merci beaucoup !
Et donc vu que je gère le déplacement du personnage & ceux des pnj, je dois utiliser des pointeurs dans le thread pour qu'ils pointent vers le perso, les pnj et le sf::RenderWindow pour les utiliser ?
Ça me parait être le seul moyen ...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #13 le: Avril 18, 2012, 05:03:19 pm »
Pas forcément, tu peux accéder à n'importe quelle variable depuis un thread, pas besoin de lui passer en paramètre.
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #14 le: Avril 19, 2012, 10:23:48 am »
Oui mais dans mon cas, j'utilise cette methode (http://www.sfml-dev.org/wiki/fr/tutoriels/multiecransjeu) pour gérer un menu, l'interface de jeu etc...
Et donc de cette façon, je devrais hériter la classe Screen de sf::Thread ? Car au début, j'étais parti pour créer un membre sf::Thread d'une classe Jeu qui hérite de Screen. Or dans ce cas là, je ne pouvais pas accéder aux autres membres de la classe Jeu (c'est à dire le personnage, les pnj ...)