Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'affichage fenêtre sous Xcode 6

yosemite xcode 6 sdl langage c

Sujet résolu
    13 juin 2015 à 1:07:58

    Bonjour,

    Je me trouve face à un problème embêtant, lorsque que je compile tout se passe bien la fenêtre se lance mais elle reste en fond quand je vais pour cliquer dessus, elle retourne directement en arrière plan.

    Je suis sous Mac OS X Yosemite et j'utilise Xcode 6.

    Je me permets de vous mettre mon code par la même occasion je sais pas si ça peut aider.

    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #undef main
    
    void Pause();
    
    int main(int argc, char *argv[]){
        SDL_Surface *ecran = NULL;
        SDL_Surface *img = NULL;
        SDL_Rect pos;
        
        SDL_Init(SDL_INIT_VIDEO);
        
        pos.x = 0;
        pos.y = 0;
        
        ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE);
        SDL_WM_SetCaption("Ma super fenetre à image", NULL);
    
        img = SDL_LoadBMP("lac_en_montagne.bmp");
        
        SDL_BlitSurface(img,NULL,ecran,&pos);
        SDL_Flip(ecran);
        
        Pause();
        SDL_FreeSurface(img);
        SDL_Quit();
        return EXIT_SUCCESS;
    }
    
    void Pause() {
        int continuer = 1;
        SDL_Event event;
        while(continuer) {
            SDL_WaitEvent(&event);
            switch(event.type){
                case SDL_QUIT:
                    continuer = 0;
                    break;
            }
        }
    }
    


    Je remercie toutes personnes susceptible de m'aider.

    -
    Edité par faKEEN 13 juin 2015 à 1:09:03

    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2015 à 18:59:09

      Salut,

      J'ai testé ton code dans un nouveau projet et effectivement moi aussi quand je lance la fenêtre elle se place automatiquement derrière.

      Par contre, je peux cliquer dessus, elle revient alors au premier plan.

      Mais quelque chose me dit que ça a à voir avec le focus de la fenêtre;

      Peut-être que tu peux le "set active" au démarrage ou quelque chose du genre.

      J'ai vu la fonction SDL_RaiseWindow, mais comme beaucoup d'autres fonctionnalités, c'est de la SDL2.

      Alors je vais être chiant, mais voilà : tu ferais mieux de passer à SDL2, qui est beaucoup mieux et qui t'évitera plein de petits problèmes de ce genre à l'avenir.

      La façon de l'installer est la même. Pour ce qui est du cours, il a beau être en SDL1.2, tu peux quand même le suivre : il doit y avoir 5 à 10% du contenu qui change quand on passe à SDL2, avec la doc de la SDL2 ainsi que le guide de migration 1.2 -> 2.0 tu devrais t'en sortir. ;)

      J'ai donc adapté ton programme pour SDL2, et magie, plus aucun problème... J'ai également rajouté pas mal de tests sur retour de fonction, pour savoir si tout se passait bien, à la création de l'écran, au chargement de l'image, etc...

      Le code est donc bien plus long, mais c'est très important pour éviter les fuites et débuguer plus facilement.

      #include <stdio.h>
      #include <stdlib.h>
      #include <SDL2/SDL.h>
      
      void Pause();
      
      int main(int argc, char *argv[]) {
          
          /* On initialise la SDL avant de faire quoi que ce soit avec */
          SDL_Init(SDL_INIT_VIDEO);
          
          /* On crée les fenêtres comme ceci (on laisse la position undefined pour placer au milieu de l'écran) */
          SDL_Window* ecran = SDL_CreateWindow("Ma super fenêtre à image",
                                   SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
                                   800, 600, SDL_WINDOW_RESIZABLE);
          
          if (ecran == NULL) {
              /* On affiche un message et on quitte si ecran vaut NULL pour une quelconque raison */
              printf("Error : %s\n", SDL_GetError());
              return EXIT_FAILURE;
          }
          
          /* On a désormais besoin d'un renderer */
          SDL_Renderer *renderer = SDL_CreateRenderer(ecran, -1, 0);
          /* Mettre SDL_RENDERER_ACCELERATED si on veut utiliser l'accélération matérielle */
          
          if (renderer == NULL) {
              /* On affiche un message et on quitte si renderer vaut NULL pour une quelconque raison */
              printf("Error : %s\n", SDL_GetError());
              return EXIT_FAILURE;
          }
      
          SDL_Surface* img = SDL_LoadBMP("lac_en_montagne.bmp");
          
          if (img == NULL) {
              /* On affiche un message et on quitte si img vaut NULL pour une quelconque raison */
              printf("Error : %s\n", SDL_GetError());
              return EXIT_FAILURE;
          }
          
          /* On crée une texture pour l'image (obligatoire et de toutes manières mieux optimisé que SDL 1.2) */
          SDL_Texture* imgTex = SDL_CreateTextureFromSurface(renderer, img);
          
          if (imgTex == NULL) {
              /* On affiche un message et on quitte si imgTex vaut NULL pour une quelconque raison */
              printf("Error : %s\n", SDL_GetError());
              return EXIT_FAILURE;
          }
          
          /* Position et taille de notre image à l'écran */
          SDL_Rect dest = {0, 0, img->w, img->h};
          
          /* SDL_RenderCopy est équivalent à SDL_BlitSurface */
          if (SDL_RenderCopy(renderer, imgTex, NULL, &dest) != 0) {
              /* Différent de 0, ça ne s'est pas bien passé */
              printf("Error : %s\n", SDL_GetError());
              return EXIT_FAILURE;
          }
      
          /* À la place de SDL_Flip */
          SDL_RenderPresent(renderer);
          
          Pause();
          SDL_FreeSurface(img);
          /* On détruit les nouveaux objets qu'on a créés par rapport à SDL 1.2 */
          SDL_DestroyTexture(imgTex);
          SDL_DestroyWindow(ecran);
          SDL_DestroyRenderer(renderer);
          /* ---------------------------------*/
          SDL_Quit();
          
          return EXIT_SUCCESS;
      }
      
      void Pause() {
          int continuer = 1;
          SDL_Event event;
          while(continuer) {
              SDL_WaitEvent(&event);
              switch(event.type){
                  case SDL_QUIT:
                      continuer = 0;
                      break;
              }
          }
      }

      Grâce à SDL_GetError(), je n'ai pas à me soucier de la nature du problème, j'aurai un message adapté à l'erreur qui vient de se produire. J'aurais pu faire une fonction pour afficher un message d'erreur plutôt que simplement répéter le bloc de code, maintenant que j'y repense.

      N'hésite pas à me dire s'il y a quoi que ce soit ;)

      -
      Edité par eldoir 14 juin 2015 à 0:54:44

      • Partager sur Facebook
      • Partager sur Twitter
      Heureux l'étudiant qui, comme la paisible rivière, suit toujours son cours sans jamais quitter son lit.
        14 juin 2015 à 0:52:15

        Merci à toi @eldoir, j'ai commencé par installer la SDL2 mais sachant que j'apprends encore le C, j'ai préféré installer la SDL 1.2 histoire de m'acclimater avec la bibliothèque et ensuite migrer vers la 2.0 quand j'aurai compris le fonctionnement. Je test le code et je te tiens au jus :)
        • Partager sur Facebook
        • Partager sur Twitter
          14 juin 2015 à 23:12:48

          Merci à toi ça fonction merci !
          • Partager sur Facebook
          • Partager sur Twitter
            14 juin 2015 à 23:22:40

            Super ! :)

            Bonne continuation du coup ;)

            -
            Edité par eldoir 14 juin 2015 à 23:22:50

            • Partager sur Facebook
            • Partager sur Twitter
            Heureux l'étudiant qui, comme la paisible rivière, suit toujours son cours sans jamais quitter son lit.

            Problème d'affichage fenêtre sous Xcode 6

            × 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