Partage
  • Partager sur Facebook
  • Partager sur Twitter

swith d'un tableau 2D

    8 mai 2006 à 20:15:33

    Bonsoir...

    Je me suis lancé hier dans la création d'un petit jeu type PiouPiou(voir célébère site de jeu en ligne) où le but est d'éviter des blocs qui tombent)
    J'ai repris les images de Mario Sokoban et j'ai créé une surface , terrain, composée d'un tableau à deux dimensions. ;)
    En fait le prog analyse les chiffres du tableau 1 par 1 et en fonction du nombre, crée une certaine surface heros, caisse, brique, etc.... :)
    Le probleme, c'est que pour mettre toutes ces conditions j'avais mis des if, mais ca prenait beaucoup de trop de place et dans un accès d'intelligence subit, j'ai pensé au switch :D ...Malheureusement, la compilation plante lamentablement :( J'ai également , depuis le début, un warning pour chaque ligne du teableau ou j'ai écrit autre chose que zéro...
    Here are the errors :

    invalization makes pointer from integrer without a cast
    Ceci pour les lignes du tableau
    switch quantity not an integrer
    ceci pour le switch(terrain[etc][etc])
    Here's the code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL_Image.h>
    #define LARGEUR_FENETRE 680
    #define HAUTEUR_FENETRE 680
    #define LARGEUR_TERRAIN 680
    #define HAUTEUR_TERRAIN 680
    #define NMB_BLOCKS_L 20
    #define NMB_BLOCKS_H 20
    int main (int argc, char *argv[])
    {
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
    long i=0, j=0;
    int continuer = 1;
    SDL_Surface *brique = NULL;
    SDL_Surface *caisse = NULL;
    SDL_Surface *heros = NULL;
    SDL_Surface *fenetre = NULL;
    SDL_Surface *terrain[NMB_BLOCKS_L][NMB_BLOCKS_H] = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                        {1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1},
                                                        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
    SDL_Rect positionObjets;
    fenetre = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format, 0, 0, 0));
    while (continuer)
    {
        for(i=0;i<NMB_BLOCKS_L;i++)
        {
            for(j=0;j<NMB_BLOCKS_H;j++)
            {
                switch (terrain[NMB_BLOCKS_L][NMB_BLOCKS_H])
                {
                    case 0:
                        positionObjets.x += 34;
                        if (positionObjets.x == LARGEUR_TERRAIN)
                        {
                            positionObjets.x = 0;
                            positionObjets.y += 34;
                        }
                        break;
                    case 1:
                        terrain[i][j] = IMG_Load("brique.jpg");
                        SDL_BlitSurface (terrain[i][j], NULL, fenetre, &positionObjets);
                        positionObjets.x += 34;
                        if (positionObjets.x == LARGEUR_TERRAIN)
                        {
                            positionObjets.x = 0;
                            positionObjets.y += 34;
                        }
                        break;
                    case 2:
                        terrain[i][j] = IMG_Load("mario_gauche.jpg");
                        SDL_BlitSurface (terrain[i][j], NULL, fenetre, &positionObjets);
                        positionObjets.x += 34;
                        if (positionObjets.x == LARGEUR_TERRAIN)
                        {
                            positionObjets.x = 0;
                            positionObjets.y += 34;
                        }
                        break;
                }
            }
        }
    }
    SDL_FreeSurface(fenetre);
    SDM_FreeSurface(brique);
    SDL_FreeSuface(heros);
    SDL_FreeSurface(caisse);
    SDL_Quit();
    return EXIT_SUCCESS;
    }

    • Partager sur Facebook
    • Partager sur Twitter
      8 mai 2006 à 20:24:37

      Bonsoir,

      Je ne sais pas si ca va resoudre tous tes problemes mais je pense que la definition de ton tableau n'est pas correcte. Essaye ça peut-etre :


      int terrain[NMB_BLOCKS_L][NMB_BLOCKS_H] = ...
      • Partager sur Facebook
      • Partager sur Twitter
        8 mai 2006 à 21:25:32

        j'ai modifié quelques petit trucs et je suis arrivé à ce code là, la compilation marche parfaitement, mais rien ne s'affiche...Et je ne vois pas pourquoi...(ne pas faire attention à la boucles infinies... le procédé c'est que j'ai deux tableaux 2D de 20 Lig et 20 Coll, un de nombres, un de surfaces (400 nombres et surfaces quoi) Et je veux faire correspondre les nombres du premier tableau à une certaine surface du second teableau et afficher cette surface à partir donc du second tableau...

        #include <stdio.h>
        #include <stdlib.h>
        #include <SDL/SDL_Image.h>
        #define LARGEUR_FENETRE 680
        #define HAUTEUR_FENETRE 680
        #define LARGEUR_TERRAIN 680
        #define HAUTEUR_TERRAIN 680
        #define NMB_BLOCKS_L 20
        #define NMB_BLOCKS_H 20
        int main (int argc, char *argv[])
        {
        SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
        long i=0, j=0;
        int continuer = 1;
        SDL_Surface *brique = NULL;
        SDL_Surface *caisse = NULL;
        SDL_Surface *heros = NULL;
        SDL_Surface *fenetre = NULL;
        SDL_Surface *surfacesTerrain[NMB_BLOCKS_L][NMB_BLOCKS_H];
        long terrain[NMB_BLOCKS_L][NMB_BLOCKS_H] = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                                    {1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1},
                                                    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
        SDL_Rect positionObjets;
        fenetre = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format, 0, 0, 0));
        while (continuer)
        {
            for(i=0;i<NMB_BLOCKS_L;i++)
            {
                for(j=0;j<NMB_BLOCKS_H;j++)
                {
                    switch (terrain[NMB_BLOCKS_L][NMB_BLOCKS_H])
                    {
                        case 0:
                            positionObjets.x += 34;
                            if (positionObjets.x == LARGEUR_TERRAIN)
                            {
                                positionObjets.x = 0;
                                positionObjets.y += 34;
                            }
                            break;
                        case 1:
                            surfacesTerrain[i][j] = IMG_Load("brique.jpg");
                            SDL_BlitSurface (surfacesTerrain[i][j], NULL, fenetre, &positionObjets);
                            positionObjets.x += 34;
                            if (positionObjets.x == LARGEUR_TERRAIN)
                            {
                                positionObjets.x = 0;
                                positionObjets.y += 34;
                            }
                            break;
                        case 2:
                            surfacesTerrain[i][j] = IMG_Load("mario_gauche.jpg");
                            SDL_BlitSurface (surfacesTerrain[i][j], NULL, fenetre, &positionObjets);
                            positionObjets.x += 34;
                            if (positionObjets.x == LARGEUR_TERRAIN)
                            {
                                positionObjets.x = 0;
                                positionObjets.y += 34;
                            }
                            break;
                    }
                }
            }
        }
        SDL_FreeSurface(fenetre);
        SDL_FreeSurface(brique);
        SDL_FreeSurface(heros);
        SDL_FreeSurface(caisse);
        SDL_Quit();
        return EXIT_SUCCESS;
        }
        • Partager sur Facebook
        • Partager sur Twitter
          8 mai 2006 à 23:34:25

          Bon, je me suis serieusement penché sur ton affaire et j'y ai apporté toutes les modifications indispensables pour que ca marche. Et comme y'en a pas mal, j'ai préféré tout faire sous forme de commentaires :

          #include <stdio.h>
          #include <stdlib.h>
          #include <SDL/SDL.h> //ne pas oublier la librairie SDL...tout de meme...
          #include <SDL/SDL_image.h>

          #define LARGEUR_FENETRE 680
          #define HAUTEUR_FENETRE 680
          #define LARGEUR_TERRAIN 680
          #define HAUTEUR_TERRAIN 680
          #define NMB_BLOCKS_L 20
          #define NMB_BLOCKS_H 20


          int main (int argc, char *argv[])
          {
              //on definit un evenement pour pouvoir quitter (voir plus bas)
              SDL_Event event;

              long i=0, j=0;
              int continuer = 1;
              SDL_Rect positionObjets;
              SDL_Surface *brique = NULL, *heros = NULL, *fenetre = NULL;

              /*tu n'as besoin que d'un seul tableau; il suffit de charger l'image une
              fois et de la blitter quand tu en as envie, autant que tu veux*/

              long terrain[NMB_BLOCKS_L][NMB_BLOCKS_H] = {...};

              SDL_Init(SDL_INIT_VIDEO);
              fenetre = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

              SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format, 0, 0, 0));

              heros = IMG_Load("mario_gauche.gif");//fais attention au format des images
              brique = IMG_Load("mur.jpg");

              while (continuer)
              {
                  //on remplit l'ecran de noir pour eviter les traces si tu deplaces un objet
                  SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format, 0, 0, 0));

                  for(i=0; i<NMB_BLOCKS_L; i++)
                  {
                      for(j=0; j<NMB_BLOCKS_H; j++)
                      {
                          //positionObjets se definit par rapport à i et j
                          positionObjets.x = 34*j;
                          positionObjets.y = 34*i;

                          //le switch doit contenir les variables des boucles for (pas des constantes)
                          switch ((terrain[i][j]))
                          {
                              //le "case 0:" est inutile puisque tu n'y fais rien

                              case 1:
                              SDL_BlitSurface (brique, NULL, fenetre, &positionObjets);
                              break;

                              case 2:
                              SDL_BlitSurface (heros, NULL, fenetre, &positionObjets);
                              break;
                          }
                      }
                  }
                  //ne pas oublier de flipper l'ecran, sinon ca marche pas...
                  SDL_Flip(fenetre);

                  //on attend un evenement et on quitte si necessaire
                  SDL_WaitEvent(&event);
                  switch(event.type)
                  {
                      case SDL_QUIT: continuer = 0; break;
                  }
              }

              //SDL_FreeSurface(fenetre) : inutile car fermé avec SDL_Quit();
              SDL_FreeSurface(brique);
              SDL_FreeSurface(heros);
              SDL_Quit();
              return EXIT_SUCCESS;
          }


          Ce code fonctionne. Si tu ne comprends pas certains trucs, n'hesites pas à demander.
          Voilà, j'espere que c'est à peu pres ce que tu voulais faire (je dois avouer que j'ai des doutes à cause de ton histoire de deuxieme tableau...).
          • Partager sur Facebook
          • Partager sur Twitter
            9 mai 2006 à 17:49:09

            Hmm quelques précisions :

            1) Merci bien pour le SDL_Flip , je l'avais oublié...
            2) , SDL est automatiquement initialisée lorsque tu initialises SDL_Image, donc ligne inutile :)
            3) Et si le case 0 est utile car sinon il n'augmentera pas la position et je n'aurai qu'une ligne de briques au final alors qu'il faut 19 lignes de vides et 1 ligne de brique :)
            4) Les event, je comptais m'y mettre après que l'affichage soit réussi.
            5) A moins que je me trompe, avec ta technique de blittage, ca ne saurait pas marcher pour les collisions car ca ne prendra en compte que la dernière brique affichée et pas la première, c'est pour ca qu'il fallait un 2nd tableau.

            Sinon j'ai réessayé et pour l'instant ca m'affiche des briques petit à petit jusqu'à remplir tout l'écran, enfin je vais essayer de corriger ca tout seul comme un grand :)

            Merci encore
            • Partager sur Facebook
            • Partager sur Twitter
              9 mai 2006 à 18:22:43

              Pour SDL_image, je me coucherai moins bete ce soir :)
              Pour ton histoire de collisions, je ne comprends pas exactement ce que tu veux faire. Et puis collisions entre quoi et quoi ?
              • Partager sur Facebook
              • Partager sur Twitter
                9 mai 2006 à 18:33:57

                Les collisions sont indispensables dans mon jeu, de plus le but étant d'éviter des caisses, je comptais mettre la vitesse de ces caisses aléatoire, et avec ton moyen, il n'est pas possible de gérer, je pense, la descente de plusieurs caisses à la fois et qui tombent un plus indépendamment l'une de l'autre(au niveau de la hauteur et de la vitesse).

                Sinon bah collisions entre caisse et caisse( lorsuq'elles touchent le sol quoi) , entre caisse et mario (cuic le mario) etc...
                • Partager sur Facebook
                • Partager sur Twitter
                  9 mai 2006 à 19:08:19

                  Utiliser un tableau pour gerer les caisses qui tombent t'impose un nombre limité de position, ce qui n'est pas interessant.
                  Quoi que tu fasses, si tu veux que les caisses tombent de maniere fluide, tu va etre obligé de stocker leurs positions respectives, leur vitesse et autres (dans une structure par exemple). En plus, ca te permettra de tester facilement les collisions entre les differents elements.
                  Tu devras faire pareil avec mario.

                  Tu peux par contre garder le bout de code precedent pour afficher le "decor".
                  • Partager sur Facebook
                  • Partager sur Twitter

                  swith d'un tableau 2D

                  × 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