IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Allegro Discussion :

Gestion des collisions avec Allegro et une matrice


Sujet :

Allegro

  1. #1
    Membre averti Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut 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
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    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 Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    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é Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    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 Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Merci pour ta réponse je n'en attendais plus :p

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

Discussions similaires

  1. [Débutant] Attribuer des noms avec indices pour une matrice ligne par ligne
    Par mylia04 dans le forum MATLAB
    Réponses: 2
    Dernier message: 06/08/2013, 13h45
  2. Réponses: 3
    Dernier message: 06/01/2012, 15h26
  3. gestion des collisions avec sdl
    Par kirtap1969 dans le forum SDL
    Réponses: 3
    Dernier message: 18/10/2007, 21h16
  4. [J2EE/JSP] Gestion des erreurs avec une base SQL server 2005
    Par critok dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 30/04/2006, 16h57
  5. Importer avec Ogre / Gestion des collisions
    Par alex6891 dans le forum Ogre
    Réponses: 9
    Dernier message: 19/02/2006, 17h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo