Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre averti
    Gestion des collisions avec Allegro et une matrice
    Bonjour

    Je suis en ce moment sur la création d'un genre de shoot them up sans le shoot.

    ftp://lacaverneduyeti.no-ip.org/files/spacescape

    Mais j'ai un problème lors des collisions.

    Le truc serait que lorsque le vaisseau entre en contact avec un astéroïde, le vaisseau explose. Mais au lieu de ça, j'ai quelque chose de plus aléatoire.

    Ainsi, ma map est stocké dans une matrice à deux dimensions. Chaque "case" de cette matrice correspond à un carré de 64*64px. Un astéroide est placé sur une case de la matrice.

    Voici ma condition pour que la collision vaisseau/astéroïde ai lieu :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //On teste les collisions
             if(Matrice[joueur.GetPosC()/BLOC][joueur.GetPosL()/BLOC] == 'a'
                || Matrice[joueur.GetPosC()/BLOC][joueur.GetPosL()/BLOC] == 'b'
                || Matrice[joueur.GetPosC()/BLOC][joueur.GetPosL()/BLOC] == 'c'
                || Matrice[joueur.GetPosC()/BLOC][joueur.GetPosL()/BLOC] == 'd'
                || Matrice[joueur.GetPosC()/BLOC][joueur.GetPosL()/BLOC] == 'e') {
                     //Instruction
             }


    Mais au fait, cela revient à dire que si le point de coordonnées du vaisseau (0,0) se trouve sur une case de la matrice contenant un astéroïde, alors le vaisseau fais boum.

    Or je voudrais que si l'image du vaisseau est en contact avec l'image d'un astéroïde, alors le vaisseau fais boum :p

    Je ne voit pas comment faire ça ? Merci

    (si vous avez besoin de plus de renseignement...)

  2. #2
    Expert éminent
    Salut,

    Je ne sais pas si Allegro les gère mais je te conseil de regarder au niveau des "bounding box" qui te permette de faire des tests rapide de collision.
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  3. #3
    Membre averti
    Je ne crois pas que Allegro gère cela, enfin je sait pas, après, il suffit de les implémenter

    Par contre, j'ai aussi pensé au fait que mes astéroïdes ne sont pas des "entitées" comme le vaisseau, je pense que je vais devoir m'initier un peu plus dans la POO, ça serait un bon point, de réécrire le code entièrement, parce que je n'ai au fait qu'une classe pour mon vaisseau, et elle ne sert à rien, en fin de compte (une structure et une fonction auraient suffit :p).

    Enfin j'attends un avis d'un expert Allegro

  4. #4
    Membre confirmé
    Malheureusement je ne pense pas que Allegro puisse grand chose pour ton problème à moins d'utiliser une certaine technique (cf un peu plus bas...)

    Le problème est , si j'ai bien compris, que tu testes la case située 'sous' le vaisseau, alors qu'il faudrait aussi tester les cases adjacentes...

    A propos de la méthode utilisée, le problème est que tu obliges tes astéroïdes à être forcément dans une case de cette grille, donc ce n'est pas très fluide.

    Pour la technique que j'évoquais, et pour avoir une détection de collision tip-top tu peux coller l'image des astéroïdes dans une bitmap (de la mêm taille que l'écran) dont le fond est d'une couleur unique (que l'on en peut pas retrouver dans les astéroïdes ou les vaisseaux...) du style Bright Pink (R255, G0, B255), trouver les coordonnées du coin haut-gauche de la bitmap contenant le vaisseau (probablement de fond Bright Pink pour la transparence) sur l'écran, et faire une boucle qui test à chaque pixel de cette bitmap :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      Pour Chaque Pixel de (coordonnées)
             Si Couleur != Bright Pink //le vaisseau n'est pas sur ce pixel : pas de collision possible
                   trouver Pixel (coordonnées)+(coordonnées coin haut-gauche) sur le rendu des astéroïdes
                   Si Couleur(de ce pixel) != Bright Pink //il y a autre chose sur ce pixel : collision
                         collision
                   Sinon
                         // Rien?
                   FinSi
              FinSi
       FinPour


    Mais cette solution peut vite devenir TRES couteuse!

    Si non, avant de te lancer dans les bounding box, un test de distance pourrait te suffire (si les astéroïdes et les vaisseaux sont à peu près ronds). Il suffit de calculer la distance vaisseau-astéroïde et de la comparer avec (Rv+Ra) où : Rv est le rayon de la sphère englobant le vaisseau et Ra celui de l'astéroïde (et ce pour chaque astéroïde...)...Si inférieur : il y a collision!

  5. #5
    Membre averti
    Merci pour ta réponse je n'en attendais plus :p

    C'est pas con ton truc de rayon, je vais m'y coller