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

Windows Presentation Foundation Discussion :

[Jeux] Gestion des collisions et des déplacements


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Avatar de Psycadi
    Homme Profil pro
    Chef de projet - Expert en message box
    Inscrit en
    Juillet 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet - Expert en message box

    Informations forums :
    Inscription : Juillet 2003
    Messages : 147
    Points : 364
    Points
    364
    Par défaut [Jeux] Gestion des collisions et des déplacements
    Bonjour,

    J'avance doucement sur mon petit jeu et j'en suis à la collision entre le héro, les méchants, les missiles du héro et les missiles des méchants.

    Mais j'ai un petit problème avec la détection des collisions. J'ai fait une interface (IAndroid) pour les robots (héro et méchants) et une pour les missiles.

    Voici ma gameloop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    GetMouseInput(); // Récupère les cliques de la souris
    GetKeyboardInput(); // Récupère les flèches appuyées du clavier pour le déplacement
     
    foreach (Mechant grr in Mechants)
    {
        if (DetectCollision(Hero, grr))
        {
            this.Title = "TOUCHE";
        }
        else
            this.Title = "";
     
        grr.Update(this, Hero); // Déplacement et rotation du méchant
    }
     
    Hero.Update(gameSurface, PressedKeys); // Déplacement et rotation du héro
    Pour le moment, les méchants ne se déplacent pas, ils ne font que suivre le héro du regard.

    Dans mon interface IAndroid, j'ai déclaré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rect CollisionZone { get; }
    et dans les classes j'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Rect CollisionZone
    {
        get
        {
            return new Rect(Canvas.GetLeft(this), Canvas.GetTop(this), 20, 20); ;
        }
    }
    Comme ça, j'ai dans ma List<Mechant> Mechants la possibilité d'accéder à la position de la zone de collision. \o/

    Maintenant, voici ma fonction de détection des collisions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public bool DetectCollision(IAndroid controlOne, IAndroid controlTwo)
    {
        Rect rectCol = controlOne.CollisionZone;
        rectCol.Intersect(controlTwo.CollisionZone);
        return !(rectCol == Rect.Empty);
    }
    Avec ça, j'arrive à savoir si mon Héro est sur un méchant mais ce que je voudrais faire c'est qu'il ne puisse pas les toucher. Comme si c'était un mur.

    Je me suis dit, je vais créer une fonction CancelMove et si DetectCollision retourne true, J'annule mon mouvement mais j'ai pas du faire comme il le fallait car le rendu est super crade. Quand je m'approche d'un obstable, le héro tremble, passe au travers, ne bouge plus du tout....

    J'ai vu des tuto sur la collision mais ils font tous la même chose. (Détection puis boom explosion de l'élément). Moi, je voudrais plutôt un truc du genre "non tu peux pas aller là".

    Surtout que je dois l'appliquer ensuite aux méchants entre eux.

    Si quelqu'un a une idée, je suis preneur.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 204
    Points : 12 370
    Points
    12 370
    Par défaut
    Vous raisonnez sur des états et pas sur des trajectoires. Cela rend votre algorithme instable.

    Exemple : Le joueur passe de la position X à la position X+Y mais entre X et X+Y, il y un obstacle mais les positions X et X+Y peuvent être "collision free"

    --------<--(X)-->---------<+++O+++>----------------<---(X+Y)

    Pour détecter ce type de problème, il faut plutôt résonner sur des trajectoires plutôt que sur des positions.
    On peut même raffiner sur les zones de collision dures et les zones de collisions molles.

    Si vous voulez garder le même algorithme, il faudra réduire le pas de déplacement ou augmenter la taille des zones de collisions pour le rendre stable.

    Pensez à calculer le point de rencontre-collision plutôt que d'annuler le déplacement. Cela stabilisera aussi l'algorithme.

  3. #3
    Membre averti
    Avatar de Psycadi
    Homme Profil pro
    Chef de projet - Expert en message box
    Inscrit en
    Juillet 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet - Expert en message box

    Informations forums :
    Inscription : Juillet 2003
    Messages : 147
    Points : 364
    Points
    364
    Par défaut
    C'est nettement mieux comme raisonnement. que tous les tuto que j'ai pu voir sur le net.

    Je vais essayer d'appliquer cela.

    Merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 204
    Points : 12 370
    Points
    12 370

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

Discussions similaires

  1. Gestion de projet: encodage des heures sur des tâches
    Par Terminator dans le forum Gestion de projet
    Réponses: 2
    Dernier message: 03/02/2015, 12h10
  2. Trigger pour mettre des droits sur des procedures et des vues
    Par briino dans le forum Développement
    Réponses: 3
    Dernier message: 23/09/2009, 10h44
  3. Réponses: 4
    Dernier message: 02/04/2008, 18h51
  4. Réponses: 3
    Dernier message: 13/09/2007, 19h11
  5. Réponses: 3
    Dernier message: 23/01/2007, 09h14

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