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

Moteurs 3D Discussion :

Collisions avec les murs d'une pièce grâce à GLScène.


Sujet :

Moteurs 3D

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 22
    Points
    22
    Par défaut Collisions avec les murs d'une pièce grâce à GLScène.
    Salut à tous,

    J'ai créé une pièce avec GLScène ; pour les 4 murs qui l'entourent j'ai utilisé des GLPlanes. Alors j'ai réussi à faire que lorsque je me déplace dans la pièce si j'essaye de sortir, une collision est détectée cependant je ne sais pas comment dire : "lorsqu'il y a collision n'avance plus".
    Autrement dit je ne sais pas comment remplir la fonction CollisionManager1Collision pour que je n'avance plus dans la direction du mur.
    Alors est ce que quelqu'un aurait une idée ?
    Merci d'avance de votre aide.

    PS: pour l'instant j'ai mis un message à afficher mais c'est pas génial

  2. #2
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Moi ce que je fais c'est que je sépare mes entrées clavier des attributs du joueurs. En somme quand un utilisateur appuie sur la touche pour avancer, ça ne fait pas direct "z = z + MoveSpeed", à la place ça enregistre le fait que le joueur veuille avancer.
    Pour illustrer mes propos, imagine un tableau de booléens ou les indices représent des "actions".
    action[AVANCER] = FALSE;
    action[RECULER] = FALSE;
    ...
    Et quand l'utilisateur appuie sur la touche avancer tu fais :
    if(keydown(FLECHE_BAS))
    {
    action[AVANCER] = TRUE;
    }

    Puis après dans ta fonction de collision tu regarde si le joueur touche le mur. Si oui tu le replace en dehors du mur et tu met action[AVANCER] = FALSE;

    Après quand tu calcul le déplacement tu regarde ton tableau d'action, si action[AVANCER] == TRUE, ça voudra dire que le joueur veut avancer et que le moteur de ton jeu ne voit aucun inconvénient à ce qu'il avance, donc on peut le faire avancer.
    J'espère que ça aura répondu à ta question

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 22
    Points
    22
    Par défaut
    Merci de ta réponse oxyde356.
    Je vais essayer ce que tu me proposes, ça m'a l'air pas mal comme idée
    Par contre, les booléens "action" que tu places, c'est bien juste un booléen qui a le nom d'une action comme "avancer" ou "reculer", rien de plus ?

    Merci de ton aide.

  4. #4
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Je suis pas sûr d'avoir compris ce que tu as compris ^^
    Tu fais un type énuméré représentant tes actions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    enum
    {
        AVANCER = 0,
        RECULER,
        GAUCHE,
        DROITE,
        TIRER,
        RECHARGER,
        NB_ACTIONS
    };
    Après quand tu initialise les variables de ton joueur tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOOL* tableaudactions= new BOOL[NB_ACTIONS];
    ça te donne un tableau qui pour chaque action te dit si l'utilisateur veut faire une action et si elle est faisable.

    Pour remplir ton tableau, de base t'initialise tout à FALSE, car l'utilisateur ne veut pas faire une action en entrée de jeu en général.
    Puis tu test les entrées clavier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(keydown(touche_entree)==TRUE)
    {
        tableaudactions[RECHARGER] = TRUE;
    }
    if(keydown(touche_espace)==TRUE)
    {
        tableaudactions[TIRER] = TRUE;
    }
    //pareil pour les autres actions
    Puis dans tes tests de collisions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(collision_avant_detecte()==TRUE)
    {
        //que l'utilisateur veuille avancer ou pas il ne peut pas car il y a collision
        tableaudactions[AVANCER]=FALSE;
    }
    //pareil pour les autres types de déplacement
    Les actions c'est AVANCER, RECULER, TIRER ...
    Qui sont des indices du tableaudaction.
    Pour savoir si une action est vrai il suffit de tester si :
    tableaudaction[n'importequelaction] == TRUE

    Vu que j'ai pas trop compris ta question j'ai essayé d'expliciter mes dires, j'espère que ça t'aura aidé

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 22
    Points
    22
    Par défaut
    Sisi c'est bien ce que j'avais pas compris merci.
    Par contre je vois pas bien l'intérêt de créer un tableau de booléens.
    Moi j'ai simplement placé 4 booléens en variables que j'ai initialisé à faux et que je gère suivant les collisions et les touches ; malheureusement cela ne marche pas.

    Je te montre à travers du code (par contre c'est du Delphi, pas du C) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var                                //initialisation  
      Avancer : boolean = false;
      Reculer : boolean = false;
      Gauche : boolean = false;
      Droite : boolean = false;
    Dans ma fonction pour les touches du clavier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if IsKeyDown('z') then
           Avancer := true
       else                
           Avancer := false;
    // de même pour toutes les actions.
    Et pour ma fonction lorsqu'il y a collision :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if IsKeyDown('z') then
          Avancer :=  false;
    // de même pour les autres actions.
    Mais cela ne marche pas, mais c'est bizarre parce que moi cela me parait tout à fait logique comme démarche ; j'ai peut être fait une erreur ou un oubli, c'est pour ça que je poste mon code.
    Sinon pour en revenir au tableau, je pourrais effectivement créer un tableau d'entiers (car les tableaux de booleens n'éxistent pas sous Delphi) en attribuant 0 pour false et 1 pour true par exemple, mais je ne vois pas ce que cela changerait...
    J'ai quand même fait un test avec un tableau d'entier et rien n'y fait, je traverse toujours les murs

    Alors si tu vois quelque chose dans mon code, n'hésite pas.
    Merci de ton aide !

  6. #6
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Variable ou tableau ce n'est pas important, utiliser des variables ça marche, c'est juste plus encombrant.

    Par contre faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if IsKeyDown('z') then
          Avancer :=  false;
    // de même pour les autres actions.
    Ce n'est pas cohérent, en un tu n'a plus a traiter le clavier, les actions permettent de le traiter une bonne fois pour toute après tu dois te débrouiller avec les actions uniquement. En deux je suppose que tu as ton test de collision avant le code que tu me montre ? Dans ce cas tu n'as pas besoin de tester si l'utilisateur veut avancer, parceque dans tous les cas il ne pourra pas vu qu'il y a collision alors met direct Avancer à false.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 22
    Points
    22
    Par défaut
    1) C'est justement ce que je fais, enfin je pense parce que j'avais oublié de mettre une partie du code qui permet de faire l'action et qui ne dépend que du booléen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if Avancer then
       //avancer
    // de même pour le reste
    2) Et sinon, pour les collisions en fait le test est fait automatiquement tout les "x" temps, c'est un fonction de glscène. Et par contre je vois pas pourquoi le code de collision est incohérent vu que cela permet de savoir quelle touche je dois "désactiver" en gros pour ne pas qu'il avance dans une certaine direction mais il peut toujours aller dans les autres directions.
    Mais ce qui est bizarre c'est que même en mettant toutes mes actions à faux, il ne se passe rien ! Cela viendrait de glscene alors ? De la fonction tirée de glscène ? C'est bizarre vu qu'elle fonctionne parfaitement si je lui dis m'afficher un message...

    Merci pour tes réponses rapides oxyde356

  8. #8
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    cela permet de savoir quelle touche je dois "désactiver" en gros pour ne pas qu'il avance dans une certaine direction mais il peut toujours aller dans les autres directions.
    Justement c'est ça que j'essaye de t'expliquer, quand il y a une collision tu ne dois pas "désactiver" une touche car le clavier n'est pas lié au fait qu'il y est une collision. Quand il y a une collision tu dois simplement dire que Avancer = FALSE, c'est tout. Après si même avec toutes tes variables à FALSE ton perso peut toujours se déplacer collision ou pas ça veut dire que ton calcul de déplacement n'est pas lié aux actions mais toujours au clavier logiquement.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 22
    Points
    22
    Par défaut
    Ok ok, je vois ce que tu voulais dire alors.
    Mais alors il faudrait peut être que je place d'autres variables qui correspondent aux différentes collisions comme frontale, de côté... Et dans ce cas là, je n'aurais plus à m'occuper du clavier. C'est la seule différence que je vois entre ton code et le mien. Et du coup cela remplacerait le "if IsKeyDown('z')" du test collision.
    Je vais essayer ça !

  10. #10
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Bah logiquement tu sais déjà d'où vient la collision.
    Si avant tu bloqué IsKeyDown('z') c'est que tu savais que la collision était frontale, donc tu n'a qu'à rendre l'action AVANCER à faux, pareil pour les autres cotés.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 22
    Points
    22
    Par défaut
    La je viens de tester ça pour le test collision :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if Avancer then
          Avancer := false;
    Mais sans succès.

    Et c'est peut être moi qui est du mal, mais j'ai pas trop compris ton dernier post
    Parce que vu que le test collision s'applique pour toutes les collisions quelqu'elles soient, on ne sait pas sur quelle type de collision on est, et on veut donc "bloquer" qu'une seule direction, c'est pour ça que j'ai besoin d'une condition pour savoir quel booléen je passe à faux.
    Ou alors j'ai toujours pas compris tes explications...

  12. #12
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    C'est inutile de tester la valeur de Avancer au moment de la collision, Avancer ne contient a ce moment là que l'info que l'utilisateur veut avancer ou pas, donc enleve la condition et met directement Avancer = faux. Après il faudrai que j'en sache un peu plus sur comment tu teste la collision avec un mur pour pouvoir t'aider.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 22
    Points
    22
    Par défaut
    J'ai enfin réussi. Et tout ça grace à ton aide, merci !
    Je t'explique, j'ai rajouté un autre booléen pour chaque action mais lui correspond à l'action lors d'une collision en fait.
    Ce qui se résume à ça (avec AAvancer initialisé à true) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if Avancer and AAvancer then
    //action pour avancer
    Test collision :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if Avancer then
          AAvancer := false
    Après j'ai rencontré un petit problème, lorsque j'avais une collision frontale par exemple je ne pouvais plus avancer du tout. Alors j'ai rajouté quelques lignes pour que si on appuie sur une autre touche AAvancer repasse à true.
    Voilà, je te remercie pour ton aide précieuse !

  14. #14
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Pas de quoi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/11/2007, 13h33
  2. Problème avec les indexes sur une base de données.
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/02/2006, 09h24
  3. Pb avec les références d'une base de données
    Par Celia1303 dans le forum Access
    Réponses: 8
    Dernier message: 01/12/2005, 15h44
  4. [Débutant] Problème avec les paramètres d'une proc stockée
    Par babulior dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/06/2005, 15h38
  5. [C#] Travailler efficacement avec les panels dans une forme
    Par WwiloO dans le forum Windows Forms
    Réponses: 8
    Dernier message: 27/06/2005, 15h33

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