Partage
  • Partager sur Facebook
  • Partager sur Twitter

Super Mario (petit problème)

N'arrive pas à faire bouger mario à droite

    14 juillet 2006 à 12:33:21

    Bon voilà je suis en train de coder un petit jeux, un Mario (comme beaucoup de monde d'ailleur) mais j'ai u problème, mon mario bouge bien à gauche mais à droite il ne bouge pas pourtant j'ai bien mis ce qu'il fallait, enfin je crois ... :-°

    Voilà monde code :
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    #include "jouer.h"
    #include "constante.h"
    #include "define.h"

    void jouer(SDL_Surface *ecran)
    {
             // Variable classique
            int continuer = 1, i = 0;

            SDL_Event event;


            // Création des variables pour la gestion du temps pour les enemis
            int tempsActuel = 0, tempsPrecedant = 0;


            // Initialise les variables des surfaces des personnages
            SDL_Surface *mario[4] = {NULL}, *goomba[2] = {NULL}, *marioActuel = NULL, *bloc = NULL, *goombaActuel = NULL, *fond = NULL;

            // Initialise les mondes
            SDL_Surface *world1[30] = {NULL}, *world2[30] = {NULL}, *world3[30] = {NULL};

            // Initialisation des positions des Objets
            SDL_Rect positionMario;
            SDL_Rect positionGoomba;
            SDL_Rect positionFond;





            bloc = IMG_Load("bloc.png");
           
            mario[SAUT_GAUCHE] = IMG_Load("mario saut_gauche.png");
            mario[SAUT_DROIT] = IMG_Load("mario saut droite.png");
            mario[GAUCHE] = IMG_Load("mario gauche.png");
            mario[DROITE] = IMG_Load("mario droite.png");

            goomba[G_GAUCHE] = IMG_Load("goomba gauche.png");
            goomba[G_DROITE] = IMG_Load("goomba_droite.png");

            fond = IMG_Load("fond.jpg");

            // Charge les imgages des mondes
            for(i = 0; i < 30; i++)
            {
                    world1[i] = IMG_Load("fond.jpg");
            }



            marioActuel = mario[DROITE];
            goombaActuel = goomba[G_GAUCHE];

            // Position Mario
            positionMario.x = 50;
            positionMario.y = 370;
            // Position initial du Goomba
            positionGoomba.x = 565;
            positionGoomba.y = 385;

            // Position du fond
            positionFond.x = 0;
            positionFond.y = 0;


            SDL_EnableKeyRepeat(100, 100);

            while(continuer)
            {
                    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_RIGHT:
                                    marioActuel = mario[DROITE];
                                    deplaceMario(&positionMario, DROITE);
                                    break;

                            case SDLK_LEFT:
                                    marioActuel = mario[GAUCHE];
                                    deplaceMario(&positionMario, GAUCHE);
                                    break;


                            }
                            break;

           

                    }

                    // Bouge le goomba
                    tempsActuel = SDL_GetTicks();
                    if(tempsActuel - tempsPrecedant > 10)
                    {
                            positionGoomba.x--;
                            tempsPrecedant = tempsActuel;
                    }




                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

                    SDL_BlitSurface(fond, NULL, ecran, &positionFond);

                    SDL_BlitSurface(marioActuel, NULL, ecran, &positionMario);

                    SDL_BlitSurface(goombaActuel, NULL, ecran, &positionGoomba);

                    SDL_Flip(ecran);
            }

            SDL_FreeSurface(fond);
            for(i = 0; i < 4; i++)
            {
                    SDL_FreeSurface(mario[i]);
            }

            for(i = 0; i < 2; i++)
            {
                    SDL_FreeSurface(goomba[i]);
            }

            SDL_FreeSurface(bloc);

            SDL_Quit();

            return ;
    }

    // Fonction gérant le déplacement de Mario
    void deplaceMario(SDL_Rect *positionMario, int direction)
    {
            switch(direction)
            {
            case DROITE:
                    if(positionMario->x > 480)
                    {
                            break;
                    }

            positionMario->x++;

            case GAUCHE:
                    if(positionMario->x < 0)
                            break;

                    positionMario->x--;

            }

            return ;
    }
    • Partager sur Facebook
    • Partager sur Twitter
      14 juillet 2006 à 12:56:25

      Le problème vien de ton case mal foutu. Tu as oublié un break. Ce qui se passe c'est que tu incrémente ( case droite ) puis tu décrémente tout de suite après ( case gauche ). Si tu oublie le break tous les cas suivant vont être exécutés.


      switch(direction)
      {
          case DROITE:
              if(positionMario->x > 480)
                  break;
             
              positionMario->x++;
              break;
         
          case GAUCHE:
              if(positionMario->x < 0)
                  break;
              positionMario->x--;
         
      }
      • Partager sur Facebook
      • Partager sur Twitter
        14 juillet 2006 à 13:07:59

        Merci ca venait biend du break, pour ce qui est du switch si il est mal fait c'est que j'ai fait du rafistolage en cherchant un autre code que j'avais précedemment fait sui te au cours de M@téo sur le Mario Sokoban (pour pas ma fouler :-° ).
        • Partager sur Facebook
        • Partager sur Twitter
          14 juillet 2006 à 13:23:12

          Mets l'onglet résolu si tout marche correctement, et fais nous part de tes améliorations pour que tout le monde en profite :)
          • Partager sur Facebook
          • Partager sur Twitter
            14 juillet 2006 à 13:35:23

            C'est bon je les mis en résolu et je vous montrerai le jeux quand il sera plus abouti ;) et encore merci
            • Partager sur Facebook
            • Partager sur Twitter
              15 juillet 2006 à 17:23:30

              Je suis désolé mais un autre problème sur mon jeux et je ne voulais pas créer un autre topic inutiliement ;) .

              Ca serait pour faire bouger un goomba tout seul, le problème c'est que j'aimerais qu'il parte dans le sens opposé quand il touche par exemple une partie de l'écran.

              Pour plus de précision voici le code (désolé s'il est un peu confus mais comme je l'ai dit plus haut j'ai fait du rafistolageavec d'autre bout de code ;) .

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

              #include "jouer.h"
              #include "constante.h"
              #include "define.h"

              void jouer(SDL_Surface *ecran)
              {
                       // Variable classique
                      int continuer = 1, i = 0, direction = 0;

                      SDL_Event event;


                      // Création des variables pour la gestion du temps pour les enemis
                      int tempsActuel = 0, tempsPrecedant = 0, tempsActuel2 = 0, tempsPrecedant2 = 0;


                      // Initialise les variables des surfaces des personnages
                      SDL_Surface *mario[4] = {NULL}, *goomba[2] = {NULL},*goomba2[2]= {NULL};
                      SDL_Surface *marioActuel = NULL, *bloc = NULL, *goombaActuel = NULL,*goombaActuel2 = NULL, *fond = NULL;

                      // Initialise les mondes
                      SDL_Surface *world1[30] = {NULL}, *world2[30] = {NULL}, *world3[30] = {NULL};

                      // Initialisation des positions des Objets
                      SDL_Rect positionMario;
                      SDL_Rect positionGoomba;
                      SDL_Rect positionFond;
                      SDL_Rect positionGoomba2;
                      SDL_Rect positionBloc;





                      bloc = IMG_Load("bloc.png");
                     
                      mario[SAUT_GAUCHE] = IMG_Load("mario saut_gauche.png");
                      mario[SAUT_DROIT] = IMG_Load("mario saut droite.png");
                      mario[SAUT] = IMG_Load("mario saut droite.png");
                      mario[GAUCHE] = IMG_Load("mario gauche.png");
                      mario[DROITE] = IMG_Load("mario droite.png");

                      goomba[G_GAUCHE] = IMG_Load("goomba gauche.png");
                      goomba[G_DROITE] = IMG_Load("goomba_droite.png");


                      fond = IMG_Load("fond.jpg");

                      // Charge les imgages des mondes
                      for(i = 0; i < 30; i++)
                      {
                              world1[i] = IMG_Load("fond.jpg");
                      }



                      marioActuel = mario[DROITE];
                      goombaActuel = goomba[G_GAUCHE];
                      goombaActuel2 = goomba[G_GAUCHE];

                      // Position Mario
                      positionMario.x = 50;
                      positionMario.y = 370;
                      // Position initial du Goomba
                      positionGoomba.x = 565;
                      positionGoomba.y = 385;
                      // Position de Goomba2
                      positionGoomba2.x = 315;
                      positionGoomba2.y = 256;

                      // Position Bloc1
                      positionBloc.x = 145;
                      positionBloc.y = 265;

                      // Position du fond
                      positionFond.x = 0;
                      positionFond.y = 0;


                      SDL_EnableKeyRepeat(100, 100);

                      while(continuer)
                      {
                              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_RIGHT:
                                              marioActuel = mario[DROITE];
                                              deplaceMario(&positionMario, DROITE, &event);
                                              break;

                                      case SDLK_LEFT:
                                              marioActuel = mario[GAUCHE];
                                              deplaceMario(&positionMario, GAUCHE, &event);
                                              break;

                                      case SDLK_UP:
                                              marioActuel = mario[SAUT];
                                              deplaceMario(&positionMario, SAUT, &event);
                                              break;



                                      }

                                             

                     

                              }

                                      // Bouge le 1er goomba ver la droite
                                      positionGoomba.x--;

                                      // Bouge le 2ème goomba sur le bloc ver la droite
                                      positionGoomba2.x--;



                                                     
                             
                      SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

                              SDL_BlitSurface(fond, NULL, ecran, &positionFond);

                              SDL_BlitSurface(marioActuel, NULL, ecran, &positionMario);

                              // Blit du goomba 1
                              SDL_BlitSurface(goombaActuel, NULL, ecran, &positionGoomba);

                              // Blit du goomba 2
                              SDL_BlitSurface(goombaActuel2, NULL, ecran, &positionGoomba2);

                              // Blit du bloc 1
                              SDL_BlitSurface(bloc, NULL, ecran, &positionBloc);

                              SDL_Flip(ecran);
                      }

                      SDL_FreeSurface(fond);
                      for(i = 0; i < 4; i++)
                      {
                              SDL_FreeSurface(mario[i]);
                      }

                      for(i = 0; i < 2; i++)
                      {
                              SDL_FreeSurface(goomba[i]);
                      }

                      SDL_FreeSurface(bloc);

                      SDL_Quit();

                      return ;
              }

              // Fonction gérant le déplacement de Mario
              void deplaceMario(SDL_Rect *positionMario, int direction, SDL_Event *event)
              {
                      switch(direction)
                      {
                              SDL_PollEvent(event);
                      case DROITE:
                              if(positionMario->x > 620)
                              {
                                      break;
                              }

                      positionMario->x++;
                              break;

                      case GAUCHE:
                              if(positionMario->x < 0)
                                      break;

                              positionMario->x--;

                             

                      }

                      return ;
              }


              Voilà je vous remercie d'avance pour vos réponses.
              • Partager sur Facebook
              • Partager sur Twitter

              Super Mario (petit problème)

              × 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