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

C# Discussion :

Liste de points entre 2 position


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Février 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 106
    Billets dans le blog
    1
    Par défaut Liste de points entre 2 position
    Bonsoir,

    j'ai un problème tout bête que je n'arrive pas a résoudre.
    dans un projet en développement, disons un jeux, j'ai sur l'écrans la position A du joueur A et la position B du joueur B
    mon personnage dois envoyer une projectile du pointA au pointB
    Attention, la distance entre les 2 points n'est pas forcément linéaire.
    par contre le trajet entre les 2 points dois être situé sur une ligne bien droite
    comme ca :
    Nom : 1.png
Affichages : 137
Taille : 119,8 Ko

    donc je cherche qu'une méthode m'envoie une liste de points comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public List<Point> returnPoint (Point pointA, Point pointB)
    {
         List<Point> list1 = new List<Point>();
         ...
         return list1;
    }
    ou n'importe quoi qui fait l'affaire
    j'ai bon cherché sur internet je ne trouve qu'un truc qui calcule la distance et le temps entre 2 point d'où je n'ai nullement l'utilité.
    vus que je suis aussi nul en math je n'arrive pas a trouver mon bonheur.

    est se que quelqu'un a une idée svp ?

  2. #2
    Membre confirmé
    Inscrit en
    Février 2013
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 34
    Par défaut
    Qu'apelles tu distance non linéaire ?
    Est-ce que ton jeu utilise une géométrie non euclidienne ? (Présence de "portails" ou repliements dans l'espace comme sur une carte d'un globe ?)

    Si ce n'est pas le cas c'est assez simple: tu calcules les coordonnées du vecteur AB. Tu divises ça par le nombre de points que tu veux. Ça va te donner un vecteur d
    Pour créer le point suivant dans ta liste, tu ajoutes le vecteur au point précédent .

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    et comme ton vecteur est 3 dimensions, tu auras les coordonnées des points en 3D...

    et idéalement, tu associeras un vecteur vitesse à ton projectile... (histoire de dire la force des dégats)

  4. #4
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 667
    Par défaut
    Bonjour,

    cherches-tu quelques chose comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            public PointF calculTrajectory(PointF depart, PointF cible)
            {
                PointF trajectory;
     
                var angle = Math.Atan2(cible.Y - depart.Y, cible.X - depart.X);
                trajectory = new PointF((float)Math.Cos(angle), (float)Math.Sin(angle));
     
                return trajectory;
            }
    Si tu appliques la trajectoire a la position de ton projectile dans ta boucle de jeu, il passera par la position de la cible. Et si tu as une gestion de la vitesse des projectiles , tu peux aussi faire du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                // Pseudo code
                projectile.Position += trajectory * projectile.MoveSpeed;
    Ou alors si tu veux le nombre de points qu'il te faut pour parcourir la distance en X temps , tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            public List<PointF> calculTrajectory(PointF depart, PointF cible,int step)
            {
                List<PointF> points = new List<PointF>();
     
                PointF distance = new PointF(cible.X - depart.X, cible.Y - depart.Y);
     
                for (int i = 1; i < step; i++)
                {
                    points.Add(new PointF(depart.X + (distance.X / step * i), depart.Y + (distance.Y / step * i)));
                }
     
                return points;
     
            }
    Les codes ont été écrit a la va vite donc sont très perfectibles , mais ça devrait te mettre sur la piste

    EDIT : code corrigé

  5. #5
    Membre confirmé

    Inscrit en
    Février 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 106
    Billets dans le blog
    1
    Par défaut
    Encore merci pour ton aide sur ce problème,
    ton code marche impeccable et sur mesure, j'ai juste fait un copier coller et hop
    par contre j'ai été frustré par un échec sur ton code et précisément 2 problèmes
    ce code marche très biens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<PointF> f = calculTrajectory(new PointF(0F, 0F), new PointF(200F, 100F), 50);
    qui donne une liste de 50 éléments débutant de (x=4 , y=2) et fini par (x=196 , y=98)

    mais ce n'est plus la même chose lorsqu'on échange les 2 points
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<PointF> f = calculTrajectory(new PointF(200F, 100F), new PointF(0F, 0F), 50);
    la liste commence par (198 , 98) et se termine avec (102 , 2);
    et du coup la projectile n'est pas sur le bon alignement horizontal (X = 102) alors que ça devrai atteindre 0 ou valeur approximative, mais elle est sur le bon alignement vertical (Y = 2)

    ce problème deviens plus visible lorsqu'il s'agit de plus grand nombres comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<PointF> f = calculTrajectory(new PointF(465F, 345F), new PointF(285F, 225F), 50);
    la liste commence avec (463.8 , 342.6) et se termine avec (406.2 , 227,4)
    elle s'est dévié de 121 pixel horizontal (406.2 , 285)

    donc se n'est pas vraiment proportionnel au coordonnées X et Y
    mais si par contre la ligne est diagonal, cad :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<PointF> f = calculTrajectory(new PointF(465F, 465F), new PointF(285F, 285F), 50);
    cela marche très bien tant que c'est diagonal
    une idée ?
    encore merci pour le soutien

  6. #6
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 667
    Par défaut
    Salut,

    désolé j'ai fait une faute de frappe toute bête dans le code (comme je disais je l'ai écrit a la va-vite) :

    Ca devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PointF distance = new PointF(cible.X - depart.X, cible.Y - depart.Y);
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PointF distance = new PointF(cible.X - depart.Y, cible.Y - depart.Y);
    Du coup , ça marchait uniquement si les valeur X et Y etaient éloignées pareil.

    J'ai fait les tests avec les valeurs que tu as mis , et ça devrait être bon.

    Note que ça inclut uniquement le trajet a faire , et non le départ et l'arrivé (je les ai exclu délibérément) , si tel est ton souhait tu as juste a changé la condition de la boucle for.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/12/2005, 10h15
  2. Trouver equation à partir d'une liste de points
    Par scarabee dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 27/05/2004, 17h05
  3. [ plugin ][ extension point ] liste des points d'extension
    Par Satch dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 19/03/2004, 09h34
  4. Listes déroulantes liées entre elles
    Par denisC dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/07/2002, 15h53

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