Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Envi d'un tableau d'images à une fonction

    20 août 2007 à 12:35:43

    Salut les Zér0s,
    J'avais d'abord posté mon problème sur le forum C mais en fait c'est du C++ :-° Voici mon problème:

    Dans mon jeu, j'aimerai créer une fonction affichage qui me permettrait d'afficher toutes les images dont j'ai besoin. J'ai donc créé la fonction suivante:

    1. void affiche(SDL_Surface* ecran, SDL_Surface* background, SDL_Surface* grille, SDL_Surface* bloc, SDL_Surface* selection, COORDONNEE &select)
    2. {
    3.     BLOC Bloc[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR];
    4.     SDL_Rect position;
    5.     SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    6.     position.x = 0;
    7.     position.y = 0;
    8.     SDL_BlitSurface(background, NULL, ecran, &position);
    9.     SDL_BlitSurface(grille, NULL, ecran, &position);
    10.     for (int i = 0; i < NB_BLOCS_LARGEUR; i++)
    11.     {
    12.         for (int j = 0; j < NB_BLOCS_HAUTEUR; j++)
    13.         {
    14.             if (Bloc[i][j].exist)
    15.             {
    16.                 position.x = 93 + i*TAILLE_BLOC + i - 5;
    17.                 position.y = 46 + Bloc[i][j].Y*TAILLE_BLOC+ Bloc[i][j].Y + 1;
    18.                 SDL_BlitSurface(bloc[Bloc[i][j].Couleur-1], NULL , ecran, &position);
    19.             }
    20.         }
    21.     }
    22.     position.x = 84 + select.x*(TAILLE_BLOC+1);
    23.     position.y = 45 + select.y*(TAILLE_BLOC+1);
    24.     SDL_BlitSurface(selection, NULL, ecran, &position);
    25.     SDL_Flip(ecran);
    26. }


    Le problème, c'est que j'arrive à afficher mes images sauf mes images bloc. C'est un tableau d'images:

    1. SDL_Surface *ImgBloc[5] = {NULL};
    2. ImgBloc[0] = IMG_Load("Images/Blocs/1.png");
    3. ImgBloc[1] = IMG_Load("Images/Blocs/2.png");
    4. ImgBloc[2] = IMG_Load("Images/Blocs/3.png");
    5. ImgBloc[3] = IMG_Load("Images/Blocs/4.png");
    6. ImgBloc[4] = IMG_Load("Images/Blocs/5.png");


    A savoir, dans la fonction principale, j'appelle ma fonction affiche comme ceci:
    1. affiche(ecran, ImgFond, ImgGrille, ImgBloc, ImgSelection, select);

    Et c'est à cette ligne que le compilateur m'annonce qu'il y a une erreur. Le message d'erreur est le suivant:
    Citation : Pas de titreerror: cannot convert 'SDL_!surface**' to 'SDL_Surface*' for argument '4' to 'void affiche(SDL_Surface*, SDL_Surface*, SDL_Surface*, SDL_Surface*, COORDONNEE)'

    J'implore donc votre aide. D'avance, un grand merci.
    • Partager sur Facebook
    • Partager sur Twitter
      20 août 2007 à 12:45:47

      Le compilateur te donne ton erreur. Tu transmets un SDL_Surface** alors que la fonction veut un SDL_Surface*
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        20 août 2007 à 13:01:30

        Oui, ça j'avais compris mais j'arrive pas à résoudre le problème :(
        • Partager sur Facebook
        • Partager sur Twitter
          20 août 2007 à 19:23:11

          1. for(int i(0);i<5;++i)
          2. affiche(ecran, ImgFond, ImgGrille, ImgBloc[i], ImgSelection, select);
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            20 août 2007 à 19:53:14

            Merci pour ton aide, mais je crois que je vais plutôt laisser le soin à la boucle principale d'afficher les images.
            • Partager sur Facebook
            • Partager sur Twitter
              20 août 2007 à 19:55:30

              Comme tu veux, c'est juste le ImgBloc qui était faux. Il fallait mettre un ImgBloc[1] (ou 2 ou 3 ou...)
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                21 août 2007 à 5:23:35

                non l'erreure c'est que dans la déclaration de affiche il faut mettre SDL_Surface**

                voici ce que je pense être le prototype nécessaire

                void affiche(SDL_Surface* ecran, SDL_Surface* background, SDL_Surface* grille, SDL_Surface** bloc, SDL_Surface* selection, COORDONNEE &select);

                Il me semble que c'est logique?

                bloc est un pointeur vers des pointeurs donc un pointeur de SDL_Surface*, ou un tableau de SDL_Surface*.

                d'ailleurs quand tu as écrit:
                1. SDL_Surface *ImgBloc[5] = {NULL};

                c'etait une petite erreure car on comprend moins bien le code et sa signification.

                tu aurais du faire:
                1. SDL_Surface** ImgBloc;
                2. ImgBloc = new SDL_Surface*[NOMBRE_D_IMAGES_DE_BLOCS];

                :-° Bon ok c'est plus long mais plus compréhensible et modifiable grace à une constante.
                Je vois d'ailleurs que tu pourrais en utiliser d'autres ici et la et que tu n'utilise que celle données par le tuto (^^ d'accord j'ai rien dit).

                Mais sinon c'est tout
                • Partager sur Facebook
                • Partager sur Twitter
                  21 août 2007 à 16:45:04

                  Merci, je verrais ça tout à l'heure

                  Edit: ça marche toujours pas, ça veut pas compiler :(

                  Citation : L'erreur

                  Switching to target: default
                  Linking executable: sdlapp.exe
                  .objs\main.o:main.cpp:(.text+0xb88): undefined reference to `affiche(SDL_Surface*, SDL_Surface*, SDL_Surface*, SDL_Surface**, SDL_Surface*, COORDONNEE, BLOC (*) [10])'
                  collect2: ld returned 1 exit status
                  Process terminated with status 1 (0 minutes, 0 seconds)
                  0 errors, 0 warnings



                  • Partager sur Facebook
                  • Partager sur Twitter

                  [SDL] Envi d'un tableau d'images à une fonction

                  × 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