Partage
  • Partager sur Facebook
  • Partager sur Twitter

Super Mario, 2 problemes

collisions et goomba

    5 juillet 2006 à 12:44:54

    Salut a tous, grace aux cours de Matéo21 je devellope un petit Super Mario Bros

    voici une petite video :

    Video

    Comme vous pouvez le voir, j'ai 2 problemes :

    1-Pour que le Goomba bouge, il faut bouger
    2-Quand on entre dans le Goomba ca fait rien ( je connais pas les collisions )

    quelqu'un peut m'aider voici le code :

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



    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *imageDeFond = NULL, *Mario = NULL, *Goomba = NULL, *Mariod = NULL;
        SDL_Rect positionFond, positionMario, positionGoomba;
        SDL_Event event;
        int continuer = 1;
        int tempsPrecedent = 0, tempsActuel = 0;

        positionFond.x = 0;
        positionFond.y = 0;
        positionMario.x = 3;
        positionMario.y = 348;
        positionGoomba.x = 480;
        positionGoomba.y = 360;

        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Super Mario", NULL);

        imageDeFond = SDL_LoadBMP("fond.bmp");

        Mario = IMG_Load("pm.png");
       
        Goomba = IMG_Load("goomba.png");
       



     
    SDL_EnableKeyRepeat(7, 7);
       
    while (continuer)
        {
                     
     
               
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                             
                             
               case SDL_QUIT:
            continuer = 0;
            break;
        case SDL_KEYDOWN:

            switch(event.key.keysym.sym)
            {
                case SDLK_LEFT:
                    Mario = IMG_Load("pmd.png");                               
                    positionMario.x--;
                    break;
                case SDLK_RIGHT:
                    Mario = IMG_Load("pmm.png");       
                    positionMario.x++;             
                    break;                 

            }
           
            }
       
    positionGoomba.x--; 

           
           
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format,255,255,255));     
            SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
            SDL_BlitSurface(Mario, NULL, ecran, &positionMario);         
            SDL_BlitSurface(Goomba, NULL, ecran, &positionGoomba);
            SDL_Flip(ecran);
        }

           
        SDL_FreeSurface(imageDeFond);
        SDL_FreeSurface(Mario);
        SDL_FreeSurface(Goomba);
        SDL_Quit();

        return EXIT_SUCCESS;
    }


    • Partager sur Facebook
    • Partager sur Twitter
      5 juillet 2006 à 13:02:06

      Les collisions se gèrent à grands coups de if ! Dsl mais y'a pas plus simple à ma connaisance !

      Ensuite pour le Goomba il faut mettre PollEvent à la place de WaitEvent, ou bien jouer avec les SDL_Delay !
      • Partager sur Facebook
      • Partager sur Twitter
        5 juillet 2006 à 13:09:20

        Ok, j'ai remplacé par PollEvent mais le probleme c'est que maintenant il est trop rapide !

        et pour les collisons, comment faire avec les if ?
        • Partager sur Facebook
        • Partager sur Twitter
          5 juillet 2006 à 13:11:05

          Remplace SDL_WaitEvent() par SDL_PollEvent().

          Pour les collisions, en 2D c'est relativement simple.
          if((positionGoomba.x >= positionMario.x && positionGoomba.x <= (positionMario.x + mario->w))
          ||
          ((positionGoomba.x + goomba->w) >= positionMario.x && (positionGoomba.x + goomba->w) <= (positionMario.x + mario->w)))
              continuer = 0;


          Si je me suis pas trompé ca devrait etre ca et ton jeu devrait se fermer lors de la collision.. :)

          La gestion des collision est une comparaison des X et des Y des plusieurs objets entre eux.
          Tu peut voir içi que je ne gère que les X (mais des deux cotés du Goomba, si on teste que la gauche ca va pas le faire si on l'ataque par la droite !!)

          Pour la vitesse, réfère toi au chapitre sur le temps..

          Tu fais bouger ton Goomba comme ça :
          ////////////////////////////////////////////////////////////////////
          // tempsActuel et tempsPrecedent sont des variable de type Uint32 //
          ////////////////////////////////////////////////////////////////////

          tempsActuel = SDL_GetTicks();
          if (tempsActuel - tempsPrecedent > 50) /
          {
              positionGoomba.x--;           // On boge le Goomba
              tempsPrecedent = tempsActuel; // On remet le temps à 0..
          }
          • Partager sur Facebook
          • Partager sur Twitter
            5 juillet 2006 à 13:16:16

            Ok pour les colisions

            maintenant je voudrais que mon personnage soit plus animé ( deplacements animés ) j'ai testé avec un gif mais ça ne marche pas :(
            • Partager sur Facebook
            • Partager sur Twitter
              5 juillet 2006 à 13:22:03

              Avant de faire un perso qui bouge, fais ton jeu en entier, c'est ca le plus dur et le plus intéréssant.

              Faire un perso qui bouge est vraiment chiant, on ne peut pas gérer des gif animés donc.. voilà :)
              • Partager sur Facebook
              • Partager sur Twitter
                5 juillet 2006 à 13:33:03

                Bon, j'ai un algo de collision optimisé, j'ai eu sa base grace a un certain Fvirtman. Je l'ai faconné de fonction a pouvoir l'utilisé avec des structures (car j'utilise des structures = plus pratique)

                //Algo de collisions
                int collision(Image *a, int nombreDeSpritesX1, int nombreDeSpritesY1, Image *b, int nombreDeSpritesX2, int nombreDeSpritesY2, int reduction)
                {
                if(( b->y + (b->image->h)/nombreDeSpritesY2 -reduction <= a->y) //b est trop haut
                || (b->y >= a->y + (a->image->h)/nombreDeSpritesY2 -reduction ) //b est trop bas
                || ( b->x + (b->image->w)/nombreDeSpritesX2 -reduction <= a->x) //b est trop a gauche
                || (b->x >= a->x + (a->image->w)/nombreDeSpritesX1 -reduction ) //b est trop a droite
                )
                return 0;
                return 1;
                }


                Tu peux tester les collisions avec une partie d'une image (utile lorsque ton image est constitué de plusieurs sprites pour l'animation).

                Je te passe l'algo d'origine, car tu n'utilises pas de structures :

                int Collisions(SDL_Surface *a, SDL_Surface *b)
                {
                if (b->x >= a-> + a->w)
                || (b->x + b-> w <= a->x)
                || (b->y >= a->y + a->h)
                || (b->y + b->h <= a->x)
                }
                return 0;
                return 1;
                }


                Ce test de collision est peu etre bizarre a premiere vue, mais il est plus efficace, si trop a droite, on renvoi 0...
                Apres tu peux meme les ranger dans le meilleure ordre possible.
                • Partager sur Facebook
                • Partager sur Twitter
                  5 juillet 2006 à 13:58:34

                  Ok, pour les collisions mais je voudrais que quand la collision est faite on repart du debut comment faire ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 juillet 2006 à 14:23:12

                    A toi de t'arranger pour faire une boucle avec un booléen ça devrait suffire !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 juillet 2006 à 18:03:26

                      Ok maintenant comment faire un saut, j'ai essayer avec les timers mais ca me donne rien :euh:
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 juillet 2006 à 20:28:26

                        non désolé avec les Get Tricks
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          5 juillet 2006 à 20:53:44

                          Quand tu saute il suffit de mettre un booleen à 1 et tu fait un truc genre:

                          if (sauter)
                          {
                              positionPerso.y--;

                              if ( positionPerso.y == hauteur_max )
                              {
                                  sauter = 0;
                                  descendre = 1;
                              }
                          }
                          if (descendre )
                          {
                            positionPerso.y++;

                              if ( positionPerso.y == hauteur_min )
                              {
                                  descendre = 0;
                              }
                          }


                          Avec le PollEvent ça doit ce faire tout seul normalement.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 juillet 2006 à 21:41:10

                            marrant ton jeu, j'aimerais bien le voir fini :) je pense que les autres t'auront tout dit pour résoudre tes problémes :)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 juillet 2006 à 7:01:19

                              Oui d'ailleurs merci beaucoup pour votre aide ^^

                              Edit : j'ai un petit probleme avec le saut, donc j'ai créer un code le voici :

                              if(positionMario.y == 300)
                              {
                              positionMario.y++;   
                              positionMario.y++;             
                              }


                              Quand on commence le jeu, Mario est la position 368 et là si Mario est a 300 on redescent sauf que là il redescent pas :euh:
                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 juillet 2006 à 12:29:37


                                if(positionMario.y == 300)
                                {
                                positionMario.y++;   
                                positionMario.y++;             
                                }/*hum on pourrais pas faire un positionMarion.y += 2; ?*/

                                Bon après ça résoudra pas ton problème mais bon évitons de nous fatiguer :p !

                                Pour le saut tu peux aussi lui faire suivre la représentation graphique d'une fonction : genre pour un saut x -> -2x^2 correspond pas mal je trouve ! Après le but est de lui faire suivre la RG de cette fonction (mais j'ai jamais testé donc me demande pas de code j'avais juste lu un topic à ce propos !)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  6 juillet 2006 à 14:00:37

                                  Met plus de code stp pour mieux voir
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 juillet 2006 à 14:24:00

                                    Pour le perso animé, c'est vraiment pas dur, tu sépares ton image en 4 frames par exemple, et avec un SDL_Rect que tu déplaces, qui fait la taille d'une frame, tu sélectionne la partie de l'image à afficher pour cette frame, et tu le déplaces toutes les X millisecondes...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 juillet 2006 à 14:36:06

                                      Je sais ce qu'une fonction avec sa RG mais là je comprend pas comment faire avec -2x²

                                      :euh:
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        6 juillet 2006 à 15:10:44

                                        pitit up ^^(serieux j'ai le meme probleme)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          6 juillet 2006 à 15:41:12

                                          euh tu peux envoyer à une fonction :

                                          jumping posJumpMario;
                                          jump (&posJumpMario.y, posJumpMario.x);
                                          /*... ta fonction*/
                                          void (long *y, long x)
                                          {
                                             x = (-9);
                                             *y = (-2)*x*x;
                                             long temp_x = x;

                                             while (x != (-temp_x))
                                             {
                                                *y = (-2)*x*x;
                                                x++;
                                             }
                                          }
                                          /* et la structure jumping*/
                                          typedef struct
                                          {
                                             long x;
                                             long y;
                                          }jumping;


                                          Bon tu réadaptes ça avec tes blit et ton jeu et voilà (tu peux choisir une autre fonction et aussi initialiser x à un autre nombre en fonction de la longueur du saut que tu souaites avoir) !
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            6 juillet 2006 à 16:30:50

                                            Marche pas ton code!!!! :colere2:
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              6 juillet 2006 à 16:37:40

                                              :euh: désolé je suis debutant je comprend pas où il faut placer :(
                                              voici mon code actuel
                                              #include <stdlib.h>
                                              #include <stdio.h>
                                              #include <SDL/SDL.h>
                                              #include <SDL/SDL_image.h>



                                              int main(int argc, char *argv[])
                                              {
                                                  SDL_Surface *ecran = NULL, *imageDeFond = NULL, *Mario = NULL, *Goomba = NULL, *Mariod = NULL;
                                                  SDL_Rect positionFond, positionMario, positionGoomba;
                                                  SDL_Event event;
                                                  int continuer = 1;
                                                  int tempsPrecedent = 0, tempsActuel = 0;
                                                  int sauter = 0;
                                                  int descendre = 0;
                                                  int hauteur_max = 0;   
                                                  int hauteur_min = 0;
                                                 
                                                  positionFond.x = 0;
                                                  positionFond.y = 0;
                                                  positionMario.x = 3;
                                                  positionMario.y = 348;
                                                  positionMario.y > 348;
                                                  positionGoomba.x = 480;
                                                  positionGoomba.y = 360;

                                                  ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                                                  SDL_WM_SetCaption("Super Mario", NULL);

                                                  imageDeFond = SDL_LoadBMP("fond.bmp");

                                                  Mario = IMG_Load("pm.png");
                                                 
                                                  Goomba = IMG_Load("goomba.png");
                                                 



                                               
                                              SDL_EnableKeyRepeat(100, 100);
                                                 
                                              while (continuer)
                                                  {
                                                               
                                               
                                                         
                                                      SDL_PollEvent(&event);
                                                      switch(event.type)
                                                      {
                                                                       
                                              positionGoomba.x--;                         
                                                      case SDL_QUIT:
                                                      continuer = 0;
                                                      break;
                                                  case SDL_KEYDOWN:

                                                      switch(event.key.keysym.sym)
                                                      {
                                                          case SDLK_LEFT:
                                                              Mario = IMG_Load("pmd.png");                               
                                                              positionMario.x--;
                                                              break;
                                                          case SDLK_RIGHT:
                                                              Mario = IMG_Load("pmm.png");       
                                                              positionMario.x++;             
                                                              break;   
                                                          case SDLK_UP:         
                                                          positionMario.y--;

                                                          break;
                                                     
                                                      }             
                                                     
                                                      }
                                              if((positionGoomba.x >= positionMario.x && positionGoomba.x <= (positionMario.x + Mario->w)) || ((positionGoomba.x + Goomba->w) >= positionMario.x && (positionGoomba.x + Goomba->w) <= (positionMario.x + Mario->w)))
                                              Mario = IMG_Load("pmort.png");
                                              if((positionGoomba.x >= positionMario.x && positionGoomba.x <= (positionMario.x + Mario->w)) || ((positionGoomba.x + Goomba->w) >= positionMario.x && (positionGoomba.x + Goomba->w) <= (positionMario.x + Mario->w)))
                                              positionMario.y++;
                                                 

                                              tempsActuel = SDL_GetTicks();
                                              if (tempsActuel - tempsPrecedent > 50)
                                              {
                                                  positionGoomba.x--;           
                                                  tempsPrecedent = tempsActuel;
                                              }     
                                                     
                                                      SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format,255,255,255));     
                                                      SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
                                                      SDL_BlitSurface(Mario, NULL, ecran, &positionMario);         
                                                      SDL_BlitSurface(Goomba, NULL, ecran, &positionGoomba);
                                                      SDL_Flip(ecran);
                                                  }

                                                     
                                                  SDL_FreeSurface(imageDeFond);
                                                  SDL_FreeSurface(Mario);
                                                  SDL_FreeSurface(Goomba);
                                                  SDL_Quit();

                                                  return EXIT_SUCCESS;
                                              }
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Anonyme
                                                6 juillet 2006 à 16:57:48

                                                Sinon pour ton code de tout alleur, fallait faire ça (je pense):


                                                if(positionMario.y >= 300 && positionMario.y < 368)
                                                {
                                                    positionMario.y += 2 ;             
                                                }
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  6 juillet 2006 à 17:05:35

                                                  oui mais le probleme c'est qu'il descent mais ne s'arrete pas :/
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Anonyme
                                                    6 juillet 2006 à 17:09:24

                                                    avec ce code on peut plus sauter
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Anonyme
                                                      6 juillet 2006 à 17:19:35

                                                      essais plutot avec la métode des booleens que je t'ais montré plus haut. c'est plus simple a faire
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        6 juillet 2006 à 17:35:09

                                                        je ne l'ai pas trop compris :/
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Anonyme
                                                          6 juillet 2006 à 17:42:05

                                                          the dead, ta methode a fonctionné merci :p

                                                          bon je me mets au systeme de vies

                                                          moi aussi j'faisais un super mario :p

                                                          mais the dead ta facon quand on saute et on resaute tout de suite on reste bloqué
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Anonyme
                                                            6 juillet 2006 à 17:50:08

                                                            serpen => fait voir ton code.

                                                            Master Linktim => quand tu appuis sur le boutton pour sauter tu met la variable int sauter à 1.
                                                            Apres hauteur_max c'est le nombre de pixel jusqu'ou ira le perso en hauteur.
                                                            Et hauteur_min c'est le sol
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Super Mario, 2 problemes

                                                            × 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