Partage
  • Partager sur Facebook
  • Partager sur Twitter

'Qu'est-ce que tu ne comprends pas dans _map[i][j] = GROUND ?

Anonyme
    21 août 2007 à 10:51:45

    Bonjour !
    J'ai dédié à mon problème un article dans mon blog, et le voici !, premier article. L'archive liée contient un makefile et les sources, ainsi que toutes les ressources. Un make suffira :)
    La question est de savoir comment résoudre mon problème, et c'est précisément pourquoi je poste ici.
    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      21 août 2007 à 11:34:16

      J'te dirais pas que j'ai la flemme de dl les sources hein mais bon :p
      Si tu pouvais nous mettre juste la partie du code qui est interessante ce serait pas de refus :-°
      • Partager sur Facebook
      • Partager sur Twitter
        21 août 2007 à 12:31:51

        Il m'a fallut du temps mais j'ai trouvé un bug(en fait deux):
        1. int i,j;
        2. [...]
        3. try {
        4.   for (; i < 6; i++)
        5.   {
        6.     _map[i] = new int[6];
        7.     for (; j < 6; j++)
        8.       _map[i][j] = /*GROUND*/RED_ROBOT_RIGHT;
        9.   }
        10. }

        Ce code est faux car i commence à 0 puis j varie de 0 à 6 puis i passe à 1 et ... j varie de 6 à 6 !
        Et oui, tu oublie de réinitialiser j à 0. Et j'ai constaté que tu faisait cette erreur potentielle à beaucoup d'endrois, il vaut mieux initialiser j directement dans le for:
        1. try {
        2.   for (int i=0; i < 6; i++)
        3.   {
        4.     _map[i] = new int[6];
        5.     for (int j=0; j < 6; j++)
        6.       _map[i][j] = /*GROUND*/RED_ROBOT_RIGHT;
        7.   }
        8. }

        Enfin çà c'est le premier et vrai bug je crois.
        Le deuxième c'est que ta fonction Ressource::replace_color(ou un truc comme çà) seg fault :)
        En effet, tu manipule d'une part les pixels comme des entier 32-bit alors que ce n'est pas toujours vrai et d'autre part, ton pointeur sur pixel est Uint32 ce qui te fait sortir du tableau très vite à cause d'une malheureuse erreur d'arithmétique sur des pointeurs. Bref voilà un code à priori correct:
        1. void
        2. Resources::replace_color(SDL_Surface *surface, Uint32 pixel_to_replace, Uint32 new_pixel)
        3. {
        4.         Uint8 *pixel;
        5.         Uint32 x, y, bpp = surface->format->BytesPerPixel;
        6.         SDL_BlitSurface(surface,NULL,surface,NULL);
        7.         // Locke la surface pour l'écrire.
        8.         if ( SDL_MUSTLOCK(surface) )
        9.                 SDL_LockSurface(surface);
        10.         for (x = 0; x < (Uint32) surface->w; x++)
        11.                 for (y = 0; y < (Uint32) surface->h; y++)
        12.                 {
        13.                         pixel = (Uint8*) surface->pixels + y * surface->pitch + x * bpp;
        14.                         switch(bpp)
        15.                         {
        16.                                 case 4:
        17.                                         if (*(Uint32 *)pixel == pixel_to_replace)
        18.                                                 *(Uint32 *)pixel = new_pixel;
        19.                                         break;
        20.                                 case 2:
        21.                                         if (*(Uint16 *)pixel == pixel_to_replace)
        22.                                                 *(Uint16 *)pixel = new_pixel;
        23.                                         break;
        24.                                 case 1:
        25.                                         if (*(Uint8 *)pixel == pixel_to_replace)
        26.                                                 *(Uint8 *)pixel = new_pixel;
        27.                                         break;
        28.                                 default:
        29.                                         throw "$ERR";
        30.                         }
        31.                 }
        32.         // Unlocke la surface - opération achevée -
        33.         if ( SDL_MUSTLOCK(surface) )
        34.                 SDL_UnlockSurface(surface);
        35. }
        Au passage, au dit "verouille" et pas "Locke" :)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          21 août 2007 à 12:50:12

          Merci, pour la première erreur, ça va, je pense avoir compris. C'est en partie à cause du warning : statement has no effect >.>
          Pour ce qui est de la fonction replace_color, elle date d'un autre topic, j'ai pas pris le temps de tester et de vérifier que j'avais prise la bonne.
          Pour le commentaire, je trouvais que taper vérouiller était trop long. (Excuse à 2 balles spotted)

          EDIT : Je propose :
          1. // Remplace la couleur.
          2. void
          3. Resources::replace_color(SDL_Surface *surface, Uint32 pixel_to_replace, Uint32 new_pixel)
          4. {
          5.                 Uint8 *pixel;
          6.                 Uint32 x, y, bpp = surface->format->BytesPerPixel;
          7.                 // Vérouille la surface pour l'écrire.
          8.                 if (SDL_MUSTLOCK(surface))
          9.                         SDL_LockSurface(surface);
          10.                 // Parcours de la surface à la recherche de pixels à remplacer.
          11.                 for (x = 0; x < (Uint32) surface->w; x++)
          12.                         for (y = 0; y < (Uint32) surface->h; y++)
          13.                         {
          14.                                 pixel = (Uint8*) surface->pixels + y * surface->pitch + x * bpp;
          15.                                 switch(bpp)
          16.                                 {
          17.                                         case 4:
          18.                                                 if (*(Uint32 *)pixel == (Uint32) pixel_to_replace)
          19.                                                         *(Uint32 *)pixel = (Uint32) new_pixel;
          20.                                         break;
          21.                                         case 2:
          22.                                                 if (*(Uint16 *)pixel == (Uint16) pixel_to_replace)
          23.                                                         *(Uint16 *)pixel = (Uint16) new_pixel;
          24.                                         break;
          25.                                         case 1:
          26.                                         if (*pixel == (Uint8) pixel_to_replace)
          27.                                                 *pixel = (Uint8) new_pixel;
          28.                                         break;
          29.                                         default:
          30.                                                 throw "$ERR";
          31.                                 }
          32.                         }
          33.                 // Déverrouille la surface - opération achevée -
          34.                 if (SDL_MUSTLOCK(surface))
          35.                         SDL_UnlockSurface(surface);
          36. }


          Qui ne marche pas, tout comme la fonction donnée précédemment. Pourriez vous m'aider en me disant pourquoi ?
          • Partager sur Facebook
          • Partager sur Twitter

          'Qu'est-ce que tu ne comprends pas dans _map[i][j] = GROUND ?

          × 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