Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gestion des collision

gére un coté a la fois ?

    8 juillet 2010 à 21:16:27

    Bonjours, :D
    Je fais actuellement un petit jeu de voiture en 2D et en ce moment je met en place ma gestion des collisions mais j'ai un problème.
    j'ai bien sure suivis le tuto "Théorie des collisions > Collisions en 2D" de Fvirtman la technique donné fonctionne bien il ya rien a dire, Seulement je n'arrive pas a l'utiliser comme il faut j'explique:

    ce que je veux faire c'est arreter ma voiture lorsque celle ci touche un obstacle,
    je crée alors 2 Bounding Box une pour l'obstacle et l'autre pour la voiture.
    ce qui me pose problème c'est que quant la voiture touche l'obstacle elle s'arrête bien, mais après y a plus aucun moyen de reculer ou de tourner elle est complètement bloquer.
    Pour remédier a sa j'ai séparer les booléen qui confirme la collision (j'en ai fait 4 un pour chaque directions) mais je n'arrive pas a séparer la détection de collision correctement.

    Conclusion: Ce que je veux faire en faite c'est détecter la collision de chaque coté (seul) pour pouvoir bloque que cette direction là (grasse a un booléen colisionDroite,...) comme ça il y aura possibilité de faire marche arrière ou de tourner.

    Voici un extrait de mon code :
    // Le Test de contact
    if (((box1.x + box1.w)== box2.x)
    && (box1.y  == box2.y)
    && (box1.y + box1.h) == (box2.y +box2.h))
    { colisionDroite = 1; }
    
    else
    { colisionDroite = 0; }
    
    
    
    
    
     SDL_WaitEvent (&evenement);
    
                   switch (evenement.type)
                   {
                       case SDL_QUIT:
                       continuer = 0;
                       break;
    
    
                       case SDL_KEYDOWN:
    
    // Switch de recuperation de Touche au clavier
    
                       switch (evenement.key.keysym.sym)
                       {
                           case SDLK_RIGHT:
    if (colisionDroite)
    { break; }
    
                           position.x++;
                           box1.x++;
    
                           break;
    


    Merci d'Avance :D
    • Partager sur Facebook
    • Partager sur Twitter
      9 juillet 2010 à 1:18:57

      Salut,

      Lorsque j'ai fait un début de mario like, j'ai procédé comme cela :

      - Une fonction TestCollision() qui remplis un tableau tab_cool qui peut contenir les valeurs TOP, BOTTOM, RIGHT et LEFT.
      - Une fonction CheckColltab() qui prend en paramètre la direction que l'on veut tester. Renvoie 1 si il y a une collision dans cette direction, 0 sinon.

      Je sais pas si j'ai bien été clair.
      • Partager sur Facebook
      • Partager sur Twitter
        9 juillet 2010 à 1:34:41

        tu peux utiliser un SDL_Rect test, qui prend comme valeur de x et y ceux de pos_voiture, puis tu ajoute respectivement vx et vy, et tu l'envoie vers la fonction de collision. Cette dernière devra vérifié les bords et dire si il y a collision ou pas en utilisant une valeur de retour (ex : 1 si y a collision et 0 si y en a pas ) puis tu vérifie cette valeur de retour, si 0 dans ce cas tu fais pos_voiture = test, et comme ça ton problème est réglé ^^
        P.S: j'espère que c'est clair :lol: , sinon je suis toujours là ^^
        • Partager sur Facebook
        • Partager sur Twitter
          9 juillet 2010 à 4:08:45

          utilise le rectangle de collision pour reculer l'objet de X pixels. (comme dit dans le tuto du tile mapping)
          • Partager sur Facebook
          • Partager sur Twitter
            9 juillet 2010 à 13:29:34

            Ok re-bonjour tout le monde :) ,
            Ton idée de tableau m'intéresse BrightStyle c'est exactement ce qu'il me vallait (Tester chaque coté et envoyer si collision ou pas pour ce coté ci seulement), mais je n'arrive pas a la mettre en place est ce que tu peu poster un extrait de code utilisant ta méthode, Merci :D .

            Si quelqu'un d'autre vois comment faire merci de me renseigner.


            • Partager sur Facebook
            • Partager sur Twitter
              9 juillet 2010 à 14:30:02

              Comme te disait minirop dans son lien, il y a une technique pour ne pas se retrouver bloqué dans un bloc.
              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de codes en C et C++ http://fvirtman.free.fr/recueil/index.html

                9 juillet 2010 à 15:15:32

                Voilà ce que j'ai fait pour : (c'est en C++ mais tu devrais comprendre)

                for(int i = tiles.Left; i <= tiles.Right; i++)
                    {
                        for(int j = tiles.Top; j <= tiles.Bottom; j++)
                        {
                            if(map.GetTile(i,j).GetType() == 0)
                            {
                                if(j = tiles.Bottom) // Si il y a une collision sur le bas 
                                    coll_direction.push_back(BOTTOM); // On ajoute une case qui prend pour valeur BOTTOM au tableau
                                 // etc. pour les autres directions
                            }
                        }
                    }
                


                La fonction ChecktabColl est très simple, tu parcours ton tableau et tu vérifie si la direction passée en paramètre est dedans.

                Par contre, je ne suis pas sur que ça soit la meilleur solution.
                • Partager sur Facebook
                • Partager sur Twitter
                  9 juillet 2010 à 15:22:08

                  Citation : Homer.S


                  Ton idée de tableau m'intéresse BrightStyle c'est exactement ce qu'il me vallait (Tester chaque coté et envoyer si collision ou pas pour ce coté ci seulement), mais je n'arrive pas a la mettre en place est ce que tu peu poster un extrait de code utilisant ta méthode, Merci :D .


                  C'est un technique que je ne connaissait et je suis tombé sur un article de game network creator, ou le rédacteur utilisait cette technique dans... un casse brique o_O .

                  Une brique -> quatre bouding box, un par coté.
                  J'ai été surpris, mais je vois que ce genre d'absurdité à la vie longue...

                  Le tuto de fvirman va plus loin que le simple jeu de plateforme, je ne vois pas en quoi, une collision sur un circuit peu être différente o_O .
                  Après tout dépend de la représentation du circuit, j'ai l'impression que sur les très vieux jeux, c'est une collision par couleur(route grise, bord blanc ou rouge, herbe verte...)

                  Le principe est un peu le même, tu ne pouvais pas franchir la bande de démarcation, tu replaçes ton véhicule à un pixel(par exemple), du bord heurté à chaque collision, et là, le joueur pourra faire demi tour, changer de direction.
                  D'ailleurs, tu n'as peut-être(surement) pas connu, mais j'ai souvenir de jeux de courses, ou c'était une galère indescriptible pour repartir après avoir heurter un obstacle(grand prix sur vcs 2600 :p )
                  On rencontre toujours les mêmes problèmes bien longtemps après. :D

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Zeste de Savoir, le site qui en a dans le citron !
                    9 juillet 2010 à 15:29:44

                    Citation : GurneyH

                    Citation : Homer.S


                    Ton idée de tableau m'intéresse BrightStyle c'est exactement ce qu'il me vallait (Tester chaque coté et envoyer si collision ou pas pour ce coté ci seulement), mais je n'arrive pas a la mettre en place est ce que tu peu poster un extrait de code utilisant ta méthode, Merci :D .


                    C'est un technique que je ne connaissait et je suis tombé sur un article de game network creator, ou le rédacteur utilisait cette technique dans... un casse brique o_O .

                    Une brique -> quatre bouding box, un par coté.
                    J'ai été surpris, mais je vois que ce genre d'absurdité à la vie longue...

                    Le tuto de fvirman va plus loin que le simple jeu de plateforme, je ne vois pas en quoi, une collision sur un circuit peu être différente o_O .
                    Après tout dépend de la représentation du circuit, j'ai l'impression que sur les très vieux jeux, c'est une collision par couleur(route grise, bord blanc ou rouge, herbe verte...)



                    Le problème c'est que dans un jeu de plate-forme, il fallait que je trouve un moyen de pouvoir faire en sorte que si le joueur n'est pas sur une plateforme (si il n'y a pas de collisions au niveau du bas du sprites), je le fait tomber. Si il y a une autre façon de faire, je suis preneur.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 juillet 2010 à 15:36:20

                      Avec mon aglo de collision, toutes les frames tu essaie de le pousser vers le bas (gravité), et tu testes les collisions. S'il n'a pas bougé vers le bas, c'est qu'il est sur une plateforme. Sinon il tombe.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Recueil de codes en C et C++ http://fvirtman.free.fr/recueil/index.html

                        9 juillet 2010 à 15:40:38

                        Citation : BrightStyle


                        Le problème c'est que dans un jeu de plate-forme, il fallait que je trouve un moyen de pouvoir faire en sorte que si le joueur n'est pas sur une plateforme (si il n'y a pas de collisions au niveau du bas du sprites), je le fait tomber. Si il y a une autre façon de faire, je suis preneur.



                        Je n'ai plus en tête le tuto de fvirtman, mais le problème est assez simple.
                        Tu connais(forcément) la coordonnée y basse de ton perso(dans le cas d'un repère inversé comme là SDL, c'est (perso.y + perso.h).
                        Tu testes les collisions avec les tiles alentours. En cas de collision, il est facile de connaitre le point haut de la tile.
                        De là, facile de savoir si le perso chute ou pas, non?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Zeste de Savoir, le site qui en a dans le citron !
                          9 juillet 2010 à 15:54:52

                          OK merci BrightStyle pour ton extrait de code mais je n'utilise pas de tableau 2D pour ma map ^^ .

                          Salut Gurney merci pour l'astuce des 4 bouding box je pense opter pour cette solution.
                          _Oui c'est sur que le tuto de Fvirtman vas plus loin, le fait est que je suis un débutant en C (j'ai apris le C d'aprés le tuto de m@teo21) j'ai peut être raté quelque chose dans celui de Fvirtman. :(

                          Si non la colision par couleur m'interrese je vais faire une recherche la dessu.

                          Merci pour votre Aide :) .
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 juillet 2010 à 15:57:59

                            Citation : Homer.S


                            Salut Gurney merci pour l'astuce des 4 bouding box je pense opter pour cette solution.


                            Surtout pas. :( Mon post allait surout à l'inverse, mais en relisant, j'ai surement mal compris ce qu'expliquait BrightStyle.

                            Relis bien, et regarde le tuto de fvirtman, le problème est bien posé(et résolu). ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Zeste de Savoir, le site qui en a dans le citron !
                              9 juillet 2010 à 16:42:40

                              Ok Merci je me remet de suite sur le tuto de fvirtman.

                              EDIT:

                              Bon j'ai relu toute la partie 2D du tuto sur la gestion des collision (Fvirtman), et je ne trouve toujours pas la solution (il faut dire je ne comprend pas vraiment les partie mathématique).

                              Voici une image de mon circuit:

                              Morceau de Circuit1

                              Comment est ce que vous gérer les collision sur ce type de Map ?
                              (la map n'est pas contenu dans un tableau)

                              GurneyH tu dis que le problème est poser puis résolus est ce que tu m'aide parceque moi je ne vois pas o_O . Merci




                              • Partager sur Facebook
                              • Partager sur Twitter
                                10 juillet 2010 à 19:01:51

                                Salut tout le monde me revoilà encore sur ma gestion des collision cette fois ci j'ai du nouveau j'ai entendu parler d'une autre manière de gérer les collision "La collision par masque" (une images cacher qui gère les collision avec les couleur des pixels)

                                Est ce quelqu'un vois comment mettre ça en place avec du c ?

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  10 juillet 2010 à 19:34:25

                                  Salut, :)

                                  Il me semble que tu parles de la méthode du "pixel perfect", n'est-ce pas ? Voici un tutoriel.

                                  Par contre, je ne sais pas si c'est vraiment optimisé pour ce genre de jeux car ça me semble terriblement lourd. Je laisse les autres plus expérimentés répondre sur ce point.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    10 juillet 2010 à 19:44:34

                                    Oui c'est ça le pixel perfect.
                                    Merci pour le tuto je vais me pencher dessus matenant.

                                    _C'est vraie que ça me semble beaucoup trop lourd, il aurai fallut que ma map soit contenu dans un tableau.
                                    je pense utiliser des JPG et non de BMP pour ma map cacher en espérant que se sera plus facile a digérer.

                                    Edit:
                                    Finalement sa ne donne rien le tuto est trop technique et je ne comprend pas le code.

                                    Mais voila un exemple que j'ai trouver dans un PDF sur la programmation.

                                    Exemple de gestion de colision
                                    Extait: Utilisation d’une image logique L’image logique est l’image du circuit simplifiée avec que quelques couleurs où chaque couleur de pixel a une signification précise et correspond a une propriété précise du circuit. Par exemple le blanc ralentit la voiture, le rouge l’arrête. On utilise pour cela la fonction obtenirPixel décrite dans util.c. On compare alors à chaque instant de jeu la couleur du pixel où se situe la voiture avec les couleurs d’environnements spéciaux (obstacles, ralentissements).
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      10 juillet 2010 à 21:43:27

                                      Il faut lire les post! ;)

                                      Citation : GurneyH


                                      Après tout dépend de la représentation du circuit, j'ai l'impression que sur les très vieux jeux, c'est une collision par couleur(route grise, bord blanc ou rouge, herbe verte...)

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Zeste de Savoir, le site qui en a dans le citron !
                                        10 juillet 2010 à 22:19:02

                                        Oui GurneyH, j'ai bien lus ton post d'ailleurs j'ai répondu a ta suggestion par une petite phrase a la fin du post ou je voulais utiliser 4 Bounding-Box.

                                        Citation : Homer.S

                                        Si non la colision par couleur m'interrese je vais faire une recherche la dessu.


                                        :)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          10 juillet 2010 à 22:23:26

                                          Citation : Homer.S

                                          je pense utiliser des JPG et non de BMP pour ma map cacher en espérant que se sera plus facile a digérer.



                                          Très très mauvaise idée.
                                          Et il te suffit de regarder l'image que tu as proposé :
                                          Ton rouge n'est pas uni, ton vert non plus (et ton blanc non plus)

                                          Si tu veux des couleurs unies, pour faire une collision de détection sur les pixels, n'utilise pas de JPG. Mais des BMP ou des PNG.

                                          Le JPG, c'est fait pour les photos, pas pour les dessins, c'est un format de compression destructeur.
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Recueil de codes en C et C++ http://fvirtman.free.fr/recueil/index.html

                                            10 juillet 2010 à 22:25:37

                                            la collision par masques est une des solutions dans ton cas..

                                            ça revient effectivement à faire du pixel perfect.

                                            Sinon, une autre solution est de diminuer la taille de tes tiles et d'accepter une marge d'erreur.

                                            Ou, pour chaque tile, tu peux, en plus stocker une bouding box de collision -> un rectangle qui englobe les parties en collisions au plus près.

                                            Encore un autre solution, tu peux définir tes tiles par une fonction mathématique.

                                            regarde le tuto de fvirtman sur les collisions, et fait une recherche google gamedev.

                                            Ce sujet est traité de nombreuses fois. ;)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Zeste de Savoir, le site qui en a dans le citron !
                                              10 juillet 2010 à 22:28:16

                                              Pour les jeux de voiture de ce genre, ce qui pouvait être fait, c'est restreindre la voiture a un seul pixel, et la map de couleur dessinait une route légèrement plus étroite, de façon a ce que si le pixel (qui sera le centre du véhicule) touche la map de route étroite, le dessin de la voiture entière lui ira toucher le bord de la route affichée.
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Recueil de codes en C et C++ http://fvirtman.free.fr/recueil/index.html

                                                10 juillet 2010 à 22:32:51

                                                Citation : Fvirtman

                                                Pour les jeux de voiture de ce genre, ce qui pouvait être fait, c'est restreindre la voiture a un seul pixel, et la map de couleur dessinait une route légèrement plus étroite, de façon a ce que si le pixel (qui sera le centre du véhicule) touche la map de route étroite, le dessin de la voiture entière lui ira toucher le bord de la route affichée.


                                                J'adore! :D
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Zeste de Savoir, le site qui en a dans le citron !
                                                  10 juillet 2010 à 22:37:47

                                                  Avez vous une idée de comment mettre cette gestion en place.(le code C)

                                                  J'ai aucune idée de comment savoirs et comparer la couleur de 2px.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 juillet 2010 à 22:46:48

                                                    Citation : Homer.S

                                                    Avez vous une idée de comment mettre cette gestion en place.(le code C)

                                                    J'ai aucune idée de comment savoirs et comparer la couleur de 2px.


                                                    Ah on y arrive. ;)

                                                    Encore une fois plusieurs solutions.

                                                    Tu oublies les masques, et tu regardes dans la doc sdl, tu devrais trouver une fonction getpixel.

                                                    Autre solution, tu utilises des masques, et là en général, 0 bon, différent de 0 pas bien.
                                                    Ca permet de stocker ton masque avec un pixel codé sur un bit(0 ou 1).
                                                    Pas sur qu'aujourd'hui on utilise ça.

                                                    Le truc, il faut que tu projette ta voiture à sa prochaine destination.
                                                    Si à l'emplacement de la voiture tu rencontre un pixel non neutre il y a collision, et encore une fois le tuto de fvirtman t'aidera à remettre la voiture su la route.

                                                    Commence par voir du cote de getpixel.
                                                    J'ai d'autres techniques en tête, mais ç'est un peu overkill :p
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Zeste de Savoir, le site qui en a dans le citron !
                                                      23 juillet 2010 à 9:48:06

                                                      Hello !

                                                      J'ai parlé des collisions pour un jeu de voiture dans mon tuto sur les collisions.
                                                      Regardez ma signature pour aller au tuto sur les collisions, chapitre 1 . Collisions spécifiques.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Recueil de codes en C et C++ http://fvirtman.free.fr/recueil/index.html

                                                      Gestion des collision

                                                      × 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