Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL2 sur mac

Problème de bug d'affichage dans la fenêtre

Sujet résolu
    5 octobre 2021 à 19:02:32

    Bonjour,

    Je suis entrain de suivre un tutoriel sur le site de zesteDuSavoir pour SDL2 mais je suis arrivé à un moment ou il y un problème d'affichage entre mac et windows, il y a clairement un problème sur mac comme les images suivantes :

    Mac : 

     Image

    Windows : 

    Image

    Le code est le même : 

    • #include <stdlib.h>
      #include <stdio.h>
      #include <SDL.h>
      
      
      void pausee();
      void createWindows(SDL_Window* window,SDL_Surface* screenSurface);
      
      const int SCREEN_WIDTH = 640;
      const int SCREEN_HEIGHT = 480;
      
      int main(int argc, char *argv[])
      {
          SDL_Window *window = NULL;
          SDL_Renderer *renderer = NULL;
          SDL_Texture *texture = NULL;
          int statut = EXIT_FAILURE;
          SDL_Rect rect = {100, 100, 100, 100}, dst = {0, 0, 0, 0};
          SDL_Color rouge = {255, 0, 0, 255}, bleu = {0, 0, 255, 255};
      
          if(0 != SDL_Init(SDL_INIT_VIDEO))
          {
              fprintf(stderr, "Erreur SDL_Init : %s", SDL_GetError());
              goto Quit;
          }
          if(0 != SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_SHOWN, &window, &renderer))
          {
              fprintf(stderr, "Erreur SDL_CreateWindowAndRenderer : %s", SDL_GetError());
              goto Quit;
          }
          texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
                                      SDL_TEXTUREACCESS_TARGET, 200, 200);
          if(NULL == texture)
          {
              fprintf(stderr, "Erreur SDL_CreateTexture : %s", SDL_GetError());
              goto Quit;
          }
      
          SDL_SetRenderTarget(renderer, texture);
          /* La texture est la cible de rendu, maintenant, on dessine sur la texture. */
          SDL_SetRenderDrawColor(renderer, bleu.r, bleu.g, bleu.b, bleu.a);
          SDL_RenderClear(renderer);
          SDL_SetRenderDrawColor(renderer, rouge.r, rouge.g, rouge.b, rouge.a);
          SDL_RenderFillRect(renderer, &rect); /* On dessine un rectangle rouge sur la texture. */
      
          SDL_SetRenderTarget(renderer, NULL); /* Le renderer est la cible de rendu. */
      
          /* On récupère les dimensions de la texture, on la copie sur le renderer
             et on met à jour l’écran. */
          SDL_QueryTexture(texture, NULL, NULL, &dst.w, &dst.h);
          SDL_RenderCopy(renderer, texture, NULL, &dst);
          SDL_RenderPresent(renderer);
          statut = EXIT_SUCCESS;
          pausee();
      
      Quit:
          if(NULL != texture)
              SDL_DestroyTexture(texture);
          if(NULL != renderer)
              SDL_DestroyRenderer(renderer);
          if(NULL != window)
              SDL_DestroyWindow(window);
          SDL_Quit();
          return statut;
      }
      
      void pausee()
      {
              int continuer = 1;
              SDL_Event event;
      
              while (continuer)
              {
                      SDL_WaitEvent(&event);
                      switch(event.type)
                      {
                              case SDL_QUIT:
                                      continuer = 0;
                      }
              }
      }
      
      void createWindows(SDL_Window* window, SDL_Surface* screenSurface){
          if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
          {
              printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
          }
          else
          {
              //Create window
              window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
              if( window == NULL )
              {
                  printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
              }
              else
              {
                  //Get window surface
                  screenSurface = SDL_GetWindowSurface( window );
      
                  //Fill the surface white
                  SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );
                  
                  //Update the surface
                  SDL_UpdateWindowSurface( window );
      
                 
              }
          }
      }
      // savoir si un point appartient à un rectangle : fonction de collision
      SDL_bool test(SDL_Point point, SDL_Rect rect)
      {
          if(point.x >= rect.x && point.x <= (rect.x + rect.w) &&
              point.y >= rect.y && point.y <= (rect.y + rect.h))
              return SDL_TRUE;
          else
              return SDL_FALSE;
      }
      // SDL_Bool SDL_HasIntersection(const SDL_Rect*, A, const SDL_Rect* B) permet de savoir si 2 rectangle se touche ( return SDL_True ou SDL_False)
      ```


    J'ai ces problèmes quand je compile :
    2021-10-06 10:57:14.969545+0200 ProjetC[49498:1770036] Metal API Validation Enabled
    2021-10-06 10:57:15.001930+0200 ProjetC[49498:1770036] Errors found! Invalidating cache...
    2021-10-06 10:57:15.053610+0200 ProjetC[49498:1770036] +[MTLIOAccelDevice registerDevices]: Zero Metal services found
    
    À noter que Metal API... et Zero Metal... ont toujours été présent.
    Merci de votre aide

    -
    Edité par Arthurdbs 6 octobre 2021 à 11:00:41

    • Partager sur Facebook
    • Partager sur Twitter
      6 octobre 2021 à 9:23:38

      Salut,

      Tout cela ressemble à une partie qui serait indéfinie au dela de ton blit de texture.

      Je note que ta fonction createWindows (qui elle remplit en blanc la fenêtre) n'est pas utilisée : tu utilises SDL_CreateWindowAndRenderer qui elle ne le fait pas. Malgré tout je n'ai pas vu ton erreur pour l'instant.

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        6 octobre 2021 à 10:04:34

        Je viens de tester sous Linux, ça fonctionne comme attendu. J'essayerai sous mon mac à midi. Si le problème persiste il faudra faire deux choses :

        • Tester avec la dernière version de SDL 2 pour voir si le problème persiste
        • Envoyer un problème si c'est le cas
        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

          6 octobre 2021 à 10:32:24

          Fvirtman a écrit:

          Salut,

          Tout cela ressemble à une partie qui serait indéfinie au dela de ton blit de texture.

          Je note que ta fonction createWindows (qui elle remplit en blanc la fenêtre) n'est pas utilisée : tu utilises SDL_CreateWindowAndRenderer qui elle ne le fait pas. Malgré tout je n'ai pas vu ton erreur pour l'instant.


          C'est normal pour createWindows() c'est lors de mes autres tests j'ai fait beaucoup de modifications. Je vais continuer mes recherches merci.

          • Partager sur Facebook
          • Partager sur Twitter
            6 octobre 2021 à 15:58:50

            Je viens d'essayer sur mon MacBook Pro (intel) : Big Sur 11.6 avec SDL 2 2.0.16, aucun problème.

            Peux tu me dire quelle version de SDL 2 as-tu ?

            -
            Edité par markand 6 octobre 2021 à 16:04:34

            • Partager sur Facebook
            • Partager sur Twitter

            git is great because Linus did it, mercurial is better because he didn't.

              6 octobre 2021 à 18:00:39

              markand a écrit:

              Je viens d'essayer sur mon MacBook Pro (intel) : Big Sur 11.6 avec SDL 2 2.0.16, aucun problème.

              Peux tu me dire quelle version de SDL 2 as-tu ?

              -
              Edité par markand il y a environ 1 heure


              J'ai la dernière, comme toi SDL 2.0.16 et je suis MacBook (M1) ça vient peut être de la le problème ?

              • Partager sur Facebook
              • Partager sur Twitter
                8 octobre 2021 à 14:09:20

                Après de nombreuses recherches, j'ai réinstaller SDL2 via Homebrew et voici ce que ça donne, je sais pas si c'est mieux ou moins bien que l'autre problème : 

                Problème résolu.

                Voici le code si quelqu'un se retrouve dans la même situation que moi.

                #include <stdlib.h>
                #include <stdio.h>
                
                #include <SDL2/SDL.h>
                 
                void pausee();
                 
                const int SCREEN_WIDTH = 640;
                const int SCREEN_HEIGHT = 480;
                 
                int main(int argc, char *argv[])
                {
                  SDL_Window *window = NULL;
                  SDL_Renderer *renderer = NULL;
                  SDL_Texture *texture = NULL;
                  int statut = EXIT_FAILURE;
                  SDL_Rect rect = {100, 100, 100, 100}, dst = {0, 0, 0, 0};
                  SDL_Color rouge = {255, 0, 0, 255}, bleu = {0, 0, 255, 255};
                  int continuer = 1;
                 
                  // -- Initialisation SDL
                  if(0 != SDL_Init(SDL_INIT_VIDEO))
                    {
                      fprintf(stderr, "Erreur SDL_Init : %s", SDL_GetError());
                      goto Quit;
                    }
                  if(0 != SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_SHOWN, &window, &renderer))
                    {
                      fprintf(stderr, "Erreur SDL_CreateWindowAndRenderer : %s", SDL_GetError());
                      goto Quit;
                    }
                  texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
                                              SDL_TEXTUREACCESS_TARGET, 200, 200);
                  if(NULL == texture)
                    {
                      fprintf(stderr, "Erreur SDL_CreateTexture : %s", SDL_GetError());
                      goto Quit;
                    }
                 
                  statut = EXIT_SUCCESS;
                  // -- Fin Initialisation SDL
                 
                  // -- Dessine les rectangles
                 
                  SDL_SetRenderTarget(renderer, texture);                                          // Mettre le texture comme cible de render
                 
                  SDL_SetRenderDrawColor(renderer, bleu.r, bleu.g, bleu.b, bleu.a);                // Changer le couleur au bleu
                  SDL_RenderClear(renderer);                                                       // Utiliser clear pour mettre la totalité texture en couleur bleu
                 
                  SDL_SetRenderDrawColor(renderer, rouge.r, rouge.g, rouge.b, rouge.a);            // Changer le couleur au rouge
                  SDL_RenderFillRect(renderer, &rect);                                             // Colorer l'espace qui est defini par rect
                  SDL_QueryTexture(texture, NULL, NULL, &dst.w, &dst.h);                           // Sauvegarde la taille de texture au dst
                 
                  // -- Fin dessine les rectangles
                 
                  SDL_SetRenderTarget(renderer, NULL);                                             // Mettre la fenetre comme cible de render
                 
                  // -- Game loop simple
                  while (continuer)
                    {
                      // -- Render
                      SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);                              // Changer le couleur au noir
                      SDL_RenderClear(renderer);                                                   // Nettoyer la surface de render
                 
                      SDL_RenderCopy(renderer, texture, NULL, &dst);                               // Render la texture au fenetre
                 
                      SDL_RenderPresent(renderer);                                                 // Mettre à jour le framebuffer
                      // -- Fin render
                 
                 
                      // -- Ecoute events
                      SDL_Event event;
                      while (SDL_PollEvent(&event))                                                // Ecoute jusqu'à la fin de event queue
                        {
                          switch(event.type)
                            {
                            case SDL_QUIT:
                              continuer = 0;
                              break;
                 
                            case SDL_MOUSEBUTTONDOWN:
                              if(event.button.button == SDL_BUTTON_LEFT){
                                printf("clic gauche\n");
                              }
                              break;
                            }
                        }
                      // -- Fin ecoute events
                    }
                  // -- Fin game loop simple
                 
                 
                 Quit:
                  if(NULL != texture)
                    SDL_DestroyTexture(texture);
                  if(NULL != renderer)
                    SDL_DestroyRenderer(renderer);
                  if(NULL != window)
                    SDL_DestroyWindow(window);
                  SDL_Quit();
                  return statut;
                }
                
                void pausee()
                {
                        int continuer = 1;
                        SDL_Event event;
                
                        while (continuer)
                        {
                                SDL_WaitEvent(&event);
                                switch(event.type)
                                {
                                    case SDL_QUIT:
                                        continuer = 0;
                                    
                                }
                        }
                }
                
                

                -
                Edité par Arthurdbs 8 octobre 2021 à 15:29:56

                • Partager sur Facebook
                • Partager sur Twitter
                  9 octobre 2021 à 17:37:23

                  Arthurdbs a écrit:

                  Après de nombreuses recherches, j'ai réinstaller SDL2 via Homebrew et voici ce que ça donne, je sais pas si c'est mieux ou moins bien que l'autre problème : 


                  J'ai envie de dire que c'est un comportement indéfini dans les deux cas, et c'est pas très positif. 

                  Mais je ne vois pas le soucis dans ton code (ou alors ça ne me saute pas aux yeux) et je n'ai pas de mac. 

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  SDL2 sur mac

                  × 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