Partage
  • Partager sur Facebook
  • Partager sur Twitter

Damier en SDL

    15 juillet 2006 à 18:21:15

    Bonjour,
    Voila je voudrai savoir comment je peux faire un damier avec une image de 46*46 pixel.
    J'ai tenter de coder mais j'ai l'impression que sa le fait que sur une ligne et que les images ce superpose et que la fonction long casesY(long b, long cpt) n'est pas genial lol.

    VIDE et PLEIN son des enumerations


    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    #include "constantes.h"

    int main(int argc, char *argv[]) {

       /* Initialization de l'echecquier */
        SDL_Surface *ecran = NULL, *cases[32] = {NULL};

        SDL_Rect positionCases[32];

        SDL_Event event;
        int continuer = 1;
        long a = 0, XY = 0, bloc = 0, x = 0, y = 0, z = 0, b = 0, n = 0;

        ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption(" ECHECQUIER", NULL);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

        /* Fonction des la table de l'echecquier */
        for(a=0;a<64;a++) {
        XY = casesXY(a);
        if(PLEIN == XY) {
        n++;
        bloc++;
        positionCases[n].x = casesX(bloc, x, a, y);
        positionCases[n].y = casesY(bloc, y, z);
        cases[n] = IMG_Load("case.png");
        SDL_BlitSurface(cases[n], NULL, ecran, &positionCases[n]);
        SDL_FreeSurface(cases[n]);
        if(bloc==5)
        bloc=0;
        }
        else if(VIDE == XY)
        continue;
        }

        SDL_Flip(ecran);

        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: // Veut arrêter le jeu
                            continuer = 0;
                            break;
                    }
                    break;
            }


        }

        SDL_Quit();

    }

    long casesXY(long a) {

        long j = 0;
        j = a % 2;

        if(j!=0)
            return PLEIN;

        else
            return VIDE;

    }

    long casesY(long bloc, long y, long z) {

        if(bloc==5) {
            z++;
            y = z * TAILLE_BLOC;
            return y;
        }

        else {
            return y;
        }

    }

    long casesX(long bloc, long x, long a, long y) {

        if(bloc==5) {
            if(y==46||y==138||y==230||y==368) {
            x = TAILLE_BLOC;
            return x;
            }

            else {
            x = 0;
            return x;
            }
        }

        else {
            x = ((bloc*2)-1) * TAILLE_BLOC;
            return x;
        }
    }



    Merci pour tous aide apporter sur ce code.
    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2006 à 19:32:20

      Quelques commentaires dans ton code ne seraient pas de refus, j'ai vraiment du mal à le comprendre.

      PS :
      if(VIDE)
       continue;

      Il me semble que ceci est inutile...
      • Partager sur Facebook
      • Partager sur Twitter
        15 juillet 2006 à 22:11:58

        Je n'arrive pas vraiment à comprendre ton code ! :-°

        Il y a deux-trois trucs assez bizarres.

        long casesXY(long a, long cpt) // Tu as cette fonction
        casesXY(a, cpt); // Et tu l'appelles comme ça dans le code !


        Ta fonction returne VIDE ou PLEIN, mais il n'y a rien pour prendre en compte ce retour, elle ne sert donc à rien.

        if(PLEIN)
        {

        }

        Je ne connais pas la valeur de PLEIN, mais si elle différente de 0 ce If sera toujours considéré comme vrai !
        (même remarque pour le VIDE)

        EDIT:
            if(j!=0) {
                return PLEIN, cpt++;
            }

        Deux return et une incrémentation ? o_O
        Qu'est ce que tu voulais faire ?

        ;)

        EDIT: on ne dit pas "echecquier" mais "échiquier" !!!

        • Partager sur Facebook
        • Partager sur Twitter
          16 juillet 2006 à 0:01:14


          #include <stdio.h>
          #include <stdlib.h>
          #include <SDL/SDL.h>
          #include <SDL/SDL_image.h>

          #include "constantes.h"

          int main(int argc, char *argv[]) {

             /* Initialization de l'echecquier */
              SDL_Surface *ecran = NULL, *cases[32] = {NULL};

              SDL_Rect positionCases[32];

              SDL_Event event;
              int continuer = 1;
              long a = 0, XY = 0, bloc = 0, x = 0, y = 0, z = 0, b = 0, n = 0;

              ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
              SDL_WM_SetCaption(" ECHECQUIER", NULL);
              SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

              /* Fonction des la table de l'echecquier */
              for(a=0;a<64;a++) {
              XY = casesXY(a);
              if(PLEIN == XY) {
              n++;
              bloc++;
              positionCases[n].x = casesX(bloc, x, a, y);
              positionCases[n].y = casesY(bloc, y, z);
              cases[n] = IMG_Load("case.png");
              SDL_BlitSurface(cases[n], NULL, ecran, &positionCases[n]);
              SDL_FreeSurface(cases[n]);
              if(bloc==5)
              bloc=0;
              }
              else if(VIDE == XY)
              continue;
              }

              SDL_Flip(ecran);

              while (continuer)
              {
                  SDL_WaitEvent(&event);
                  switch(event.type)
                  {
                      case SDL_QUIT:
                          continuer = 0;
                          break;
                      case SDL_KEYDOWN:
                          switch(event.key.keysym.sym)
                          {
                              case SDLK_ESCAPE: // Veut arrêter le jeu
                                  continuer = 0;
                                  break;
                          }
                          break;
                  }


              }

              SDL_Quit();

          }

          long casesXY(long a) {

              long j = 0;
              j = a % 2;

              if(j!=0)
                  return PLEIN;

              else
                  return VIDE;

          }

          long casesY(long bloc, long y, long z) {

              if(bloc==5) {
                  z++;
                  y = z * TAILLE_BLOC;
                  return y;
              }

              else {
                  return y;
              }

          }

          long casesX(long bloc, long x, long a, long y) {

              if(bloc==5) {
                  if(y==46||y==138||y==230||y==368) {
                  x = TAILLE_BLOC;
                  return x;
                  }

                  else {
                  x = 0;
                  return x;
                  }
              }

              else {
                  x = ((bloc*2)-1) * TAILLE_BLOC;
                  return x;
              }
          }


          • Partager sur Facebook
          • Partager sur Twitter
            16 juillet 2006 à 11:20:35

            Je n'arrive pas vraiment à comprendre ton code, donc je vais te proposer ma solution pour créer un damier.


            /* Initialisation */
            int i,j;
            SDL_Surface *cases = NULL;
            SDL_Rect position;
            cases = IMG_Load("case.png");   


            /* Code */
            for(i,i<=(LARGEUR_FENETRE/TAILLE_CASE),i++)
            {
                for(j,j<=(HAUTEUR_FENETRE/TAILLE_CASE),j++)
                {
                    position.x = i * TAILLE_CASE;
                    position.y = j * TAILLE_CASE;
                    switch(/* Trouve un truc pour savoir si c'est noir ou blanc  */)
                    {               
                        case PLEIN:
                            SDL_BlitSurface(cases, NULL, ecran, &position);
                            break;
                        case VIDE:
                            break;
                    }
                }
            }


            Une autre erreur dans ton code : dans ton boucle for tu charges case.png à chaque fois. Fais le plutôt en début de fonction hors d'une boucle. Pareil pour FreeSurface.

            ;)





            • Partager sur Facebook
            • Partager sur Twitter

            Damier en SDL

            × 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