Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL2 : Problème d'affichage

Sujet résolu
    28 août 2021 à 21:40:54

    Bonjour à tous, je programme actuellement un petit jeu en c grâce à la SDL2 mais j'ai un petit soucis au niveau de l'affichage.

    En fait, des fois le programme affiche bien ce à quoi je m'attends (2 petits rectangles à chaque bout de la fenêtre), mais quelque fois la fenêtre est juste remplie d'une couleur aléatoire.

    Le code source du programme :

    #include <stdio.h>
    #include <SDL2/SDL.h>
    #include "paddle.c"
    
    #define PADDLE_WIDTH 128
    #define PADDLE_HEIGHT 32
    
    void processEvents(int *isRunning, Paddle *paddles);
    void update(Paddle *paddles);
    void render(SDL_Renderer *renderer, Paddle *paddles);
    
    void processEvents(int *isRunning, Paddle *paddles)
    { 
       SDL_Event events;
       while(SDL_PollEvent(&events))
       {
          switch(events.type)
          {
             case SDL_QUIT:
             {
                *isRunning = 0;
                break;
             }
             case SDL_KEYDOWN:
             {
                SDL_Log("+key");
                break;
             }
             case SDL_KEYUP:
             {
                SDL_Log("-key");
                break;
             }  
             default:
             {
                break;
             }
          }
       }
    }
    void update(Paddle *paddles)
    {
       paddles[0].rect.x ++;
    }
    void render(SDL_Renderer *renderer, Paddle *paddles)
    {
       SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); 
       SDL_RenderClear(renderer);
       for(int i = 0; i < sizeof(paddles); i++)
       {
          SDL_SetRenderDrawColor(renderer, paddles[i].red, paddles[i].green, paddles[i].blue, 255);
          SDL_RenderFillRect(renderer, &paddles[i].rect);
       }
       SDL_RenderPresent(renderer);
       SDL_Delay(10);
    }
    int main()
    {
       int gameWidth = 640;
       int gameHeight = 480;
       int isRunning = 1;
       const char *gameTitle = "[cPong]";
       SDL_Window *gameWindow = NULL;
       SDL_Renderer *gameRenderer = NULL; 
       if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
       {
          printf("[!] Erreur lors de l'initialisation de la SDL.\nDétails : %s.\n", SDL_GetError());
          SDL_Quit();
          return EXIT_FAILURE;
       }
       gameWindow = SDL_CreateWindow(gameTitle, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, gameWidth, gameHeight, SDL_WINDOW_SHOWN);
       if(gameWindow == NULL)
       {
          printf("[!] Erreur lors de la création de la fenêtre.\nDétails : %s.\n", SDL_GetError());
          SDL_Quit();
          return EXIT_FAILURE;
       }
       gameRenderer = SDL_CreateRenderer(gameWindow, -1, SDL_RENDERER_ACCELERATED);
       Paddle paddles[2] = {initPaddle(0, 0, PADDLE_WIDTH, PADDLE_HEIGHT, 0, 255, 0, 0), initPaddle(0, gameHeight - PADDLE_HEIGHT, PADDLE_WIDTH, PADDLE_HEIGHT, 0, 0, 255, 0)};
       while(isRunning)
       {
          processEvents(&isRunning, paddles);
          update(paddles);
          render(gameRenderer, paddles);  
       }
       SDL_DestroyRenderer(gameRenderer);
       SDL_DestroyWindow(gameWindow);
       SDL_Quit();
       return EXIT_SUCCESS;
    }



    Exécution normale :

    http://image.noelshack.com/fichiers/2021/34/6/1630179353-capture-d-ecran-2021-08-28-21-35-13.png

    Exécution anormale :

    Du coup, je sais pas si le problème vient de mon code ou si c'est un bug. En espérant que vous puissiez m'aider.
    • Partager sur Facebook
    • Partager sur Twitter
      29 août 2021 à 9:37:24

      Salut,

      Tu ne donne pas ton fichier "paddle.c", mais ce n'est pas grave : j'ai pu le recréer moi-même comme suit.

      typedef struct Paddle
      {
      
         SDL_Rect rect;
         Uint8 red;
         Uint8 green;
         Uint8 blue;
         Uint8 alpha;
      
      } Paddle;
      
      Paddle initPaddle (int x, int y, int w, int h, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
      {
         return (Paddle){{x, y, w, h}, r, g, b, a};
      }
      
      

      Pour ton bug maintenant, c'est très simple en réalité (même si j'ai mis un petit moment à le trouver) : il vient de la ligne 49 de ton code. tu effectue une boucle for pour sizeof(paddles)... qui ne vaux pas le nombre de cases du tableau (2) mais le nombre de composants de ta structure (8 donc avec mon code, car SDL_Rect en compte 4) 😐️ ! Tu affiche donc successivement les rectangles de paddles[0], paddles[1], paddles[2], paddles[3]... etc, jusqu'à paddles[7]. forcément, il y a alors un problème... 🙃️

      Voilà, je te laisse le corriger tout seul maintenant, je pense que tu en es capable. 😉️

      Bon jeu de pong ! 😁️

      Durza42

      -
      Edité par Durza42 29 août 2021 à 9:41:18

      • Partager sur Facebook
      • Partager sur Twitter

      La gentillesse est le langage qu'un sourd peut entendre et qu'un aveugle peut voir.

      Il n'y a qu'un seul monde et il est faux, cruel, contradictoire, séduisant et dépourvu de sens. Un monde ainsi constitué est le monde réel. Nous avons besoin de mensonges pour conquérir cette réalité, cette "vérité".

        29 août 2021 à 12:45:59

        Hello,


        Durza 42 a écrit:

        ....Pour ton bug maintenant, c'est très simple en réalité (même si j'ai mis un petit moment à le trouver) : il vient de la ligne 49 de ton code. tu effectue une boucle for pour sizeof(paddles)... qui ne vaux pas le nombre de cases du tableau (2) mais le nombre de composants de ta structure....

        Non. sizeof(paddles) donne la taille d'un pointeur, soit 4 ou 8 octets.

        -
        Edité par edgarjacobs 29 août 2021 à 13:07:01

        • Partager sur Facebook
        • Partager sur Twitter

        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

          29 août 2021 à 12:53:55

          Merci pour vous réponses, c'était tout simple en effet.

          Bonne journée.

          • Partager sur Facebook
          • Partager sur Twitter
            29 août 2021 à 20:40:21

            edgarjacobs a écrit :

            Non. sizeof(paddles) donne la taille d'un pointeur, soit 4 ou 8 octets.

            Ouh oui, désolé... 😕️ J'ai vu 8 donc j'ai immédiatement conclu nombre de composants... Le pire c'est que je me disais que c'était bizarre comme utilisation... Encore désolé !

            • Partager sur Facebook
            • Partager sur Twitter

            La gentillesse est le langage qu'un sourd peut entendre et qu'un aveugle peut voir.

            Il n'y a qu'un seul monde et il est faux, cruel, contradictoire, séduisant et dépourvu de sens. Un monde ainsi constitué est le monde réel. Nous avons besoin de mensonges pour conquérir cette réalité, cette "vérité".

            SDL2 : Problème d'affichage

            × 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