Partage
  • Partager sur Facebook
  • Partager sur Twitter

compilation correcte mais erreur d execution

encore le prachute ^^

    21 avril 2006 à 19:41:16

    Voilà, j'ai enfin réussi à complier un prgramme en changeant de compilateur (bye bye dev)

    Par contre, malgré que la compilation marche without problèmes, le prg s'ouvre et se referme directement lorsque je mets un SDL_Flip au début , pour afficher le menu( voir code ci joint) , par contre si je le mets en commentaire , la page reste mais je n'ai pas de menu, et si j'appuie sur 1 , ce qui devrait lancer le jeu, ca quitte quand même le programme :colere:

    Le code :

    // DIRECTIVES
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    // PROTOTYPES
    void initialisation(SDL_Surface *fenetre);
    void chargementNiveau(SDL_Rect positionObjets, SDL_Surface *mario, SDL_Surface *objectif, SDL_Surface *caisse, SDL_Surface *brique, SDL_Surface *menu, SDL_Surface *fenetre, SDL_Rect positionMario,SDL_Rect positionBriques[100],SDL_Rect positionCaisses[100], long i, long j, long k, long l, SDL_Surface *casesVides, SDL_Rect positionCasesVides[100],SDL_Rect positionObjectifs[100]);
    void finition(SDL_Surface *mario, SDL_Surface *objectif, SDL_Surface *caisse, SDL_Surface *brique, SDL_Surface *menu, SDL_Surface *casesVides);
    //FONCTION MAIN
    int main (int argc, char *argv[])
    {
    // variables
    long choixMenu = 0;
    int continuer = 1, attenteMenu = 1;
    long i =0, j = 0, k = 0, l = 0;
    int gauche = 0, droite = 0, haut = 0, bas = 0;
    SDL_Event event;
    //surfaces
    SDL_Surface *fenetre = NULL;
    SDL_Surface *brique = NULL;
    SDL_Surface *mario = NULL;
    SDL_Surface *objectif = NULL;
    SDL_Surface *caisse = NULL;
    SDL_Surface *casesVides = NULL;
    SDL_Surface *menu = NULL;
    // position surfaces
    SDL_Rect positionObjets;
    positionObjets.x = 200;
    positionObjets.y = 100;
    SDL_Rect positionMenu;
    positionMenu.x = 116;
    positionMenu.y = 36;
    SDL_Rect positionBriques[100];
    SDL_Rect positionCaisses[100];
    SDL_Rect positionMario;
    SDL_Rect positionCasesVides[100];
    SDL_Rect positionObjectifs[100];
    initialisation(fenetre);
    //chargement menu
    menu = IMG_Load ("menu.jpg");
    SDL_BlitSurface (menu, NULL, fenetre, &positionMenu);
    //SDL_Flip(fenetre);
    while (attenteMenu)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
            attenteMenu = 0;
            break;
            case SDL_KEYDOWN:
            switch (event.key.keysym.sym)
            {
                case SDLK_ESCAPE:
                attenteMenu = 0;
                break;
                case SDLK_1:
                choixMenu = 1;
                attenteMenu = 0;
                break;
            }
            break;
        }
    }
    // si  on choisit de jouer
    if (choixMenu == 1)
    {
                  SDL_FreeSurface(menu);
                  SDL_FillRect (fenetre, NULL, SDL_MapRGB(fenetre->format, 0, 0, 0));
                  chargementNiveau(positionObjets, mario, objectif, caisse, brique, menu, fenetre, positionMario, &positionBriques[100], &positionCaisses[100],  i,  j,  k,  l, casesVides, &positionCasesVides[100], &positionObjectifs[100]);
                  while (continuer)
                  {
                        // gestion des événements
                        SDL_PollEvent(&event);
                        switch (event.type)
                        {
                               case SDL_QUIT:
                                    continuer = 0;
                                    break;
                               case SDL_KEYDOWN:
                                    switch (event.key.keysym.sym)
                                    {
                                           case SDLK_ESCAPE:
                                                continuer = 0;
                                                break;
                                           case SDLK_UP:
                                                haut = 1;
                                                positionMario.y -= 34;
                                                mario = IMG_Load ("mario_haut.gif");
                                                break;
                                           case SDLK_DOWN:
                                                bas = 1;
                                                positionMario.y += 34;
                                                mario = IMG_Load ("mario_bas.gif");
                                                break;
                                           case SDLK_RIGHT:
                                                droite = 1;
                                                positionMario.x += 34;
                                                mario = IMG_Load ("mario_droite.gif");
                                                break;
                                           case SDLK_LEFT:
                                                gauche = 1;
                                                positionMario.x -= 34;
                                                mario = IMG_Load ("mario_gauche.gif");
                                                break;
                                    }
                                    break;
                        }
                        for (i=0;i<100;i++)
                        {
                            // on annule les mouvements si on cogne un mur
                            if (positionMario.x == positionBriques[i].x && positionMario.y == positionBriques[i].y)
                            {
                                          if(droite)
                                          positionMario.x -= 34;
                                          if(gauche)
                                          positionMario.x += 34;
                                          if(haut)
                                          positionMario.y -= 34;
                                          if(bas)
                                          positionMario.y += 34;
                            }
                        }
                        // on bouge les caisses si on est "dessus"
                        for(j=0;j<100;j++)
                        {
                             if(positionMario.x == positionCaisses[j].x && positionMario.y == positionCaisses[j].y)
                             {
                                                if(droite)
                                                positionCaisses[j].x += 34;
                                                if(gauche)
                                                positionCaisses[j].x -= 34;
                                                if(haut)
                                                positionCaisses[j].y -= 34;
                                                if(bas)
                                                positionCaisses[j].y += 34;
                             }
                        }
                  // on colle le tout et on actualise
                  SDL_BlitSurface (mario, NULL, fenetre, &positionMario);
                  for(i=0;i<100;i++)
                  SDL_BlitSurface (brique, NULL, fenetre, &positionBriques[i]);
                  for(j=0;j<100;j++)
                  SDL_BlitSurface (caisse, NULL, fenetre, &positionCaisses[i]);
                  for(k=0;k<100;k++)
                  SDL_BlitSurface (objectif, NULL, fenetre, &positionObjectifs[k]);
                  for (l=0;l<100;l++)
                  SDL_BlitSurface (casesVides, NULL, fenetre, &positionCasesVides[l]);
                  SDL_Flip(fenetre);
                  }
    }
    finition(mario, objectif, caisse, brique, menu, casesVides);
    return EXIT_SUCCESS;
    }
    // FONCTIONS
    //initialisation SDL, titre fenetre et chargement du mode vidéo
    void initialisation(SDL_Surface *fenetre)
    {
         SDL_Init(SDL_INIT_VIDEO);
         if (SDL_Init(SDL_INIT_VIDEO) == -1)
         {
            fprintf(stderr, "Erreur d'initialisation de la SDL");
            exit(EXIT_FAILURE);
         }
         SDL_WM_SetCaption ("Mario Sokoban", NULL);
         fenetre = SDL_SetVideoMode (640, 480, 32, SDL_HWSURFACE);
         if (fenetre == NULL)
         {
            fprintf(stderr, "Impossible de charger le mode vidéo : %s\nq", SDL_GetError());
            exit(EXIT_FAILURE);
         }
         SDL_FillRect (fenetre, NULL, SDL_MapRGB(fenetre->format, 0, 0, 0));
    }
    // affichage du niveau depuis un fichier
    void chargementNiveau(SDL_Rect positionObjets, SDL_Surface *mario, SDL_Surface *objectif, SDL_Surface *caisse, SDL_Surface *brique, SDL_Surface *menu, SDL_Surface *fenetre, SDL_Rect positionMario,SDL_Rect positionBriques[100],SDL_Rect positionCaisses[100], long i, long j, long k, long l, SDL_Surface *casesVides, SDL_Rect positionCasesVides[100],SDL_Rect positionObjectifs[100])
    {
         char caractereNiveau = 0;
         FILE* fichier = NULL;
         fichier = fopen("niveau1.txt", "r");
         if (fichier != NULL);
         {
            do
            {
               caractereNiveau = fgetc(fichier);
               if (caractereNiveau == 'b')
               {
                  positionBriques[i].x = positionObjets.x;
                  positionBriques[i].y = positionObjets.y;
                  brique = IMG_Load ("brique.jpg");
                  SDL_BlitSurface (brique, NULL, fenetre, &positionObjets);
                  positionObjets.x += 34;
                  if (positionObjets.x >= 540)
                  {
                     positionObjets.y += 34;
                     positionObjets.x = 100;
                  }
               i++;
               }
               else if (caractereNiveau == 'c')
               {
                  caisse = IMG_Load ("caisse.jpg");
                  SDL_BlitSurface (caisse, NULL, fenetre, &positionObjets);
                  positionCaisses[j].x = positionObjets.x;
                  positionCaisses[j].y = positionObjets.y;
                  positionObjets.x += 34;
                  if (positionObjets.x >= 540)
                  {
                     positionObjets.y += 34;
                     positionObjets.x = 100;
                  }
               j++;
               }
               else if (caractereNiveau == 'm')
               {
                    mario = IMG_Load ("mario_bas.gif");
                    SDL_BlitSurface (mario, NULL, fenetre, &positionObjets);
                    positionMario.x = positionObjets.x;
                    positionMario.y = positionObjets.y;
                    positionObjets.x += 34;
                    if (positionObjets.x >= 540)
                    {
                       positionObjets.y += 34;
                       positionObjets.x = 100;
                    }
               }
               else if (caractereNiveau == 'o')
               {
                  objectif = IMG_Load ("objectif.png");
                  SDL_BlitSurface (objectif, NULL, fenetre, &positionObjets);
                  positionObjectifs[k].x = positionObjets.x;
                  positionObjectifs[k].y = positionObjets.x;
                  positionObjets.x += 34;
                  if (positionObjets.x >= 540)
                  {
                     positionObjets.y += 34;
                     positionObjets.x = 100;
                  }
               k++;
               }
               else
               {
                   casesVides = SDL_CreateRGBSurface(SDL_HWSURFACE, 34, 34, 32, 0, 0, 0, 0);
                   SDL_FillRect (casesVides, NULL, SDL_MapRGB(fenetre->format, 0, 0, 255));
                   positionCasesVides[l].x == positionObjets.x;
                   positionCasesVides[l].y == positionObjets.y;
                   l++;
                   positionObjets.x += 34;
                   if (positionObjets.x >= 540)
                   {
                                        positionObjets.y += 34;
                                        positionObjets.x = 100;
                   }
               }
            }while(caractereNiveau != EOF);
         fclose(fichier);
         SDL_Flip(fenetre);
         }
    }
    //finition SDL et libération des surfaces
    void finition(SDL_Surface *mario, SDL_Surface *objectif, SDL_Surface *caisse, SDL_Surface *brique, SDL_Surface *menu, SDL_Surface *casesVides)
    {
         SDL_FreeSurface(mario);
         SDL_FreeSurface(objectif);
         SDL_FreeSurface(caisse);
         SDL_FreeSurface(brique);
         SDL_FreeSurface(menu);
         SDL_FreeSurface(casesVides);
         SDL_Quit();
    }

    C'est long , mais je pense que l'erreur vient du début plutôt, soit dit en passant, si quelqu'un pouvait me dire si ma manière de lire un fichier pour charger le niveau a une chance de marcher ou non. Je précise que l'absence de gestion des collisions cases-objectifs est normal, je vais m'en occuper dès que le bug est terminé ;)


    • Partager sur Facebook
    • Partager sur Twitter
      21 avril 2006 à 19:58:25

      Je pense que tu à tort de changer de compilo (de plus ce n'est pas dev le compilateur mais gcc ou mingw32)
      Si la compilation marche sur un autre, c'est qu'il est moins performant et qu'il ne détecte pas l'erreur, la preuve ca ne marche toujours pas ^^ .
      Une erreur de "parachute", c'est peut-être que l'image que tu charges n'existe pas ou que tu la blite mal...
      Verifis si tu ne dépasse pas les bordures de ta fenêtre ou autre chose dans ce style (dsl mais je n'ai pas le temps de regarder) ++.
      • Partager sur Facebook
      • Partager sur Twitter
        21 avril 2006 à 20:22:58

        Euh, je ne pense pas, j'ai beau revérifier mon code, je ne trouve pas, un autre maateur pls ? :-°
        • Partager sur Facebook
        • Partager sur Twitter
          21 avril 2006 à 20:39:38

          Salut N1gHtm@r3 !
          Je pense que ton problème vient du fait que tu n'as pas "initialisé" ta surface fenetre ainsi que la SDL.
          Tu devrais mettre après avoir déclaré tes positions par exemple:
          SDL_Init(SDL_INIT_VIDEO);

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


          Je pense que cela résoudra ton problème (je n'ai pas vérifié désolé).

          @+
          • Partager sur Facebook
          • Partager sur Twitter
            21 avril 2006 à 21:50:38

            Voir fonction initialisation en dessous , bien essayé :-°
            • Partager sur Facebook
            • Partager sur Twitter
              22 avril 2006 à 2:24:06

              Elle est peut être en dessous mais tu ne l'appelle pas dans ton main.... Donc forcément elle n'est pas initiaslisé ^^ Donc raté :p

              Enfait si tu l'initialise mais... Ta surface fenetre n'est pas existante dans la fonction initialisation :) donc bug programme puisque tu essai d'acceder à des var qui n'appartiennent pas a cette fonction :)
              • Partager sur Facebook
              • Partager sur Twitter
                22 avril 2006 à 14:22:44

                Euh désolé mais la surface fenetre est dans les paramètres, s'il n'était pas celà donnerait lieu de toute façon à une erreur de compilation :-°

                void initialisation(SDL_Surface *fenetre)
                • Partager sur Facebook
                • Partager sur Twitter
                  22 avril 2006 à 15:29:05

                  Je pense qu'Alcor à voulu dire que tu ne mettait pas de paramètres dans ta fonction quand tu fait appel:

                  initialisation();


                  Je pense qu'il faudrait mettre le pointeur fenetre dans les parenthèses,non?? Dites moi si je me trompe.

                  @+
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 avril 2006 à 15:51:04

                    Exact... Ton prototype et ton appel ne transmettent aucun paramètres....
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 avril 2006 à 16:00:30

                      Lorsque je le fais j'ai ca :

                      syntax error before "1er paramètre"

                      les 3 fonctions :

                      initialisation(SDL_Surface *fenetre);
                      chargementNiveau(SDL_Rect positionObjets, SDL_Surface *mario,etc....);
                      finition(SDL_Surface *mario, SDL_Surface *objectif, SDL_Surface *caisse, SDL_Surface *brique, SDL_Surface *menu, SDL_Surface *casesVides);


                      J'ai l'erreur pour les trois ce qui donne

                      syntax error before"SDL_Surface"
                      // // // "SDL_rec"
                      // // // "SDL_Surface"


                      EDIT : ah oui, pour les prototypes c'était déjà fait avant, j'avais aussi essayé de rajouter dans les appels mais ca foirait donc j'ai viré ...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 avril 2006 à 16:20:41

                        Bonjour.
                        Esaie plutot de mettre :
                        initialisation (&fenetre);

                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 avril 2006 à 16:59:57

                          Citation : lucky55

                          Bonjour.
                          Esaie plutot de mettre :

                          initialisation(&fenetre);




                          A mon avis c'est plutot
                          initialisation(fenetre);
                          :SDL_SetVideoMode() renvoie un pointeur sur SDL_Surface
                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 avril 2006 à 10:55:10

                            J'ai édité le code du dessus, les fonctions , je suppose, marchent sans prblème maintenant, mais ca ne va toujours pas, en effet , si je mets le SDL_Flip(fenetre) du début en commentaire la fenetre s'affiche et reste (mais sans le menu et quand j'appuie sur le 1 pour lancer le jue ca fait rien) et si je le mets dans le code, bah la fenetres 'affiche et se ferme immédiatement

                            Quelqu'un voit l'origine du problème, en passant merci pour les fonctions, j'aurais dû relire le chapitre :-°
                            • Partager sur Facebook
                            • Partager sur Twitter

                            compilation correcte mais erreur d execution

                            × 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