Partage
  • Partager sur Facebook
  • Partager sur Twitter

[c + sdl]Editeur de map qui déconne

Problème avec une boucle je pense

    11 avril 2006 à 22:32:54

    Salut à tous,

    Je suis en train de réaliser un petit éditeur de map style RPGMaker (pour ceux qui connaissent)
    Il fonctionnait plutot bien jusqu'au moment ou j'ai voulu ajouté un systeme de "couches" (plusieurs objets empilables les un sur les autres, ex: sol>>table>>assiete), pour ce faire, j'ai rajouté une 3eme dimension a mon tableau qui contient la map (les 2 premieres dimensions sont les coordonnees x et y)

    Mais maintenant, lorsque je positionne un "tile" (morceau du chipset), toute la map est remplie par celui-ci alors que ce n'etait pas le cas avant.
    J'ai beau cherché, je n'arrive pas a résoudre le problème (je pense à une boucle foireuse mais je ne trouve pas :/)

    Si une âme charitable (ou plusieurs) pouvait m'aider à localiser le probleme :)

    merci d'avance.

    ps: si en meme temps, vous trouvez des optimisations possibles, n'hésitez pas à m'en faire part ;)
    • Partager sur Facebook
    • Partager sur Twitter
      12 avril 2006 à 19:37:21

      Personne ?

      C'est peut etre parceque vous avez la flemme de télécharger l'archive ca qui est tout a fait compréhensible, je poste donc la source directement sur le forum mais les images n'apparaitrons pas et la mise en page ne vas pas etre super:
      #include <stdlib.h>
      #include <stdio.h>
      #include <SDL/SDL.h>
      #include <SDL/SDL_image.h>

      int main(int argc, char *argv[])
      {
          SDL_Surface *ecran          = NULL;
          SDL_Surface *patron         = NULL;
          SDL_Surface *grille         = NULL;
          SDL_Surface *chipset        = NULL;
          SDL_Surface *selection_tile = NULL;
          SDL_Surface *defaut         = NULL;
          SDL_Surface *cellule[16][16][3];
          SDL_Rect delimitation   = {0};
          SDL_Rect delimitation2  = {0};
          SDL_Rect pos_cellule[16][16];
          SDL_Rect pos_grille;
          SDL_Rect pos_chipset;
          SDL_Rect pos_selection_tile;
          SDL_Event event;
          int fin = 0;
          int boucle_x = 0, boucle_y, boucle_z = 0;
          int afficher_grille = 0;
          int x = 0, y, z = 0;
          int couche = 1;
          int changements = 1;

          delimitation.x  = 256;
          delimitation.y  = 0;
          delimitation.w  = 2;
          delimitation.h  = 512;
          delimitation2.x = 770;
          delimitation2.y = 0;
          delimitation2.w = 2;
          delimitation2.h = 512;
          pos_grille.x = 256 + 2;
          pos_grille.y = 0;
          pos_chipset.x = 0;
          pos_chipset.y = 0;
          pos_selection_tile.x = 0;
          pos_selection_tile.y = 0;

          for(boucle_x=0; boucle_x<16; boucle_x++)
              for(boucle_y=0; boucle_y<16; boucle_y++)
              {
                  pos_cellule[boucle_x][boucle_y].x = 256 + 2 + boucle_x*32;
                  pos_cellule[boucle_x][boucle_y].y = boucle_y*32;
                  pos_cellule[boucle_x][boucle_y].w = 32;
                  pos_cellule[boucle_x][boucle_y].h = 32;
              }

          SDL_Init(SDL_INIT_VIDEO);
          ecran = SDL_SetVideoMode(804, 512, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
          SDL_WM_SetCaption("Editeur", NULL);

          grille         = IMG_Load("images/grille.png");
          chipset        = IMG_Load("chipset/chipset1.png");
          selection_tile = IMG_Load("images/selection_tile.png");
          defaut         = IMG_Load("images/defaut.bmp");
          SDL_SetAlpha(grille, SDL_SRCALPHA, 50);
          SDL_SetAlpha(selection_tile, SDL_SRCALPHA, 64);

          for(boucle_x=0; boucle_x<16; boucle_x++)
              for(boucle_y=0; boucle_y<16; boucle_y++)
                  cellule[boucle_x][boucle_y][0] = defaut;

          while(!fin)
          {
              SDL_WaitEvent(&event);
              switch(event.type)
              {
                  case SDL_QUIT:
                      fin = 1;
                  break;
                  case SDL_KEYDOWN:
                      switch (event.key.keysym.sym)
                      {
                          case SDLK_g:
                              afficher_grille = !afficher_grille;
                              changements = 1;
                          break;
                          case SDLK_ESCAPE: /* echap */
                              fin = 1;
                          break;
                          case SDLK_DELETE: /* suppr */
                              /***/
                          break;
                      }
                  break;
                  case SDL_MOUSEBUTTONDOWN:
                      if(event.button.button == SDL_BUTTON_LEFT) /* click gauche */
                      {
                          if(event.button.x < 256)
                          {
                              pos_selection_tile.x = event.button.x - event.button.x%32;
                              pos_selection_tile.y = event.button.y - event.button.y%32;
                          }
                          else if(event.button.x > 258 && event.button.x < 770) /* +2px pour la separation */
                          {
                              x = (event.button.x - event.button.x%32 - 254)/32;
                              y = event.button.y/32;
                              SDL_BlitSurface(chipset, &pos_selection_tile, cellule[x][y][z], NULL);
                          }
                      }
                      else if(event.button.button == SDL_BUTTON_RIGHT) /* click droit */
                      {
                          if(event.button.x < 256)
                          {
                              pos_selection_tile.x = event.button.x - event.button.x%32;
                              pos_selection_tile.y = event.button.y - event.button.y%32;
                          }
                          else if(event.button.x > 258 && event.button.x < 770) /* +2px pour la separation */
                          {
                              x = (event.button.x - event.button.x%32 - 254)/32;
                              y = event.button.y/32;
                              SDL_BlitSurface(defaut, &pos_selection_tile, cellule[x][y][z], NULL); /* a changer pour supprimer */
                          }
                      }
                      changements = 1;
                  break;
              }

              if(changements)
              {
                  changements = !changements;
                  SDL_FillRect(ecran, NULL          , SDL_MapRGB(ecran->format, 255, 255, 255));
                  SDL_FillRect(ecran, &delimitation , SDL_MapRGB(ecran->format, 140, 140, 140));
                  SDL_FillRect(ecran, &delimitation2, SDL_MapRGB(ecran->format, 140, 140, 140));
                  if(couche == 0)
                  {
                      for(boucle_x=0; boucle_x<16; boucle_x++)
                          for(boucle_y=0; boucle_y<16; boucle_y++)
                              SDL_BlitSurface(cellule[boucle_x][boucle_y][z], NULL, ecran, &pos_cellule[boucle_x][boucle_y]);
                  }
                  else
                  {
                     for(boucle_x=0; boucle_x<16; boucle_x++)
                          for(boucle_y=0; boucle_y<16; boucle_y++)
                              for(boucle_z=0; boucle_z<couche; boucle_z++)
                                  SDL_BlitSurface(cellule[boucle_x][boucle_y][boucle_z], NULL, ecran, &pos_cellule[boucle_x][boucle_y]);
                  }

                  SDL_BlitSurface(chipset       , NULL, ecran, &pos_chipset       );
                  SDL_BlitSurface(selection_tile, NULL, ecran, &pos_selection_tile);
                  if(afficher_grille)
                      SDL_BlitSurface(grille, NULL, ecran, &pos_grille);
                  SDL_Flip(ecran);
              }
          }

          SDL_FreeSurface(grille);
          SDL_FreeSurface(chipset);
          SDL_FreeSurface(selection_tile);
          SDL_Quit();
          return EXIT_SUCCESS;
      }
      • Partager sur Facebook
      • Partager sur Twitter

      [c + sdl]Editeur de map qui déconne

      × 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