Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de collision(je crois que c'est sa)

    11 novembre 2007 à 19:36:32

    Bonjour les gens!,

    Voilà je programme un jeu en c et je voudrais que mon joueur s'arrete lorsqu'il rencontre un élément de décors.
    Que dois-je utiliser?une condition?

    Pouvez vous m'indiquer ce qu'il faut faire et si possible me donner la condition.

    merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      11 novembre 2007 à 20:22:48

      :) Tu programmes en 2D ? Si oui tu peux faire comme dans le cour a m@teo : Crée un tableau 2D avec la position de chaques éléments, lorsque tu déplace ton persos, regarde si la case qu'il va atteindre est libre ou pas ..

      Un ptit coup de pouce ;)
      1. int Tableau[800][600] = {0}; // Tableau 2D
      2. enum{RIEN,MUR,CAISSE,ENNEMI};
      3. Tableau[250][400] = MUR ; // On met un mur ici
      4. // La tu test les touches (droite / gauche ... )
      5. if (PositionduPerso.x + 1 == MUR)
      6. {
      7.    // La tu gere comme tu veux (il casse le mur, s'arrète etc ...)
      8. }
      • Partager sur Facebook
      • Partager sur Twitter
        11 novembre 2007 à 20:38:09

        oki,merci pour les explication.C'est très clair.
        mais une derniere question,à la ligne 4 je met quoi?c'est sa que j'ai pas compris
        • Partager sur Facebook
        • Partager sur Twitter
          12 novembre 2007 à 11:29:45

          :) Tu test les touches, et pour le faire tu peux tout trouver ici
          • Partager sur Facebook
          • Partager sur Twitter
            12 novembre 2007 à 12:01:26

            hier,j'ai passé 1H30 devant mon code o_O a essayer de gerer la collision....
            J'ai tout essayé et je suis au bord de la crise de nerf....
            Pitié...aidez moi..
            • Partager sur Facebook
            • Partager sur Twitter
              12 novembre 2007 à 13:19:20

              :-° Passe nous tes sources, ou montre nous une partie (pas trop grosse non plus) de ton code pour que l'on puisse t'aider...
              • Partager sur Facebook
              • Partager sur Twitter
                12 novembre 2007 à 15:53:14

                oki..bon tu vas me gronder car je n'ai fait qu'un gros code main.c :euh:
                mais je te montre une grosse partie:
                1. SDL_EnableKeyRepeat(10,10);/*Activation de la répétition des touches*/
                2.  int Tableau[800][600] = {0}; // Tableau 2D
                3.  enum{RIEN,PIN,CAISSE,ENNEMI};
                4.  Tableau[500][260] = PIN ; // On met un pin ici
                5.  Tableau[100][700] = PIN ;
                6.  Tableau[400][350] = PIN ;
                7.  Tableau[340][120] = PIN ;
                8.  Tableau[80][420] = PIN ;
                9.  Tableau[289][387] = PIN ;
                10.  Tableau[390][222] = PIN ;
                11.  while(continuer)
                12. {
                13.  SDL_WaitEvent(&event);
                14.  switch(event.type)
                15.  {
                16.   case SDL_QUIT:
                17.    continuer=0;
                18.    break;
                19.   case SDL_KEYDOWN:
                20.    switch(event.key.keysym.sym)
                21.     {
                22.      case SDLK_UP://Flèche haut
                23.       positionTux.y--;
                24.       break;
                25.      case SDLK_DOWN:
                26.       positionTux.y++;
                27.       break;
                28.      case SDLK_RIGHT:
                29.       positionTux.x++;
                30.       break;
                31.      case SDLK_LEFT:
                32.       positionTux.x--;
                33.       break;
                34.     }
                35.     break;
                36.  }
                37. if (positionTux.x + 1 == PIN)
                38. {
                39. }
                40.  SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));//On efface l'écran

                Donc tu vois j'ai fait comme tu m'as dis.(Le jeu se sera tux qui marche et il faut qu'il y est une collision avec le PIN(sapin) pour faire plus réaliste.
                • Partager sur Facebook
                • Partager sur Twitter
                  12 novembre 2007 à 17:50:09

                  une petite fonction avec l'algorithme du bounding box :

                  Secret (cliquez pour afficher)
                  1. int BoundingBox(SDL_Rect* a,SDL_Rect* b)
                  2. {
                  3.     if ((a->x >= b->x + b->w)            
                  4.             || (a->x + a->w <= b->x)
                  5.             || (a->y >= b->y + b->h)
                  6.             || (a->y + a->h <= b->y))
                  7.     {
                  8.         return 0;
                  9.     }
                  10.     return 1;
                  11. }


                  Si ça touche la fonction renvoie l'entier 1 sinon l'entier 0.

                  Aussi c'est très mauvais que tous soit dans ta fonction main, essaie d'avoir un main de moins de 50 lignes et d'utiliser au maximum la programmation modulaire.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 novembre 2007 à 19:27:53

                    merci d'avoir répondu mais peux tu etre plus explicite stp?merci bcp!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 novembre 2007 à 19:33:14

                      A propos de quoi? Programmation modulaire ? Si oui c'est le fait de regrouper en plus fichier .c l'ensemble de ton code.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 novembre 2007 à 19:38:10

                        Heu j'ai été très explicite ...

                        tu crée 2 SDL_Rect comme ceci

                        1. SDL_Rect* paul;
                        2. SDL_Rect* jacque;


                        tu initialise les valeurs x,y,w,h :

                        1. paul->x = /* tu initialises x y w et h pour paul et pour jacque */


                        Ensuite tu fais appelle a la fonction que je t'ai donné en mettant comme paramètre paul et jacque :

                        1. maVariable = BoundingBox(paul,jacque);
                        2. if (maVariable)
                        3. {
                        4.     /* Collisions, ici tu met ton code */
                        5. }
                        6. else
                        7. {
                        8.     /* pas de collisions, donc rien de speciale */
                        9. }



                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 novembre 2007 à 23:16:51

                          oki,donc ce code je le met avant les touches SDLKUP,SDLK LEFT... :)
                          Merci beaucoup de m'avoir m'aider!!! ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 novembre 2007 à 12:22:22

                            Erreur:j'y arrive pas sa ne fonctionne pas... :(:(
                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 novembre 2007 à 12:24:36

                              Tu arrives pas a faire quoi ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 novembre 2007 à 12:50:25

                                hé bien,j'ai fait comme tu m'as dit sauf que sa ne marche pas...avec le boundingbox
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 novembre 2007 à 12:58:48

                                  Hum, disons que c'est assez dur pour moi de deviner ton problème / erreur de compilation donc argumente un peu, tu as essayer de faire quoi, sinon la fonction de BoundingBox marche parfaitement, je l'utilise dans la plupart de mes jeux pour les collisions, de + cette fonction m'a été donner par un ingénieur ... Donc tu peux y aller tranquille elle marche :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 novembre 2007 à 13:16:13

                                    en fait je code je compile et sa me met une erreur car je n'annonce pas le BB et puis je ne sais ou le placer/...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      14 novembre 2007 à 13:19:24

                                      Tu as écrit le prototype ? ou alors mais la fonction BoundingBox avant son appel enfin c'est logique quoi ...
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 novembre 2007 à 13:42:07

                                        oui mais je fais comment?
                                        concretement comment je fais appel a bounding box car il me dit que c'est pas une fonction.

                                        Je suis vraiment débutant et je sais que tu as été comme moi jadis(non moi c'est numérobis)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          14 novembre 2007 à 13:46:45

                                          :-° Va faire un tour dans le tuto de M@teo ... regarde comment bien déclarer une fonction etc ... et regarde aussi le TP de la SDL (le sokoban) il explique des choses qui risquerait fortement de t'intéresser...
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 novembre 2007 à 13:54:44

                                            bien...je vais faire un tit tour et je reviens...ou pas :p
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              14 novembre 2007 à 13:56:40

                                              C'est dur quand on débute hein?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                14 novembre 2007 à 15:14:50

                                                N'essaie pas d'aller plus vite que la musique sinon ---> crash :'(
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  14 novembre 2007 à 15:22:21

                                                  j'ai une condition sa s'arrete o sapin voulu mais ensuite je ne peux pas aller derriere ce sapin pourquoi?:

                                                  1. if(positionTux.x ==positionPin.x)
                                                  2. {positionTux.x--;}
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    14 novembre 2007 à 15:43:13

                                                    Citation : Pas de titre

                                                    Voilà je programme un jeu en c et je voudrais que mon joueur s'arrete lorsqu'il rencontre un élément de décors.
                                                    Que dois-je utiliser?une condition?



                                                    C'est bien ce que tu voulais non ? Sinon je pense deviner, tu veux que quand le tux touche le sapin, il passe derière le sapin sans l'écraser ? Si oui réfléchie 2 secondes.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      14 novembre 2007 à 15:46:40

                                                      non ce n'est pas ce que je voulais faire mais c'est une très bonne idée!!!!!
                                                      peux tu me donner un indice ou m'expliquer la démarche?stp

                                                      edit: par "derrierre" j'entendais de l'autre coté!
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        14 novembre 2007 à 15:54:46

                                                        Je te donne l'algo alors :

                                                        position du tux (x) + width est égal a position (x) du sapin

                                                        ALORS

                                                        position x du tux EGAL position x du sapin + width
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          14 novembre 2007 à 15:57:56

                                                          il ne reconnait pas w...
                                                          que faire?
                                                          (je suis sou linux)=>il me met witdh undeclared(first in this function)
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            14 novembre 2007 à 15:59:36

                                                            Citation : General-Antivirus

                                                            il ne reconnait pas w...
                                                            que faire?



                                                            Il ne reconnait pas quoi ? tu peut etre plus précis ? je te rapelle que pour que sa fonctionne tu dois initialiser x-y-h et w de ton objet SDL_Rect ...
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              14 novembre 2007 à 16:04:38

                                                              oui mais comment initialiser h et w?? par ce que j'ai déja fait x et y mais les 2 autres je ne sais pas comment on fait
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Problème de collision(je crois que c'est sa)

                                                              × 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