Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C][SDL? API WINDOWS?] Vérifier qu'on a le focus

Avant un flip ecran

Sujet résolu
    10 février 2008 à 22:06:14

    Bonsoir! :D

    J'ai remarqué ques les programmes que je fais (voir ma signature) ont tendance à planter lorsque l'on change de fenêtre, ceci étant du au fait que j'essaye de "flipper" l'ecran alors que je n'ai plus le focus.

    Vous me direz de vérifier les evennement, pour voir si on a changé de fenetre. Ca ne marche pas trop trop bien, car si on change de fenêtre alors que le programme a déjà passé la partie "analyse des touches" et en est à autre chose... ca plante.

    Je voudrais donc faire un test avant chaque Flip(ecran); voir si j'ai le focus et donc si je peux afficher. Existe il une fonction simple pour faire ce test en SDL? Ou au pire, avec l'api windows? Encore que je préfererai éviter...

    Merci!
    • Partager sur Facebook
    • Partager sur Twitter
      11 février 2008 à 22:46:28

      Personne ne sait comment faire pour savoir si la fenêtre a ou non le focus?
      • Partager sur Facebook
      • Partager sur Twitter
        12 février 2008 à 12:00:22

        Regarde par , tu pourrait faire une fonction qui vérifie si tu a le focus et qui fait ce que tu veux ensuite.

        Voilou, excuse moi si ce n'est pas ça que tu cherche ^^ .
        • Partager sur Facebook
        • Partager sur Twitter
          12 février 2008 à 18:28:06

          Merci! :D
          Ca à l'air d'être ce qu'il me faut.
          Cependant, quand je fais ça :
          1. void Securised_Flip(SDL_Surface* ecran)
          2. {
          3.   if ((SDL_GetAppState() & SDL_APPINPUTFOCUS) == SDL_APPINPUTFOCUS)
          4.     Flip(ecran);
          5.   else
          6.     Pause();
          7. }
          Ca ne met jamais le jeu en pause quand même. La condition est toujours vraie, quoi que je fasse!

          Ou est ma faute? :o
          • Partager sur Facebook
          • Partager sur Twitter
            12 février 2008 à 18:53:41

            avec l'api windows:

            1. HWND hMenu = FindWindow(je_me_souviens_plus_des_parametres);
            2. SetForegroundWindow(hMenu);


            Ca donne le focus, donc si tu l'avais déjà, ben ca fait rien, et si tu l'avais pas... ben tu l'aura après :p
            • Partager sur Facebook
            • Partager sur Twitter
              12 février 2008 à 18:57:12

              Ca donne le focus?
              Ce n'est pas ce que je veux moi ^^
              Je ne veux pas forcer les gens à garder mon programme au premier plan, mais juste détecter S'IL est au premier plan.

              Mais merci quand même.
              • Partager sur Facebook
              • Partager sur Twitter
                12 février 2008 à 19:04:19

                Bon,je vais me pencher dessus.
                Pour que ca me serve, faut donc que je connaisse le handle de ma fenetre SDL (oui, j'ai vu, y'a aussi une fonction pour çà ^^ )

                Ca à l'air de fonctionner... cependant, s'il est possible de ne pas utiliser l'API windows et de garder la fonction SDL, je suis pour! J'attends encore un peu.

                Mais... MERCI!!!
                • Partager sur Facebook
                • Partager sur Twitter
                  12 février 2008 à 19:06:09

                  désolé, je ne connais rien à la SDL, il existe peu être une fonction qui remplit cet office dans cette API, mais là, je ne peux t'aider! :D
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 février 2008 à 20:02:44

                    euh... c'est fait exprès qu'il n'y ait pas "SDl_" devant le flip de ta fonction ? o_O Car chez moi ça marche très bien ^^ .

                    Edit: tu as oublier un "&" dans le if ^^ .
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 février 2008 à 20:04:49

                      Là n'est pas le problème (j'ai juste mal recopié ^^ ).
                      La condition est toujours vraie. Utiliserais je mal la condition sur les bits?
                      La fonction renvoie t-elle le bon truc?

                      Je cherche, mais je ne trouve pas...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 février 2008 à 20:07:46

                        Le code correct serait:
                        1. void Securised_Flip(SDL_Surface* ecran)
                        2. {
                        3.   if ((SDL_GetAppState() && SDL_APPINPUTFOCUS) == SDL_APPINPUTFOCUS)
                        4.     SDL_Flip(ecran);
                        5.   else
                        6.     Pause();
                        7. }


                        ^^
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 février 2008 à 20:14:12

                          Ah... zut! Non, deux & ca ne marche pas (condition toujours fausse).
                          Je viens d'aller voir le cours qui parle des evennements de l'ecran ou justement il y a une combinaison de flags, et il n'y a qu'un &.
                          C'est donc encore autre chose... pfff.
                          Merci pour ton aide tout de même!
                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 février 2008 à 20:37:52

                            Bizarre... chez moi sa marche o_O n'aurait tu pas un code, sur lequel je pourrait me pencher ?

                            Merci
                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 février 2008 à 21:03:21

                              non ici c'est bien un seul &

                              parce qu'on utilise l'opérateur bit à bit et non pas l'opérateur logique &&

                              mais le == n'est pas logique pour moi il faut le virer parce que ça ne sert à rien
                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 février 2008 à 21:09:46

                                Bon voici mon code que j'ai utiliser pour tester si on a le focus et effectuer une action (juste la fonction concerner) :
                                1. void Securised_Blit(SDL_Surface* ecran)
                                2. {
                                3.      SDL_Surface *mouton = NULL;
                                4.      mouton = IMG_Load("mouton.gif");
                                5.      SDL_Rect pos, pos1;
                                6.      pos.x = 0;
                                7.      pos.y = 0;
                                8.      pos1.x = 100;
                                9.      pos1.y = 100;
                                10.   if (SDL_GetAppState() & SDL_APPINPUTFOCUS)
                                11.     SDL_BlitSurface(mouton, NULL, ecran, &pos);
                                12.   else
                                13.     SDL_BlitSurface(mouton, NULL, ecran, &pos1);
                                14.     SDL_FreeSurface(mouton);
                                15. }


                                Si on a le focus on blit sur "pos", si on n'a pas le focus on blit sur "pos1".

                                PS: Un grand Bravo pour ton jeu, Scroll ;) .

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  12 février 2008 à 22:51:11

                                  Oui comme ça en effet, ça marche du tonnerre!
                                  Merci Nakio!
                                  Scroll va enfin pouvoir rester lancé sans planter une fois sur deux quand on change de fenêtre!!! :D
                                  Je vais enfin pouvoir sortir la nouvelle version. Quel bonheur!

                                  Merci! ;)
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  [C][SDL? API WINDOWS?] Vérifier qu'on a le focus

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown