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

Auteur Sujet: SFML et timer: pas d'effet  (Lu 6659 fois)

0 Membres et 1 Invité sur ce sujet

cortex024

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
SFML et timer: pas d'effet
« le: Juin 25, 2013, 02:03:37 pm »
Bonjour,

lorsque je bouge mon sprite comme ceci:

            app = new RenderWindow(panel_SFML.Handle);//myvideomode, "test");
            app.SetFramerateLimit(60);
            mytexture = new SFML.Graphics.Texture(myimage);
            mysprite = new Sprite(mytexture);

            while (app.IsOpen())
            {
                app.Clear();
                mysprite.Position = new SFML.Window.Vector2f(mysprite.Position.X + 1, 0);
                app.Draw(mysprite);

                app.Display();
            }

ça fonctionne bien, je vois mon sprite qui se déplace vers la droite.
Mais je ne veux pas rester coincer dans un app.isopen comme tous les exemples qu'on trouve.
Car je suis dans une windows form qui peut réaliser pleins d'autres actions.

j'essaie alors de me servir d'un timer; à chaque fois que le temps est écoulé, je passe dans la fonction qui fait ceci (exactement la même chose):

public void RunEvent(object source, ElapsedEventArgs e)
        {
            //MessageBox.Show("test" + mysprite.Position.X.ToString());
            app.Clear();
            mysprite.Position = new SFML.Window.Vector2f(mysprite.Position.X + 1, 0);
            app.Draw(mysprite);

            app.Display();

        }

rien ne se passe, le sprite ne se dessine même pas à l'écran, le panel reste gris.
en mode debug, je vois pourtant bien mon sprite créé, sa position qui évolue.

si je décommente le messagebox, je l'ai bien à l'écran.

je ne comprends pas ce qui coince et pourquoi tout ce qui est fait en dehors du windows.isopen n'apparait pas à l'écran!

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML et timer: pas d'effet
« Réponse #1 le: Juin 25, 2013, 02:47:23 pm »
Citer
si je décommente le messagebox, je l'ai bien à l'écran.
La message box est modale non ? Donc ça bloque toute l'appli le temps qu'elle est affichée, c'est normal non ?
Laurent Gomila - SFML developer

cortex024

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : SFML et timer: pas d'effet
« Réponse #2 le: Juin 25, 2013, 03:38:21 pm »
euhh... oui,

mais le MessageBox est juste là pour vérifier qu'on passait bien dans ma boucle, il est commenté sinon.  :-X
je vérifie aussi en mettant un point d'arrêt, on passe bien dans la boucle mais rien ne se passe à l'écran.

serait-il possible que ça vienne d'un appel inter-thread catché par SMFL?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML et timer: pas d'effet
« Réponse #3 le: Juin 25, 2013, 03:46:22 pm »
Dans ce cas...

Citer
si je décommente le messagebox, je l'ai bien à l'écran.

... pour moi ça veut dire que ça marche. Ca veut dire quoi alors ? Il se passe quoi sans la message box ?

Et au fait, il te faudrait un appel à app.DispatchEvents() non ?
Laurent Gomila - SFML developer

