Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Aide] Plus d'elements en SDL

comment mettre en place ?

Anonyme
    19 août 2006 à 13:57:43

    Bonjour à tous,
    Eant actuellement en train de faire un jeu en SDL, je me retrouve confronté à un problème l'hors du chargement des sprites , leur nombre :( .

    Je m'explique :
    Dans le TP du Sokoban, M@teo récupere la place des elements dans un fichier à l'aide de :

    for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
    {
        for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
        {
            switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
            {
                case '0':
                    niveau[j][i] = 0;
                    break;
                case '1':
                    niveau[j][i] = 1;
                    break;
                case '2':
                    niveau[j][i] = 2;
                    break;
                case '3':
                    niveau[j][i] = 3;
                    break;
                case '4':
                    niveau[j][i] = 4;
                    break;
            }
        }
    }


    Le probleme, c'est que vus le nombre de sprites present dans mon jeu, il m'est impossible de tous les enregistrés :euh: , j'ai utilisé le syteme de M@teo pour récupéré les éléments de :
    - a à z.
    - A à Z.
    - 0 à 9.
    - & à =.

    (Sa offre beaucoup de possibilitée mais pas assez dans mon cas ^^ .

    J'aimerais donc récupéré les sprites par deux, c'est à dire de :
    - aa à zz.
    - AA à ZZ.
    - 00 à 99.
    - && à ==.

    çela offrirais énormement de possibilitées, malheuresement je ne voit pas comment appliqué le procèdé dans le programme :o .

    (J'ais un second problème l'hors de la sauvegarde (les blocs se decalent), j'en parlerais apres avoir résolu celui-ci :lol: )

    Merci de vos réponses.
    Hybrix
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 août 2006 à 14:37:49

      il suffis que tu adapte ta fonction qui décode tes sprite, montre ton code se serait plus simple pour voir les différences, mais en résume c'est comme tu a dit, tu doit lire 2 caractère au lieu de juste un lors du décodage.
      • Partager sur Facebook
      • Partager sur Twitter
        20 août 2006 à 14:43:44

        a->z = 26
        A->Z = 26
        0->9 = 10
        ,?;.:/=+^¨$*£%&(§!)-@_ = 22

        26*2 + 10 + 22= 84 !!!!!!!!!!!! Tu as plus de 84 sprites à charger ??? Trucs de ouf !!! lol
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          20 août 2006 à 14:46:00

          Oui, je fait un jeu tres complet, si ça vous interesse je pourrais vous montrez une démo :) .


          Je ne voit pas comment adapter le code :s ,pour le moment c'est le meme que celui de M@teo, sauf qu'il y a plus de lettre et chiffre (84 d'apres guimers8 ^^ )
          • Partager sur Facebook
          • Partager sur Twitter
            20 août 2006 à 14:57:30

            envoie le code et on pourras t'aide, enfin ils pourrons (j'espère :p ) parce que moi je vais me coucher la... (j'ai école dans 7 heure :( )

            mais perso j'ai quand même de la difficulté a comprendre le + de 86 sprites (je suis même pas sur que civilisation en est autant :p ) mais bon c'est quand même possible.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              20 août 2006 à 15:02:32

              Ok, voici le code de la partie charger du mode aventure :


              int modeAventureChargerNiveau(SDL_Surface *ecran, int niveau[][NB_BLOCS_HAUTEUR], int *fondChoisis)
              {
                      //Variables "Ordinaires"
                  FILE* fichier = NULL;
                  char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
                  int i = 0, j = 0;
                  // on choisis le niveau a chargé
                  fichier = fopen("Niveaux/monNiveau.lvl", "r");
                  if(fichier == NULL)
                  {
                      fprintf(stderr, "Erreur l'hors de l'ouverture du niveau demandee\n");
                      exit(EXIT_FAILURE);
                  }

                  fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);

                  // Puis on charge
                  for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                  {
                      for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
                      {
                          switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
                          {
                              case '0':
                                  niveau[j][i]0;
                                  break;
                              case '1':
                                  niveau[j][i]1;
                                  break;
                              case '2':
                                  niveau[j][i]2;
                                  break;
                              case '3':
                                  niveau[j][i]3;
                                  break;
                              case '4':
                                  niveau[j][i]4;
                                  break;
                              case '5':
                                  niveau[j][i]5;
                                  break;
                              case '6':
                                  niveau[j][i]6;
                                  break;
                              case '7':
                                  niveau[j][i]7;
                                  break;
                              case '8':
                                  niveau[j][i]8;
                                  break;
                              case '9':
                                  niveau[j][i]9;
                                  break;
                              case 'a':
                                  niveau[j][i] = 'a';
                                  break;
                              case 'b':
                                  niveau[j][i] = 'b';
                                  break;
                              case 'c':
                                  niveau[j][i] = 'c';
                                  break;
                              case 'd':
                                  niveau[j][i] = 'd';
                                  break;
                              case 'e':
                                  niveau[j][i] = 'e';
                                  break;
                              case 'f':
                                  niveau[j][i] = 'f';
                                  break;
                              case 'g':
                                  niveau[j][i] = 'g';
                                  break;
                              case 'h':
                                  niveau[j][i] = 'h';
                                  break;
                              case 'i':
                                  niveau[j][i] = 'i';
                                  break;
                              case 'j':
                                  niveau[j][i] = 'j';
                                  break;
                              case 'k':
                                  niveau[j][i] = 'k';
                                  break;
                              case 'l':
                                  niveau[j][i] = 'l';
                                  break;
                              case 'm':
                                  niveau[j][i] = 'm';
                                  break;
                              case 'n':
                                  niveau[j][i] = 'n';
                                  break;
                              case 'o':
                                  niveau[j][i] = 'o';
                                  break;
                              case 'p':
                                  niveau[j][i] = 'p';
                                  break;
                              case 'q':
                                  niveau[j][i] = 'q';
                                  break;
                              case 'r':
                                  niveau[j][i] = 'r';
                                  break;
                              case 's':
                                  niveau[j][i] = 's';
                                  break;
                              case 't':
                                  niveau[j][i] = 't';
                                  break;
                              case 'u':
                                  niveau[j][i] = 'u';
                                  break;
                              case 'v':
                                  niveau[j][i] = 'v';
                                  break;
                              case 'w':
                                  niveau[j][i] = 'w';
                                  break;
                              case 'x':
                                  niveau[j][i] = 'x';
                                  break;
                              case 'y':
                                  niveau[j][i] = 'y';
                                  break;
                              case 'z':
                                  niveau[j][i] = 'z';
                                  break;
                              case 'A':
                                  niveau[j][i] = 'A';
                                  break;
                              case 'B':
                                  niveau[j][i] = 'B';
                                  break;
                              case 'C':
                                  niveau[j][i] = 'C';
                                  break;
                              case 'D':
                                  niveau[j][i] = 'D';
                                  break;
                              case 'E':
                                  niveau[j][i] = 'E';
                                  break;
                              case 'F':
                                  niveau[j][i] = 'F';
                                  break;
                              case 'G':
                                  niveau[j][i] = 'G';
                                  break;
                              case 'H':
                                  niveau[j][i] = 'H';
                                  break;
                              case 'I':
                                  niveau[j][i] = 'I';
                                  break;
                              case 'J':
                                  niveau[j][i] = 'J';
                                  break;
                              case 'K':
                                  niveau[j][i] = 'K';
                                  break;
                              case 'L':
                                  niveau[j][i] = 'L';
                                  break;
                              case 'M':
                                  niveau[j][i] = 'M';
                                  break;
                              case 'N':
                                  niveau[j][i] = 'N';
                                  break;
                              case 'O':
                                  niveau[j][i] = 'O';
                                  break;
                              case 'P':
                                  niveau[j][i] = 'P';
                                  break;
                              case 'Q':
                                  niveau[j][i] = 'Q';
                                  break;
                              case 'R':
                                  niveau[j][i] = 'R';
                                  break;
                              case 'S':
                                  niveau[j][i] = 'S';
                                  break;
                              case 'T':
                                  niveau[j][i] = 'T';
                                  break;
                              case 'U':
                                  niveau[j][i] = 'U';
                                  break;
                              case 'V':
                                  niveau[j][i] = 'V';
                                  break;
                              case 'W':
                                  niveau[j][i] = 'W';
                                  break;
                              case 'X':
                                  niveau[j][i] = 'X';
                                  break;
                              case 'Y':
                                  niveau[j][i] = 'Y';
                                  break;
                              case 'Z':
                                  niveau[j][i] = 'Z';
                                  break;
                              case '&':
                                  niveau[j][i] = '&';
                                  break;
                              case 'é':
                                  niveau[j][i] = 'é';
                                  break;
                              case 'ç':
                                  niveau[j][i] = 'ç';
                                  break;
                              case '#':
                                  niveau[j][i] = '#';
                                  break;
                              case '{':
                                  niveau[j][i] = '{';
                                  break;
                              case '(':
                                  niveau[j][i] = '(';
                                  break;
                              case '[':
                                  niveau[j][i] = '[';
                                  break;
                              case '-':
                                  niveau[j][i] = '-';
                                  break;
                              case '|':
                                  niveau[j][i] = '|';
                                  break;
                              case 'è':
                                  niveau[j][i] = 'è';
                                  break;
                              case '_':
                                  niveau[j][i] = '_';
                                  break;
                              case '^':
                                  niveau[j][i] = '^';
                                  break;
                              case 'à':
                                  niveau[j][i] = 'à';
                                  break;
                              case '@':
                                  niveau[j][i] = '@';
                                  break;
                          }
                      }
                  }

                  fscanf(fichier, "\n\n\n\n%ld", fondChoisis);
                  fclose(fichier);

                  return 0;
              }


              Maintenant le code pour enregistré les niveaux :

              void sauvegarderNiveau(SDL_Surface *ecran, int niveau[][NB_BLOCS_HAUTEUR], int fondChoisis)
              {
                  SDL_Surface *texte = NULL;
                  TTF_Font  *police = NULL;
                  SDL_Rect positionTexte;
                  // Variables "Ordinaires"
                  FILE *fichier = NULL;
                  int i = 0, j = 0, k = 0;

                   // Partie texte
                  TTF_Init();
                  police         = TTF_OpenFont("Divers/goodfish.ttf", 20);
                  SDL_Color blanc = {255, 0, 0};
                  texte          = TTF_RenderText_Blended(police, "Info : Niveau sauvegardé avec succès !", blanc);
                   // Position texte centré ;)
                  positionTexte.x = (LARGEUR_ECRAN / 2) - (texte->w / 2);
                  positionTexte.y = (HAUTEUR_ECRAN / 2);

                  fichier = fopen("Niveaux/monNiveau.lvl", "w");

                  for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                  {
                      for (j = 0 ; j < NB_BLOCS_LARGEUR; j++)
                      {
                          if(niveau[j][i] == 0)
                              fprintf(fichier, "0", niveau[j][i]);
                          else if(niveau[j][i] == 1)
                              fprintf(fichier, "1", niveau[j][i]);
                          else if(niveau[j][i] == 2)
                              fprintf(fichier, "2", niveau[j][i]);
                          else if(niveau[j][i] == 3)
                              fprintf(fichier, "3", niveau[j][i]);
                          else if(niveau[j][i] == 4)
                              fprintf(fichier, "4", niveau[j][i]);
                          else if(niveau[j][i] == 5)
                              fprintf(fichier, "5", niveau[j][i]);
                          else if(niveau[j][i] == 6)
                              fprintf(fichier, "6", niveau[j][i]);
                          else if(niveau[j][i] == 7)
                              fprintf(fichier, "7", niveau[j][i]);
                          else if(niveau[j][i] == 8)
                              fprintf(fichier, "8", niveau[j][i]);
                          else if(niveau[j][i] == 9)
                              fprintf(fichier, "9", niveau[j][i]);
                          else if(niveau[j][i] == 'a')
                              fprintf(fichier, "a", niveau[j][i]);
                          else if(niveau[j][i] == 'b')
                              fprintf(fichier, "b", niveau[j][i]);
                          else if(niveau[j][i] == 'c')
                              fprintf(fichier, "c", niveau[j][i]);
                          else if(niveau[j][i] == 'd')
                              fprintf(fichier, "d", niveau[j][i]);
                          else if(niveau[j][i] == 'e')
                              fprintf(fichier, "e", niveau[j][i]);
                          else if(niveau[j][i] == 'f')
                              fprintf(fichier, "f", niveau[j][i]);
                          else if(niveau[j][i] == 'g')
                              fprintf(fichier, "g", niveau[j][i]);
                          else if(niveau[j][i] == 'h')
                              fprintf(fichier, "h", niveau[j][i]);
                          else if(niveau[j][i] == 'i')
                              fprintf(fichier, "i", niveau[j][i]);
                          else if(niveau[j][i] == 'j')
                              fprintf(fichier, "j", niveau[j][i]);
                          else if(niveau[j][i] == 'k')
                              fprintf(fichier, "k", niveau[j][i]);
                          else if(niveau[j][i] == 'l')
                              fprintf(fichier, "l", niveau[j][i]);
                          else if(niveau[j][i] == 'm')
                              fprintf(fichier, "m", niveau[j][i]);
                          else if(niveau[j][i] == 'n')
                              fprintf(fichier, "n", niveau[j][i]);
                          else if(niveau[j][i] == 'o')
                              fprintf(fichier, "o", niveau[j][i]);
                          else if(niveau[j][i] == 'p')
                              fprintf(fichier, "p", niveau[j][i]);
                          else if(niveau[j][i] == 'q')
                              fprintf(fichier, "q", niveau[j][i]);
                          else if(niveau[j][i] == 'r')
                              fprintf(fichier, "r", niveau[j][i]);
                          else if(niveau[j][i] == 's')
                              fprintf(fichier, "s", niveau[j][i]);
                          else if(niveau[j][i] == 't')
                              fprintf(fichier, "t", niveau[j][i]);
                          else if(niveau[j][i] == 'u')
                              fprintf(fichier, "u", niveau[j][i]);
                          else if(niveau[j][i] == 'v')
                              fprintf(fichier, "v", niveau[j][i]);
                          else if(niveau[j][i] == 'w')
                              fprintf(fichier, "w", niveau[j][i]);
                          else if(niveau[j][i] == 'x')
                              fprintf(fichier, "x", niveau[j][i]);
                          else if(niveau[j][i] == 'y')
                              fprintf(fichier, "y", niveau[j][i]);
                          else if(niveau[j][i] == 'z')
                              fprintf(fichier, "z", niveau[j][i]);
                          else if(niveau[j][i] == 'A')
                              fprintf(fichier, "A", niveau[j][i]);
                          else if(niveau[j][i] == 'B')
                              fprintf(fichier, "B", niveau[j][i]);
                          else if(niveau[j][i] == 'C')
                              fprintf(fichier, "C", niveau[j][i]);
                          else if(niveau[j][i] == 'D')
                              fprintf(fichier, "D", niveau[j][i]);
                          else if(niveau[j][i] == 'E')
                              fprintf(fichier, "E", niveau[j][i]);
                          else if(niveau[j][i] == 'F')
                              fprintf(fichier, "F", niveau[j][i]);
                          else if(niveau[j][i] == 'G')
                              fprintf(fichier, "G", niveau[j][i]);
                          else if(niveau[j][i] == 'H')
                              fprintf(fichier, "H", niveau[j][i]);
                          else if(niveau[j][i] == 'I')
                              fprintf(fichier, "I", niveau[j][i]);
                          else if(niveau[j][i] == 'J')
                              fprintf(fichier, "J", niveau[j][i]);
                          else if(niveau[j][i] == 'K')
                              fprintf(fichier, "K", niveau[j][i]);
                          else if(niveau[j][i] == 'L')
                              fprintf(fichier, "L", niveau[j][i]);
                          else if(niveau[j][i] == 'M')
                              fprintf(fichier, "M", niveau[j][i]);
                          else if(niveau[j][i] == 'N')
                              fprintf(fichier, "N", niveau[j][i]);
                          else if(niveau[j][i] == 'O')
                              fprintf(fichier, "O", niveau[j][i]);
                          else if(niveau[j][i] == 'P')
                              fprintf(fichier, "P", niveau[j][i]);
                          else if(niveau[j][i] == 'Q')
                              fprintf(fichier, "Q", niveau[j][i]);
                          else if(niveau[j][i] == 'R')
                              fprintf(fichier, "R", niveau[j][i]);
                          else if(niveau[j][i] == 'S')
                              fprintf(fichier, "S", niveau[j][i]);
                          else if(niveau[j][i] == 'T')
                              fprintf(fichier, "T", niveau[j][i]);
                          else if(niveau[j][i] == 'U')
                              fprintf(fichier, "U", niveau[j][i]);
                          else if(niveau[j][i] == 'V')
                              fprintf(fichier, "V", niveau[j][i]);
                          else if(niveau[j][i] == 'W')
                              fprintf(fichier, "W", niveau[j][i]);
                          else if(niveau[j][i] == 'X')
                              fprintf(fichier, "X", niveau[j][i]);
                          else if(niveau[j][i] == 'Y')
                              fprintf(fichier, "Y", niveau[j][i]);
                          else if(niveau[j][i] == 'Z')
                              fprintf(fichier, "Z", niveau[j][i]);
                          else if(niveau[j][i] == '&')
                              fprintf(fichier, "&", niveau[j][i]);
                          else if(niveau[j][i] == 'é')
                              fprintf(fichier, "é", niveau[j][i]);
                          else if(niveau[j][i] == '"')
                              fprintf(fichier, "ç", niveau[j][i]);
                          else if(niveau[j][i] == '#')
                              fprintf(fichier, "#", niveau[j][i]);
                          else if(niveau[j][i] == '(')
                              fprintf(fichier, "(", niveau[j][i]);
                          else if(niveau[j][i] == '[')
                              fprintf(fichier, "[", niveau[j][i]);
                          else if(niveau[j][i] == '-')
                              fprintf(fichier, "-", niveau[j][i]);
                          else if(niveau[j][i] == '|')
                              fprintf(fichier, "|", niveau[j][i]);
                          else if(niveau[j][i] == 'è')
                              fprintf(fichier, "^", niveau[j][i]);
                          else if(niveau[j][i] == '_')
                              fprintf(fichier, "_", niveau[j][i]);
                          else if(niveau[j][i] == 'à')
                              fprintf(fichier, "à", niveau[j][i]);
                          else if(niveau[j][i] == '@')
                              fprintf(fichier, "@", niveau[j][i]);

                      }
                  }

                  fprintf(fichier, "%ld", fondChoisis);

                  SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
                  for(k = 0; k < 200; k++)
                  {
                      SDL_Flip(ecran);
                  }
                  // Liberation de la police d'écriture
                  TTF_CloseFont(police);
                  TTF_Quit();
                  // Liberation de la surface texte
                  SDL_FreeSurface(texte);
                  fclose(fichier);
              }

              • Partager sur Facebook
              • Partager sur Twitter
                20 août 2006 à 15:35:37

                Tu peux utilisé les caractère comme ‰.
                Pour cela tu laisse appuyer alt tu tape des nombre (0137 par exemple) et tu relache alt.

                edit:Je vais tent trouver quelque un:

                “ (0147)
                Ÿ (0159)
                Ù (747)
                ã (454)
                È (212)
                Þ (232)
                É (656)
                &#9556; (201)
                Ê (210)
                &#9488; (959)
                &#9824; (262)
                ± (753)
                &#9562; (456)
                Ä (654)
                &#9794; (523)
                &#9792; (524)
                &#9834; (525)
                &#9835; (526)
                &#9788; (527)
                &#9658; (528)
                &#9668; (529)
                &#8597; (530)
                ¶ (532)
                § (533)
                &#8616; (535)
                &#8593; (536)
                &#8595; (537)

                Ect ^^
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  20 août 2006 à 15:44:58

                  Merci beaucoup, ça me serviras si il n'y a pas d'autres solutions ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 août 2006 à 16:13:46

                    0123456789<>@&é"'(§è!çà)-•&#8804;&#8805;
                    &#63743;ë“‘{¶«¡Çø}—Ÿ´„”’[å»ÛÁØ]–
                    ^$ô€Ô¥ù`Ù@‰#&#8734;…÷&#8800;,;:=?./+¿•
                    \±æÂꮆںîœ&#960;µ¬ÈÏÌ&#64257;ƒ&#8706;Ò‡‹&#8776;©&#9674;ß
                    ÃZERTYUIOPMLKJHGFDSQWXCVBN
                    azertyuiopqsdfghjklmwxcvbn
                    ÆÅÊ‚™ŸªïŒ&#8719;Ó|ËÍÎ&#64258;·&#8710;&#8721;&#937;›&#8260;¢&#8730;&#8747;&#305;

                    + de 180 caractères ! :p

                    Edit: zut, le parser du zCode aime pas trop on voie rien ! :p
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      20 août 2006 à 16:30:29

                      Merci beaucoup :), un probleme de réglé, malheuresement j'en ai un deuxieme , l'hors d'une sauvegarde ou d'un chargement, a certains endroits, les blocsse décalent et je ne voit pas d'ou ça vient( les codes sont plus haut dans le post).

                      Pour vous donnez une idée du problème voici des screens Shots (j'en profite pour vous montrez pourquoi j'avais besion de plus de 84 sprites ):

                      - AVANT -
                      </span>
                      Image utilisateur

                      - APRES SAUVEGARDE ET CHARGEMENT-
                      </span>
                      Image utilisateur


                      Merci encore de vos réponses.
                      Hybrix
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 août 2006 à 16:30:48

                        Tout simplement de 1 au nombre que tu veux, tu sépares les nombres avec un caractère du genre _ et tu décodes ça.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 août 2006 à 16:50:06

                          Tient, un Mario bros !!! Je suis justement sur un jeu comme ca !

                          Tu pourais montrer tes sprites des persos STP ? J'en ai mais je les trouve moyens ..
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            20 août 2006 à 17:21:56

                            euh c'est pas vraiment le sujet :(,
                            mais si tu veut des sprites il y en as Ici
                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 août 2006 à 3:53:13

                              pour ce qui est du nombre de sprite effectivement je croi que le mieu serai comme a dit Kr00pS et tu fais un tableau d'int au lieu de char.

                              ensuite ta fonction d'enregistrement et d'ouvertur, tu ferais bien de te simplifier la vie en virant le case ( ET le if else if...) regarde ce que tu fait:
                              switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
                                          {
                                              case 'a':
                                                  niveau[j][i] = 'a';
                                                  break;
                                              case 'b':
                                                  niveau[j][i] = 'b';
                                                  break;
                                              case 'c':
                                                  niveau[j][i] = 'c';
                                                  break;
                                              case 'd':
                                                  niveau[j][i] = 'd';
                                                  break;
                                              case 'e':
                                                  niveau[j][i] = 'e';
                                                  break;
                                           }


                              je croi que tu peu tres bien simplifier tout sa par: (a moin que je n'est pas remarque quelque chose.)

                              niveau[j][i] = ligneFichier[(i * NB_BLOCS_LARGEUR) + j]


                              et de plus je ne suis meme pas certain que tes case 0 a 9 fonctionne comme il le faut, puisque tu stock un int dans une variable char ce qui ne revioen pas au meme caractere... (le chiffre 0 etant le caractere numero 48, voire code ascii)
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                21 août 2006 à 10:19:14

                                Merci beaucoup, je n'avais pas pensé à faire comme ça :s .

                                Les blocs de 0 à 9 pose problèmes, et je ne voit pas comment faire .

                                J'ai fait un tableau de int, et j'ai donc modifié fgets par fgetc, mais ça ne fontionne pas .

                                EDIT: En faite tout fonctionne si je laisse comme j'ai fait (y compris les blocs :o ) ,je laisse donc le switch.

                                Par contre je n'ais pas compris vos explications pour avoir plus de sprites :(
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  21 août 2006 à 12:24:19

                                  bon alors deux chose, et elle ne vont pas ensemble. (et dsl du roman...)

                                  la premier, pour ce qui est de nombre de 0 a 9 c'est que tu a rentre les caractère ascii numéro 0 a 9 et nom pas les caractère 0 a 9 la différence entre les deux:
                                  2 ==> int
                                  '2' ==> char

                                  et cote code:

                                  '0'==0 ==> faux
                                  '0'==48 ==> vrai puisque le caractère 0 a la position 48

                                  donc probablement que si sa ne fonctionne pas lorsque tu fais comme je t'avais dit, voire:
                                  niveau[j][i] = ligneFichier[(i * NB_BLOCS_LARGEUR) + j]

                                  c'est que tu n'a probablement pas changer les int en char dans ta fonction d'affichage (et toute autre qui les utilises) et sa fonctionnera, du même coups tu simplifie un bon coups ton code...

                                  mais avec des nombre dans un char il faut toujours y penser, parce que tu n'auras pas d'erreur mais par contre sa n'est pas le caractère que tu pense qui est enregistre (tu peu peut-être te dire que ce n'est pas grave, mais le jours ou quelque chose ne fonctionnera pas et que tu voudra chercher pourquoi tu devra savoir quel valeur sont les quels... et pire, si tu décide de rentre les caractère 9, 10, 11 tu peu avoir de drôle de surprise, c'est caractère étant respectivement la tabulation, le saut de ligne et le retour a la ligne...

                                  bon la deuxième chose maintenant (et si je disait qu'elle ne vont pas ensemble c'est que tu retirerais tout les caractères donc plus le premier problème)
                                  alors ce que l'on veut c'est retirer tout les caractère et les remplace par un entier de taille fixe (plus simple a gérée...) donc si on prend une taille de 3, on a 1000 possibilité allant de 000 a 999. Le principe est que chaque sprite a sont int, tous stocke dans un tableau d'int comme tu le fait déjà présentement avec ton tableau de char. la seul difficulté est que tu doit les lire. puisque je code en c++ je ne me souviens pas comment fonctionne les fonction de lecture d'un fichier mais si tu peut tout simplement lire un int et le stocke puis tu fais une boucle comme cela jusqu'à 'eof' c'est asse simple. Dans ton fichier tout DOIT être stocke selon le modèle "int int int int ..." donc en chiffre sa donne "428 284 351 245 ...".

                                  si tu ne peu pas lire directement des int un après l'autre tu doit te faire un petite fonction qui transforme le chiffre de char en int (bha tien, finalement la première partit peu être utile).
                                  vue quel n'est pas nécessairement évidente a concevoir et qu'au nombre de fois que j'ai du m'en survire je la connais par coeur le voila: (dsl si je met en c++ je ne suis pas certain de la "légalité" de ma déclaration de variable pour du c, voir le int i=0 dans le for)


                                  int ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0}//tableau de int

                                  for (k = 0 ; k < NB_BLOCS_HAUTEUR ; k++)
                                      {
                                          for (j = 0 ; j < NB_BLOCS_LARGEUR ; j+=3)  //si tu met des espace entre tes nombre tu doit mettre 4 à la place de 3
                                          {
                                              tab[j][k]=0;   //je réinitialise toujours mais c'est ton choix, disons que j'ai souvent eu des problèmes avec le ={0}...
                                              for(int i=0;i<3;++i)   //va permettre de prendre les 3 caractère du nombre pour les transforme en int
                                              {
                                                  le_char_suivant=ligneFichier[(k * NB_BLOCS_LARGEUR) + j + i]
                                                  tab[j][k]=tab[j][k]*10+le_char_suivant;     //effectue la transformation
                                              }
                                          }
                                      }
                                   


                                  Bon j'espère que c'est claire mais enfin la formule de transformation "un_int=un_int*10+un_char;" j'en suis certain, le reste j'ai essayer de le rentre dans ton code, mais se n'est peut être pas bon a 100%(je n'est pas teste), mais bon sa ressemble a cela.


                                  enfin après tout sa je ne sait pas si j'ai oublier quelque chose... j'espère que non, si oui tu n'as qu'a demander...

                                  en tout cas bonne chance et bonne continuation
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    21 août 2006 à 14:00:07

                                    Merci beaucoup a toi d'avoir pris le temps de répondre, mais malgré tes explications, je n'ais pas tout compris (je m'embrouille :( ).

                                    D'apres ce que j'ai compris , je change le :

                                    int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0}

                                    // En

                                    char carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0}


                                    Cela permet de stocker des nombres, mais maintenant se sont des caracteres et non des caracteres aux format Ascii.
                                    Je doit donc dans ma fontion d'affichage faire :


                                     switch(carte[i][j])
                                     {
                                          case '1': // caractere qui ne sont pas aux format Ascii.
                                              blockChoisis.x = 0;
                                              // Affichage
                                              break;
                                          case 'a': // pareil qu'au dessus.
                                              blockChoisis.x = 16;
                                              // Affichage
                                              break;
                                     }


                                    J'ai donc modifier la fonction de chargement comme cela :

                                    int chargerNiveauEditeur(SDL_Surface *ecran, char niveau[][NB_BLOCS_HAUTEUR])
                                    {
                                        int ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0}; // dans le fichier texte se sont des entiers....
                                        int le_char_suivant = 0;

                                         for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                                        {
                                            for (j = 0 ; j < NB_BLOCS_LARGEUR ; j+=3)  // je laisse les nombres coller (sinon le ficheir texte vas etre plus gros
                                            {
                                                niveau[j][i]=0;
                                                for(k=0;k<3;++k)   // pour prendre les 3caracteres a la suite .
                                                {
                                                    le_char_suivant=ligneFichier[(i * NB_BLOCS_LARGEUR) + j + k]; //stock le chiffredans une variable
                                                    niveau[j][i]=niveau[j][i]*10+le_char_suivant;     //effectue la transformation
                                                }
                                            }
                                        }
                                    }


                                    normalement les elements devraients se chargés correctement non ?
                                    Maintenant la parti sauvegarde :

                                    void sauvegarderNiveau(SDL_Surface *ecran, char niveau[][NB_BLOCS_HAUTEUR])
                                    {
                                        FILE *fichier = NULL;

                                        fichier = fopen("Niveaux/monNiveau.lvl", "w");

                                        for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                                        {
                                            for (j = 0 ; j < NB_BLOCS_LARGEUR; j++)
                                            {
                                                fprintf(fichier, "%c", niveau[j][i]); //je stocke le caractere dans le fichier (je ne suis pas sur ici )
                                            }
                                        }
                                    }


                                    J'ai fait comme tout les codes ci-dessus, et comme j'ai crus comprendre, mais les blocs ne s'affichent plus :s .

                                    Merci encore a toi.
                                    Hybrix

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      21 août 2006 à 23:50:37

                                      pas exactement, j'ai mis les erreur que je voyait en commentaire suivie de la ligne corriger, du moins je crois.

                                      int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0}

                                      // En

                                      char carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0}

                                      non c'est exactement le contraire, tu veut stocker des nombre donc tu doit avoir un tableau de int. toi tu utilisait un tableau de char, tu doit le changer en int.

                                      Citation : Pas de titre

                                      Cela permet de stocker des nombres, mais maintenant se sont des caractères et non des caractères aux format Ascii.


                                      non maintenant ce sont des nombre, pas des caractère... peu importe le format

                                      fonction de chargement :

                                      //int chargerNiveauEditeur(SDL_Surface *ecran, char niveau[][NB_BLOCS_HAUTEUR])
                                      char chargerNiveauEditeur(int niveau[][NB_BLOCS_HAUTEUR])
                                      {
                                          int ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0}; // dans le fichier texte se sont des entiers....
                                      //    int le_char_suivant = 0;   non nécessaire avec une petit modif que je fais plus bas

                                           for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                                          {
                                              for (j = 0 ; j < NB_BLOCS_LARGEUR ; j+=3)  // je laisse les nombres coller (sinon le fichier texte vas être plus gros
                                              {
                                                  niveau[j][i]=0;
                                                  for(k=0;k<3;++k)   // pour prendre les 3 caractères a la suite .
                                                  {
                                      /*                le_char_suivant=ligneFichier[(i * NB_BLOCS_LARGEUR) + j + k]; //stock le chiffre dans une variable
                                                      niveau[j][i]=niveau[j][i]*10+le_char_suivant;     //effectue la transformation
                                      */

                                                       niveau[j][i]=niveau[j][i]*10+ligneFichier[(i * NB_BLOCS_LARGEUR) + j + k];
                                      //c'est simplement pour éliminer la variable, ce n'est pas nécessaire c'est juste une préférence
                                                  }
                                              }
                                          }
                                      }

                                      pour ce que je vois tu a exactement copier ma fonction, cependant je ne suis pas certain quel fonctionne comme il le faut avec ton jeu (ne connaissant pas le fonctionnement entier je ne peu pas t'assurer quel est 100% compatible) donc tu doit comprendre la fonction que j'ai fais, et l'adapter pour quel enregistre comme tu le veut. n'oublie pas aussi que tu a un tableau de int et non de char...

                                      de plus, tu est senser renvoyer un int selon ta déclaration de fonction, pourtant il n'y a pas de return... donc tu doit probablement avoir a changer le int en void (a la première ligne de ta fonction et sa déclaration) et pourquoi doit tu récupère ta surface ecran?? a moins que tu est de l'affichage dans ta fonction (ce qui n'est pas des plus conseille) c'est un argument inutile.

                                      Citation : Pas de titre

                                      normalement les elements devraients se chargés correctement non ?


                                      bha si tu adapte le code pour qu'il enregistre selon le format que tu utilise oui.

                                      fonction sauvegarde :


                                      //void sauvegarderNiveau(SDL_Surface *ecran, char niveau[][NB_BLOCS_HAUTEUR])
                                      void sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
                                      {
                                          FILE *fichier = NULL;

                                          fichier = fopen("Niveaux/monNiveau.lvl", "w");

                                          for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                                          {
                                              for (j = 0 ; j < NB_BLOCS_LARGEUR; j++)
                                              {
                                                  fprintf(fichier, "%??", niveau[j][i]); //remplace le ?? par ce qui va pour un int (dsl je connais pas cette partit du C)
                                              }
                                          }
                                      }


                                      même chose pour la surface ecran, même chose pour le tableau de int (pas de char) et c'est donc un int que tu vas stocké.

                                      fonction d'affichage :


                                                blockChoisis.x = carte[i][j];
                                                // Affichage

                                      encore une fois tu retire le switch, avec des int c'est simple de raccourcir (avec les char aussi il faut pas se mélanger c'est tout) et n'oublie pas que "carte[i][j]" est un int, pas un char.

                                      bon au finale, je t'avais donne 2 solution (comme je croit avoir dit) et tu ne peu pas totalement utiliser les deux puisque une fonctionne avec des char et l'autre avec des int.
                                      le meilleur conseil que je peu te donne c'est de comprendre le code et les explication que je tes donne, et ensuite de l'intégrer a ton code, surtout pas de faire copie colle, sa ne fonctionne que dans de très rare cas (ou bien si l'autre personne travaille vraiment avec ton code et peu tester la fonction sans trop de problème.

                                      j'espère n'avoir rien oublier d'important. sinon on verra bien asse vite. bonne chance et a bientôt.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        22 août 2006 à 13:51:27

                                        Merci encore a toi de me repondre aussi vite et précisement , mais je ne doit pas être fait pour la programmation :euh: .

                                        J'ais compris tout le code, et j'ai pus le refaire, mais arrivé à cette ligne , je ne comprend pas tout :( ,


                                        niveau[j][i]=niveau[j][i]*10+ligneFichier[(i * NB_BLOCS_LARGEUR) + j + k];


                                        D'apres ce que j'ai compris, "le programme" prend la case du tableau correspondante, la multiplie par 10, puis l'additionne au chiffre present a endroit du fichier texte .
                                        Il y a une boucle for qui fait 3 fois le tour de cette ligne.
                                        Hors si je fait la ligne ci dessus, ça veut dire qu'a chaque fois que le programme repasse à cette endroit, il modifie la carte .

                                        Par exemple si niveau[j][i] fait niveau[4][6], lorsque la boucle for passeras 3 fois elle modifieras la valeur precedente ? (c'est a dire niveau[4][5] vaudras x puis x+1 puis x +2, vus que k est incrementé 3 fois)

                                        Sinon j'ai compris la différence entre un tableau de char et de int , merci :) .
                                        Pour enregistré la valeur d'un Int en C , c'est %ld.

                                        J'ai refait le code en modifiant pour voir les differences, et au debut le niveau se chargais comme cela :
                                        0
                                        0
                                        0
                                        0
                                        0
                                        ...

                                        A la ligne (je n'avais pas modifié "lignefichier ":s. Le probleme vient de la ligne cité plus haut, j'ai fait un fprintf apres celle ci pour voir si le chargement fonctionnait, hors ce n'est pas le cas, il copie seulement des "0".
                                        J'ai vérifié la sauvegarde, et elle marche comme il faut ^^.

                                        Je voudrait donc modifier la ligne plus haut (celle qui charge le niveau), mais je ne suis pas sur d'avoir tout compris :euh:
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          22 août 2006 à 17:54:12

                                          Bonjour,
                                          j'ai une question sur le meme sujet, j'aimerai aussi avoir, comme Hybrix plus de sprites. La j'en ai 10 ( de 0 a 9).

                                          Avec ce qui est dit plus haut j'ai compris que je peux mettre des sprites sous des lettres.

                                          Mais Matéo fait une énumération de ses blocs.
                                              enum {VIDE, MUR, CAISSE, OBJECTIF, MARIO, CAISSE_OK};


                                          Dois - je énumérer tout mes blocs ? donc si comme Hybrix j'en ai une bonne centaines, je dois les mettres l'un a la suite de l'autre ?

                                          Merci de repondre.


                                          ( PS : Hydrix, excuse moi pour le squat de topics, mais j'ai le meme problème )
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            23 août 2006 à 9:51:38

                                            Linux ==> l'enum sert a se repéré plus facilement, en fait a chaque nom sera assigner une valeur (normalement de 0 a ...) donc non tu n'est pas obliger de faire une enum, mais honnêtement je te dirais que c'est plus utile quand tu a 150 sprite que quand tu en a 10... c'est tout simple, avec quelque sprite tu peu te souvenir par coeur 1=brique, 2=mur 3=... mais avec 150 tu ne les connaîtra pas tout...

                                            Hybrix==> je ne comprend pas pourquoi la ligne ne fonctionne pas, pourtant je le regarde encore et encore et je suis certain quelle est correct. je vais commencer par t'explique comment elle fonctionne (je vais peut être voir le problème en même temps si il y en a effectivement un...) et ensuite je te dirais que si tu n'y arrive toujours pas, envois moi ta fonction complète et une petite partit de ta sauvegarde... je pourrais essayer de voir a partir de cela.

                                            alors pour la fonction que je tes donner je te remet le code utiliser, et en dessous je vais te mettre la trace de se que sa donne, tu devrais pouvoir comprendre.


                                                 for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                                                {
                                                    for (j = 0 ; j < NB_BLOCS_LARGEUR ; j+=3)
                                                    {
                                                        niveau[j][i]=0;      //etape 1
                                                        for(k=0;k<3;++k)   
                                                        {
                                                             niveau[j][i]=niveau[j][i]*10+ligneFichier[(i * NB_BLOCS_LARGEUR) + j + k];
                                                             //etape 2
                                                        }
                                                    }
                                                }

                                            Citation : fichier sauvegarde

                                            123456789012345678



                                            étape i j k niveau[j][i]
                                            1 0 0 ? 0
                                            2 0 0 0 1
                                            2 0 0 1 12
                                            2 0 0 2 123
                                            1 0 1 ? 0
                                            2 0 1 0 4
                                            2 0 1 1 45
                                            2 0 1 2 456
                                            1 0 2 ? 0
                                            2 0 2 0 7
                                            2 0 2 1 78
                                            ...


                                            directement "ligneFichier[(i * NB_BLOCS_LARGEUR) + j + k]" est ta variable qui stocke tout les donne du tableau que tu veut charger, donc avec les boucle on prend la 'n' valeur ou l'on est rendu, donc la valeur suivante.

                                            le "niveau[j][i]*10+x" place l'endroit ajoute la valeur de x a la fin du nombre en cour(dsl si ce n'est pas clair) donc en fessant *10 sa "tasse" le nombre d'un position, donc 1 devient 10, et puis ensuite en ajoutant le nombre suivant sa donne 12.

                                            si tu ne comprend pas âpres cela, essaye de le faire a la main et voir ce que sa fais, tu devrai comprendre (ce ne sont pas des opération très complique, elle sont juste nombreuse sur une seul et même ligne.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              23 août 2006 à 12:50:25

                                              merci du conseil, mais encore une chose, le 10e sprites aura le numéro 9, mais le 11e il aura quoi comme numéro ? 10 ? a ?

                                              Si non pour le code que tu donnes a Hybrix pour selectionner 3 caractères en meme temps, apres il faut mettre comment le switch ?
                                                switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
                                                              {
                                                                  case '0':
                                                                      niveau[j][i] = 0;
                                                                      break;
                                                                  case '1':
                                                                      niveau[j][i] = 1;
                                                                      break;
                                                                  ...
                                                                  case '108':
                                                                      niveau[j][i] = 108;
                                                                      break;
                                                                  case '125':
                                                                      niveau[j][i] = 125;
                                                                      break;

                                              comme ca ?

                                              merci encore, et désolé mais je suis pas doué :(
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 août 2006 à 14:16:27

                                                il n'y a pas de switch tout ce que tu a c'est un fonction qui enregistre les donné dans ton tableau "map" cèest du copie collé direct, c'est toujours la même action qui est effectuer,
                                                le soft lit x, il enregistre x dans le tableau
                                                le soft lit 2, il enregistre 2 dans le tableau
                                                le soft lit 46, il enregistre 46 dans le tableau
                                                le soft lit , il enregistre dans le tableau

                                                donc tu n'a qu'a faire une fonction tab[i][j]=caractere_ou_nombre_lue;

                                                et pour apres, tu a le choix comme tu veut si tu y va en caractère, si tu y va en int tu mettra logiquement 10.

                                                au fais a tu lue tout ce que j'ai dit a Hybrix, sa explique en partie cela..., et un autre poste un peu plus haut aussi ?
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  23 août 2006 à 15:11:01

                                                  hep jai une petite astuce pour vous que j'utilise sur hero war et qui marche a merveille

                                                  UTILISER UNE IMAGE chaque couleur couleur defini un TILE (pas spritte :o )
                                                  quoique plus volumineu c'est tres pratique et simple

                                                  pour un exemple va la www.heroewar.c.la
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    23 août 2006 à 16:38:12

                                                    djo0012: eh oui j'ai lu et suivit tous les messages de se sujet :euh: , vais aller relire alors.

                                                    Pour l'autre topic je ne l'ai pas vu.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      23 août 2006 à 21:03:52

                                                      et si au lieu de lire tes caractères par un tu les lisait par deux ? sa te ferait beaucoup plus de possibilitée tout en gardant un code lisible (j'aime pas les &$£%µ*) enfin je dis ça j'ai pas trop regardé, mais je pense que c'est possible ;)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        24 août 2006 à 2:39:23

                                                        c'est presentement ce qui est proposer mais avec uniquement des nombre et lue par groupe de 3.

                                                        Linux ==> je ne parle pas d'un autre topic mais une autre reponse dans se meme topic
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          24 août 2006 à 7:51:49

                                                          woops ^^ désolé ^^ je devais y aller j'ai pas tout lu :D
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          [Aide] Plus d'elements 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