Partage
  • Partager sur Facebook
  • Partager sur Twitter

Super Mario, 2 problemes

collisions et goomba

Anonyme
    6 juillet 2006 à 18:04:28

    if (sauter)
    {
    positionMario.y--;
    positionMario.y--;
    positionMario.y--;
    positionMario.y--;

    if ( positionMario.y == 300 )
    {
    sauter = 0;
    descendre = 1;
    }
    }
    if (descendre)
    {
    positionMario.y++;
    positionMario.y++;
    positionMario.y++;
    positionMario.y++;
    positionMario.y++;

    if ( positionMario.y == 400 )
    {
    descendre = 0;
    }
    }
    • Partager sur Facebook
    • Partager sur Twitter
      6 juillet 2006 à 18:09:53

      Ok c'est parfait pour moi sauf qu'il y a un petit probleme, quand je saute par dessus le goomba, meme si je suis bien au dessus, quand je suis dessus sa tete c'est comme si je le touchait et je meurt :(
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        6 juillet 2006 à 18:12:20

        Barbare :p


         if (sauter)
        {
        positionMario.y -= 4;

        if ( positionMario.y == 300 )
        {
        sauter = 0;
        descendre = 1;
        }
        }
        if (descendre)
        {
        positionMario.y += 4;


        if ( positionMario.y == 400 )
        {
        descendre = 0;
        }
        }


        Fait voir la partie avec SDL_KEYDOWN

        Master Linktim => normale t'as pas fait la gestion des colisions sur Y. faut faire un truc genre:

        Si positionMario.y >= positionGoomba + Surface_goomba->h* ET positionMario.y <= positionGoomba
        la il meurt
        sinon
        il passe par dessus ou en dessous

        * remplace Surface_goomba par le nom de la SDL_Surface qui a le sprite du goomba
        • Partager sur Facebook
        • Partager sur Twitter
          6 juillet 2006 à 18:17:52

          :o je vais essayer


          edit : non enfaites je comprend rien
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            6 juillet 2006 à 18:26:49

            C'est peut-être encore trop tôt pour toi de faire un mario ;)


            if ( (positionMario.y >= positionGoomba.y + Goomba->h) &&
                 (positionMario.y <= positionGoomba.y) )
            {
                // Edit: met la gestion des collisions sur X ici
            }
            else
            {
                // la tu fais ce qu'il faut faire quand il te touche pas
            }


            Edit: essais de caser les colisions sur l'axe X ici, sinon ça risque de ne pas marcher
            • Partager sur Facebook
            • Partager sur Twitter
              6 juillet 2006 à 18:40:15

              Voila j'ai fait ce que tu m'a dit sauf que j'ai l'impréssion qu'il y a un probleme

              if ((positionMario.y >= positionGoomba.y + Goomba->h) &&(positionMario.y <= positionGoomba.y))
              {
              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++;
              }
              else
              {

              }



              le probleme c'est que maintenant, il n'y a plus de collisions, qu'on entre ou pas dans le Goomba, rien ne se produit :euh:
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                6 juillet 2006 à 18:42:21

                TheDead: laisse pour le probleme de saut ;)


                au fait:
                linktim a la meme reponse que moi
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  6 juillet 2006 à 18:51:36

                  Dj-Serpen => en faite il suffit juste de faire un

                  if (!sauter && !descendre)
                  sauter = 1;

                  Quand tu appuis sur le boutton.

                  ( j'le dit quand même car Master Linktim doit avoir le même probleme :p )

                  sinon, Link=>

                  ça sert a quoi le:

                  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++;
                  }


                  sinon essais


                  if ((positionMario.y >= positionGoomba.y + Goomba->h) &&(positionMario.y <= positionGoomba.y))
                  {
                     //meurt
                  }
                  else 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)))
                  {
                      //meurt
                  }
                  else 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)))
                  {
                      //???
                  }
                  else
                  {
                     // vie
                  }


                  Par contre je suis pas certains donc si ça à l'air de marcher, essais toute les astuces possibles pour mourrir
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 juillet 2006 à 19:01:45

                    Non désolé, ca ne marche pas
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      6 juillet 2006 à 19:14:04

                      Et comme ça:

                      if (
                      ((positionMario.y >= positionGoomba.y + Goomba->h) &&(positionMario.y <= positionGoomba.y))
                      &&
                      ((positionGoomba.x >= positionMario.x && positionGoomba.x <= (positionMario.x + Mario->w)) || ((positionGoomba.x + Goomba->w) >= positionMario.x && (positionGoomba.x + Goomba->w) <= (positionMario.x + Mario->w)))
                      )
                      {
                          //meurt
                      }
                      else
                      {
                          //vit
                      }


                      EDIT2: ok je l'ai remise
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        6 juillet 2006 à 19:15:58

                        marche pas; j'imagine que pour link aussi

                        edit: non ton edit a donné pleins d'erreurs

                        edit2: ca marchait pas ^^
                        mais y'avait aucune erreur
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 juillet 2006 à 19:59:27

                          Ca commences mal vos projets mario...
                          Vous avez les yeux plus gros que le ventre.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            6 juillet 2006 à 20:09:01

                            y'a quelqu'un qui a un code qui marche svp????
                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 juillet 2006 à 9:45:20

                              Vous vous y prennez mal pour les saut. Faire hauteur++ ou -- ce n'est pas un saut! Ca fera un genre de chapeau comme trajectoire





                              //monter
                              if(Temps_mario_saut_variable)
                                 {
                                    if(( carte[(pos_mario.x)/TAILLEBLOC + ((pos_mario.y - Temps_mario_saut_variable )/TAILLEBLOC) * screenx] <=CIEL)                         
                                    &&( carte[(pos_mario.x+loc_mario.w )/TAILLEBLOC   + ((pos_mario.y - Temps_mario_saut_variable )/TAILLEBLOC) * screenx]<=CIEL))                       
                                    {                       
                                        Temps_mario_saut_variable--;
                                        pos_mario.y-=Temps_mario_saut_variable;                     
                                    }
                                       
                                    else
                                    {
                                          while ((carte[(pos_mario.x+loc_mario.w )/TAILLEBLOC + ((pos_mario.y  -1)/TAILLEBLOC) * screenx] <=CIEL)
                                             && (carte[(pos_mario.x)/TAILLEBLOC             + ((pos_mario.y  -1)/TAILLEBLOC) * screenx] <=CIEL) )
                                          pos_mario.y--;
                                         
                                          if(Temps_mario_saut_variable>vit_mario_saut)
                                          Temps_mario_saut_variable=vit_mario_saut;


                              //sauter
                              if (touche_haut)
                               {
                                 if(Temps_mario_saut_variable=0)
                                 {
                                   Temps_mario_saut_variable=HAUTEUR_SAUT;
                                   action_mario=SAUT;
                                 }
                                 else
                                 {
                                   action_mario=STOP;   
                                 }
                                   
                                }


                              //chute
                              if(( carte[(pos_mario.x+loc_mario.w )/TAILLEBLOC  + ((pos_mario.y+loc_mario.h +vit_mario_saut )/TAILLEBLOC ) * screenx] <=CIEL)
                                      &&( carte[(pos_mario.x )/TAILLEBLOC  + ((pos_mario.y+loc_mario.h +vit_mario_saut )/TAILLEBLOC ) * screenx] <=CIEL) )
                                     {
                                          pos_mario.y+=vit_mario_saut;
                                          action_mario=SAUT;
                                     }


                              else while(( carte[(pos_mario.x+loc_mario.w )/TAILLEBLOC + ((pos_mario.y+loc_mario.h +1  )/TAILLEBLOC ) * screenx] <=CIEL)
                                 &&( carte[(pos_mario.x )/TAILLEBLOC  + ((pos_mario.y+loc_mario.h +1 )/TAILLEBLOC ) * screenx] <=CIEL) )
                                   {
                                   pos_mario.y++;
                                   action_mario=SAUT;       
                                   }
                               




                              Jte donnne le programme de mon mario, si ca peux t'aider...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 juillet 2006 à 10:44:13

                                OK pour les sauts, mais pour les collisions X et Y ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  7 juillet 2006 à 18:00:45

                                  Si l'ennemi est plus petit en hauteur que mario et que sa largueur est au maximum 2 x plus petite que mario, alors ce code marche très bien :

                                  //tester axe horizontal
                                  if((((pos_mario.x+mario->w < pos_ennemi.x+ennemi->w)&&(pos_mario.x+mario->w > pos_ennemi.x))
                                  ||((pos_mario.x > pos_ennemi.x)&&(pos_mario.x < pos_ennemi.x+ennemi->w)))
                                  ||((pos_mario.x+mario->w/2> pos_ennemi.x)&&(pos_mario.x+mario->w/2< pos_ennemi.x+ennemi->w)))
                                  //on teste a 3 endroits (3 vertices) au cas ou la taille de l'ennemi serait plus petite que celle de mario


                                  {
                                    //tester axe vertical
                                    if((pos_mario.y+mario->y > pos_ennemi.y+ennemi->y)&&
                                    (pos_mario.y < pos_ennemi.y+ennemi->y))
                                    Mourir(); //si tete de mario dans l'ennemi

                                    else if((pos_mario.y < pos_ennemi.y)&&
                                    (pos_mario.y +mario->y > pos_ennemi.y))
                                    Tuer_ennemi(); //si pieds de mario dans l'ennemi

                                  }


                                  Voila. Avec ca mon mario a moi marche très bien. :p

                                  Voici une ptite capture d'ecran... :DImage utilisateur
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    7 juillet 2006 à 18:20:51

                                    ton code marche pas
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      7 juillet 2006 à 18:23:57

                                      Fo que tu l'adapte! J'ai mis ennemi a la place de goomba et mario->h pour la largeur de l'image de mario. Faut te débrouiller un peu! :)

                                      ^^ [j'ai rajouté du code dans la premiere condition, réessai]

                                      :D [il a l'air bien mon mario?]
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        7 juillet 2006 à 20:17:58

                                        il est EXCELLENT ton mario !!!! ( t'as mis combien de temps à le coder ??? )

                                        le mien c'est plus dans ce style : http://img170.imageshack.us/img170/6394/untitled1copy5bo.jpg

                                        ( en fait c'est juste un petit programme que j'ai voulut faire pour le début quoi, histoire de savoir si je sais faire quelque chose en C ... et c'est franchement que le début, le mario il va à droite à gauche, et il saute ! OURAH !!! :p)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          7 juillet 2006 à 21:07:42

                                          Je suis pas du tout d'accord sur le fait qu'un hauteur++ ca ne fasse pas un saut. Si tu découpe la montée en plusieurs segments ca t'en fais un super. D'ailleurs un saut, ca n'a jamais fait un cercle^^ Et sur smb3 c'est idem, il fait comme tu dis un éspèce de chapeau.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            7 juillet 2006 à 21:32:47

                                            Je bosse sur un ensemble de mini-jeux.
                                            Dans l'un d'eux, je gere le saut.
                                            Selon un chiffre, le personnage en y diminue de moins en moins, puis augmente de plus en plus.

                                            //Premiere phase du saut, la monté
                                            if(saut==1)
                                            {
                                                bonhomme.y-=indiceDeSaut;
                                                if(indiceDeSaut==0)saut=2;
                                                else {indiceDeSaut--;}
                                            }

                                            //Deuxieme phase du saut, la descente
                                            else if(saut==2)
                                            {
                                                bonhomme.y+=indiceDeSaut;
                                                if(indiceDeSaut==maximum)saut=0, maximum=12;
                                                else{indiceDeSaut++;}
                                            }


                                            Dans ce mini-jeu, si on reste appyer sur la touche du haut, maximum s'incremente et indiceDeSaut est egal a maximum.
                                            C'est pour cela que si indiceDeSaut est egal au maximum, c'est qu'on est revenue au sol. Puis on remet le maximum au minimum pour faire un saut.
                                            Dans un mario, le saut est toujours identique.

                                            Il n'y a pas besoin de la variable maximum.

                                            Pour enclencher le saut, il faut que la variable saut soit egal a 0 tell :

                                            Si(saut==0 ET touche[SAUT]enfoncé)saut=1;
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              7 juillet 2006 à 22:15:16

                                              Le saut n'est jamais identique, plus tu appui longtemps sur la touche plus il saute haut. Et tu as aussi la touche vitesse à prendre en compte.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Anonyme
                                                8 juillet 2006 à 0:25:20

                                                Psyko>> c'est un peu le code de linktim ^^

                                                maisplus tellement je suis rendu avec un code hyper genial un jeu ou des goombas defilent en bas de lecran et que des champignons de vie defilent en haut de lecran
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  8 juillet 2006 à 8:49:21

                                                  Psycho : j'ai mis environ un mois pour coder mon mario mais j'en suis fier. Mes potes passent tout leur temps dessus.
                                                  J'aimerais bien le mettre dans un espace de téléchargement pour que les Zéros puissent en profiter mais je sais pas comment faire...
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    8 juillet 2006 à 9:16:16

                                                    Gni -> C'est simple, déja, inscrit toi sur http://www.multimania.lycos.fr/

                                                    Télécharge FileZilla (Matheo a fait un tuto dessus dans la section site web). Tu note tes identifiants Lykos, et tu te connecte au server avec FileZilla. Supprime le fichier index.html. Tu n'as plus qu'a placer tes fichiers sur le ftp !!!

                                                    Pour les télécharger, l'adresse sera http://membres.lycos.fr/LENOMDETONCOMPTE/

                                                    Pour par exemple, c'est : http://membres.lycos.fr/ncortex/
                                                    Je pars en vac, donc je pourrais pas t'aider...
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Anonyme
                                                      8 juillet 2006 à 14:26:38

                                                      Funpic
                                                      100 mo
                                                      SANS PUB!!
                                                      Bande passante Illimitée

                                                      http://funpic.org

                                                      s't'en allemand mais on s'en fiche au moins y'a beaucoup d'anglais surtout dans notre espace admin alors c'est comprehensible ^^
                                                      exemple d'un site (désolé pour la pub): http://serpen.se.funpic.org

                                                      pour l'url, si tu choisis comme pseudo poulpe68 tu auras poulpe68.po.funpic.org

                                                      apres le pseudo y'a toujours les 2 premiers caracteres ^^

                                                      puis, tu peux vendre ce que tu veux
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Anonyme
                                                        8 juillet 2006 à 15:05:31

                                                        Sans pub??
                                                        Ya une jolie pop Up, et une merde qui arrive sur la gauche...
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          8 juillet 2006 à 23:21:16

                                                          Je ne sais pas si ton problème est résolut ou pas mais voilà comment je gère les colisions :
                                                          if((positionP.x+perso->w >= positionM.x)
                                                          && (positionP.x <= positionM.x+mechant->w)
                                                          && (positionP.y+perso->h >= positionM.y)
                                                          && (positionP.y <= positionM.y+mechant->h))
                                                          {
                                                          /* il y a colision */
                                                          }

                                                          Voilà comme ça si le mechant touche le perso (ou l'inverse), on détecte la colision.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            9 juillet 2006 à 12:11:39

                                                            Voila comment je m'y prends personnellement


                                                                    if ((positionGoomba[l].x < positionMariox + 25) && (positionGoomba[l].x + 25 > positionMariox)
                                                                    && (((positionGoomba[l].y + 25) - (positionMarioy + 50)) > 30) && (positionGoomba[l].y < positionMarioy + 70))
                                                                    {
                                                                    if (descendre)
                                                                    {
                                                                    if (kill[l] != 1)
                                                                    {
                                                                    kill[l] = 1; // on définit quel goomba a été tué
                                                                   
                                                                    SDL_BlitSurface(goomba_dead, NULL, ecran, &positionGoomba[l]); // on blit un goomba mort
                                                                    }
                                                                    }
                                                                    }
                                                                    else if ((positionGoomba[l].x < positionMariox + 25) && (positionGoomba[l].x + 25 > positionMariox)
                                                                    && ((positionGoomba[l].y + 25) - (positionMarioy + 60) <= 15) && ((positionGoomba[l].y + 25) > positionMarioy))
                                                                    {
                                                                    if (kill[l] != 1) // on vérifie si le combat avec lequel il y a eu collision n'est pas déjà mort
                                                                    {
                                                                    perdu = l; // dans ce cas, on a perdu
                                                                    SDL_Delay(1000); // un petit delay
                                                                    SDL_Quit(); // on quitte
                                                                    }
                                                                    }


                                                            Y a deux tests, quand le goomba a été tué ou quand à l'inverse c'est mario qui est mort. Et pour tuer le goomba il faut absolument avoir sauté (ou être tombé d'une plateforme).
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              9 juillet 2006 à 14:14:07

                                                              Colision est dans le sujet alors je pose ma question ici :
                                                              Quel est le meilleur moyen de gestionner une collision ?

                                                              J'ai ma réponse, et je veux simplement vous demander si il n'y a pas mieux :

                                                              ma réponse :

                                                              if (haut) // si utilisateur va vers le haut
                                                              {

                                                              position_actuel_x = 3
                                                              position_actuel_y = 8

                                                              (si il monte ca fera y--)

                                                              position_souhaiter_x = 3
                                                              position_souhaiter_y = 7

                                                              envoie de coordonnees à une fonction :

                                                              collision_ou_pas(position_souhaiter_x, position_souhaiter_y, nom_de_la_carte)
                                                              il renvoie un booleen (0 = collision , 1 = tout va bien pas de collision)

                                                              if (booleen)
                                                              {
                                                              position_actuel_x = position_souhaiter_x
                                                              position_actuel_y = position_souhater_y
                                                              }


                                                              Il y a-t-il mieux ?
                                                              • 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