cortex024

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : SFML et timer: pas d'effet
« Réponse #4 le: Juin 25, 2013, 03:53:28 pm »
aie, je ne me suis pas relu effectivement cette phrase porte à confusion.  :-[

avec ou sans la messagebox, mon sprite ne s'affiche pas, mon panel ne prend même pas la couleur de fond noire, comme si vraiment rien ne se passait.

alors qu'exactement le même code, mais soit placé une fois (sans boucle et sans mouvement) lors du chargement de la page, ou lors d'un click de bouton de ma WinForm par exemple affiche bien mon sprite dans mon panel qui prend la couleur de fond noire.
ce même code placé dans les mêmes endroits dans une boucle while (window.isopen()) avec une évolution de la position fonctionne aussi.

par contre, rien du tout ne se passe si je place le code dans l'évènement de mon timer.
pourtant, je passe bien dedans (des points d'arrêt et/ou messagebox par exemple le confirme).

Citer
serait-il possible que ça vienne d'un appel inter-thread catché par SMFL?



edit: Et au fait, il te faudrait un appel à app.DispatchEvents() non ?

c'est quoi ça?

ps: SFML est tout nouveau pour moi.
« Modifié: Juin 25, 2013, 03:56:30 pm par cortex024 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML et timer: pas d'effet
« Réponse #5 le: Juin 25, 2013, 04:22:37 pm »
Citer
serait-il possible que ça vienne d'un appel inter-thread catché par SMFL?
Non. Par contre si ta fonction RunEvent est exécutée dans un thread, là ça va coincer.

Citer
Citer
Et au fait, il te faudrait un appel à app.DispatchEvents() non ?

c'est quoi ça?
C'est la fonction à appeler pour gérer les évènements de la fenêtre SFML. Même si tu n'es pas intéressé par ces évènements, il faut appeler la fonction pour que la fenêtre SFML puisse gérer ses évènements internes.
Laurent Gomila - SFML developer

cortex024

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Re : SFML et timer: pas d'effet
« Réponse #6 le: Juin 25, 2013, 05:50:59 pm »
Citer
Citer
Citer
Et au fait, il te faudrait un appel à app.DispatchEvents() non ?

c'est quoi ça?
C'est la fonction à appeler pour gérer les évènements de la fenêtre SFML. Même si tu n'es pas intéressé par ces évènements, il faut appeler la fonction pour que la fenêtre SFML puisse gérer ses évènements internes.

j'ai essayé, ça ne change rien.

Citer
serait-il possible que ça vienne d'un appel inter-thread catché par SMFL?
Non. Par contre si ta fonction RunEvent est exécutée dans un thread, là ça va coincer.

beh par défaut dans le runevent c'est un autre thread visiblement.
Car si j'essaie avec un controle classique hors SFML, d'agir dessus dans le runevent j'ai une erreur inter-thread.
Ça serait ça alors?


je vais essayer de régler le problème inter-thread sur un contrôle "normal", d'après ce que j'ai vu il faut passer par des deleguate.
Une fois que ça fonctionne j'essaierai de re-remplacer ça par mon sprite et autres éléments SFML.

merci pour ta réponse, si tu as d'autres idées de causes ;)
« Modifié: Juin 25, 2013, 05:57:23 pm par Laurent »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML et timer: pas d'effet
« Réponse #7 le: Juin 25, 2013, 05:57:39 pm »
Citer
merci pour ta réponse, si tu as d'autres idées de causes
C'est forcément à cause du thread ;)
Laurent Gomila - SFML developer

cortex024

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : SFML et timer: pas d'effet
« Réponse #8 le: Juin 25, 2013, 06:39:19 pm »
ça fonctionne avec mon image!
et après avoir retransformé ça fonctionne aussi avec mon sprite.

 8)

christophedlr

  • Full Member
  • ***
  • Messages: 153
    • Voir le profil
    • E-mail
Re : SFML et timer: pas d'effet
« Réponse #9 le: Juin 26, 2013, 11:57:42 am »
Laurent, tu parles du DispatchEvents ; c'est normal qu'il ne soit pas documenté ? Je ne le trouve pas dans ta doc. Et tu parles de l'utiliser, c'est la boucle qui le fait automatiquement d'habitudes ? Car même tes tutos ne parle pas de l'utiliser lol.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML et timer: pas d'effet
« Réponse #10 le: Juin 26, 2013, 12:08:14 pm »
Y a pas de tuto sur SFML.Net. Par contre c'est forcément mentionné dans la doc de l'API, puisque je la génère automatiquement.

C'est une fonction qui n'est pas dans l'API C++ puisque les évènements sont très différents en .Net.
Laurent Gomila - SFML developer