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

Développement 2D, 3D et Jeux Discussion :

Problème mathématiques, joystick virtuel.


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut Problème mathématiques, joystick virtuel.
    Bonjour,
    Je voudrais réaliser un joystick virtuel pour windows phone comme dans cette vidéo(à une minute):
    [ame="http://www.youtube.com/watch?v=kal9CANOvno"]Futuron - RPG game for Windows Phone - YouTube[/ame]
    J'ai réussi à faire en sorte que le joystick reste dans une sorte d’enclos.
    Le problème c'est que je voudrais que lorsque le doigt du joueur sort de la zone de joystick (c'est le cercle bleu qui ne bouge pas dans la vidéo qui contient le joystick) il reste dans l'enclos tout en suivant le doigt du joueur mais à "distance" comme dans la vidéo, lorsque le curseur qui symbolise le doigt sort de l'enclos.(l'enclos c'est le cercle bleu dans la vidéo).
    J'ai réaliser ce code(C#):
    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
    17
    18
     
    Vector2 posJ = touche.Position;
                        double div=0;
                        double dist = Math.Sqrt(Math.Pow(posJ.X - pad[0].Save.X, 2) + Math.Pow(posJ.Y - pad[0].Save.Y, 2));
                        if (dist >= /*pad[0].Contour.Width*/200 / 2)
                        {
                            div = dist / 100;
                            posJ = posJ / (float)div;
                            posJ.X -= pad[0].Texture.Width / 2;
                            posJ.Y -= pad[0].Texture.Height / 2;
                            pad[0].Position = posJ;
                        }
                        else
                        {
                            posJ.X -= pad[0].Texture.Width / 2;
                            posJ.Y -= pad[0].Texture.Height / 2;
                            pad[0].Position = posJ;
                        }
    Donc dans un premier temps je récupère la position de mon doigt et je calcule la distance entre cette position et le centre de mon enclot. Si la position est en dehors de l'enclos(c'est ici que ça foire), je veux trouver les positions limites de l'enclos, mais il faut que ça reste aligner avec le doigt sans sortir de l'enclos.
    Else je suis dans l'enclos donc la la position de l'image de mon joystick = la position du doigt du joueur.
    Je veux juste trouver les coordonné du joystick lorsque le doigt sort de l'enclot
    J'ai l'impression d'avoir la bonne formule dans mon code mais en fait non^^.
    Je ne sais pas si j'ai réussi à me faire comprendre.
    Si vous avez des questions n’hésitez pas
    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je ne fais pas de C# et encore moins sur windows phone donc je peux pas aider sur le code en particulier.
    J'ai pas tous a fait compris mais voila en gros ce qu'il faut faire ,déjà quand je commence un jeu ( en général sur un nouveau langage) je m'assure déjà de gérer deux chose les fps et les évènements.
    Dans les évènements voila ce qu'il faut gerer le down , quand on reste appuyer et le up quand on a ça géré algo ressemble a ça :

    Alors en gros pseudo code
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    si down
    {
        p.x = tactile.x
        p.y = tactile.y
        joystick = 1
    }
     
    si  joystick == 1
    {
        affiche cercle
        //positon du cercle
        cercle.x = p.x
        cercle.y = p.y
     
        affiche joystick
        //positon du joystick
        joystick.x = tactile.x
        joystick.y = tactile.y
     
        if(joystick.x >limite.x) joystick.x = limite.x
        if(joystick.y >limite.y) joystick.y = limite.y
    }
     
    si up
    {
       joystick = 0
    }
    Quelque explication pour limite.x et limite.y , c'est la limite du cercle il faut faire qql calcul de trigo pour connaitre la limite.x et limite.y , je l'ai pas mis pour que algo soit simple a comprendre , mais de la trigo de 4 eme suffit amplement http://fr.wikipedia.org/wiki/Trigono...onom.C3.A9trie =P

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Merci pour ta réponse.
    En fait je suis dans la fonction quand la personne reste appuyé. J'ai réussi à gerer les events.
    Le problème se situe au niveau de la trigo.
    Pour réaliser le joystick voila en détail comment j'ai procédé:
    (légende par rapport à la vidéo: le joystick = joystick et le cercle bleu = l'enclos)

    -Je calcule la distance entre le centre de l'enclos et la position du doigt. C'est la ligne : double dist = Math.sqrt(...);

    -Si cette distance est > à la limite de mon enclos, donc je suis en dehors, je rentre dans mon premier if.

    -Maintenant je vais calculer le ratio entre la limite de l'enclos(que j'ai mis en dure à 100 dans le code) et la position de mon doigt:
    div = dist/100;(dans le code)
    Donc la je sais que je suis div* trop loin de mon enclos, donc que mes variables x et y sont div* trop loin. Donc je divise x et y par div:
    pos_de_doigt /= div;(posJ = posJ / (float)div; dans le code)
    Normalement cette formule devrais ramener mes coordonnés en x et y à la limite de mon enclos.

    Exemple concret réalisé sur feuille (indice 1x et 1y = 0.5cm):
    -limite de mon enclos(périmètre) = 5cm.
    -position de mon doigt par rapport au centre de mon enclos = 10cm.
    -coordonnée du doigt = 12x ; 16y.

    Donc:
    je fais 10/5 = 2. (j'ai mon ration)
    ensuite 12x/2 et 16y/2 = 6x et 8y.

    Les coordonnée correspondent bien à la limite de mon enclos.

    Autre exemple avec ratio à virgule(pour montrer que ça marche^^):
    -limite de mon enclos(périmètre) = 5cm.
    -position de mon doigt par rapport au centre de mon enclos = 7.8cm.
    -coordonnée du doigt = 14x ; 7y.

    Donc:
    je fais 7.8/5 = 1.56. (j'ai mon ration)
    ensuite 12x/1.56 et 16y/1.56 ~= 9x(8.97x pour être précis) et 4.5y.

    Encore une fois ça match nickel.
    Dans ton code Kannagi il faut que je détermine , et c'est se que j'essaye de faire, les limite.x et limite.y. C'est la trigo 4eme le problème lol.
    Si vous pouviez me dire où dans l'algo ça foire(dans le code) se serait cool,
    Merci.

    Edit: Dans mon code pad[0].Save sont les coordonnés du point "d'impact" du joueur, là où il touche pour la première fois l'ecran.

  4. #4
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Salut,

    Citation Envoyé par shirohige Voir le message
    Donc la je sais que je suis div* trop loin de mon enclos, donc que mes variables x et y sont div* trop loin. Donc je divise x et y par div:
    pos_de_doigt /= div;(posJ = posJ / (float)div; dans le code)
    Normalement cette formule devrais ramener mes coordonnés en x et y à la limite de mon enclos.
    Uniquement si ton origine est au centre de ton joystick virtuel.
    Si ce n'est pas le cas, il faut uniquement diviser la partie "relative", et garder l'origine où elle est.

    En gros, si le neutre ton joystick est en Xj/Yj, et ton doigt en Xd/Yd:
    -tu calcules toujours ta distance et ton ratio comme tu l'as fait
    -tu ramènes la position du doigt en limite de zone en faisant Xd=Xj+(Xd-Xj)/div et pareil sur les Y.

    Avec cette méthode, pas besoin de sortir les formules de trigo!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Points : 545
    Points
    545
    Par défaut
    Salut !

    Je n’ai pas tous lu, mais je te conseil d’utiliser des objets trigonométrique (Vecteur, Matrice , Quaternion , etc) qui te permettra de réfléchir de manière géométrique a ton problème !

    L’écriture pour résoudre ton problème deviendra triviale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Vecteur touchePos, enclosPos;
    double enclosRadius,stickRadius;
     
    Vecteur stickDirection = touchePos - enclosPos;
    stickDirection.Length = enclosRadius - stickRadius
     
    Vecteur stickPos = enclosPos + stickDirection;
    Avec une classe vecteur :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class Vecteur 
    {
           
    	/// coordonnes du vecteur
    	public double x = 0, y = 0;
    	
    
    	/// longueur du vecteur
    	public double Length
    	{
    		get { return Math.Sqrt(x*x + y*y); }
    		set
    		{
    			double NewLength = value / Length;
    			x *= NewLength;
    			y *= NewLength;
    		}
    	}
       
        /// Adition de 2 vecteurs 
    	static public Vecteur operator +(Vecteur v1, Vecteur v2)
    	{
    		return new Vecteur(v1.x + v2.x, v1.y + v2.y);
    	}
    	
    	/// Difference de 2 vecteurs
    	static public Vecteur operator -(Vecteur v1, Vecteur v2)
    	{
    		return new Vecteur(v1.x - v2.x, v1.y - v2.y);
    	}
          
            [ ... ]
    }
    L’avantage d’écrire des opérations matriciel est que celles-ci s’optimisent et se parallélisent bien celons les plateformes, notamment sur GPU
    ShaderElement : Bénéficier de l’accélération graphique simplement par une nouvelle balise HTML <shader>
    ODE.js : portage JavaScript du célèbre moteur physique 3D Open Dynamics Engine

  6. #6
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Pourquoi as tu besoin de gérer la distance ? la direction seule ne te suffit pas ?
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  7. #7
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    @p3ga5e déjà qu'il a du mal avec de la trigo de 4eme , on va évité les vecteurs , matrices et quaternions

    Citation Envoyé par shirohige Voir le message
    Encore une fois ça match nickel.
    Dans ton code Kannagi il faut que je détermine , et c'est se que j'essaye de faire, les limite.x et limite.y. C'est la trigo 4eme le problème lol.
    Si ton seul probleme et de calculer limite.x et limite.y c'est facile ,mais je voudrait savoir par curiosité mais tu es en quelle classe ?

    Je vais résoudre pour limite.x , allez cours de 4eme :
    si je prend ce triangle :

    Admettons que :
    A c'est le centre de ton cercle.
    B c'est la ou on touche écran je l'avais appelé tactile.
    C est facile a deviner sa position en x est C.x = B.X et C.y = A.y. (suffit de regarder le dessin).
    Maintenant la formule cos a = adjacent/hypoténuse.
    Alors hypoténuse est appelé dans le dessin 'c' , tu l'a surement trouvé avec sqrt ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int h = sqrt( (A.x - B.x) *  (A.x - B.x) + (A.y - B.y) *  (A.y - B.y) );
    adjacent est facile a trouvé (appelé 'b') , c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int adj = C.x - A.x;
    On peut donc trouver cos a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float cos_angle =(float)adj/(float)h;
    Maintenant revenons a notre probleme , imaginons que ton rayon est de 5.
    A est toujours le centre du cercle.
    on connait c qui est de 5 , il faut connaitre le cote adjacent.
    Donc cos a * hypoténuse = adjacent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    limite.x = cos_angle*h;
    Je viens de relire est mon algo il est un peu incorrect vers la fin (c'étais pour dire la grosse logique).
    Je parle de ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(joystick.x >limite.x) joystick.x = limite.x
    if(joystick.y >limite.y) joystick.y = limite.y
    Voila , sinon même logique pour pour limite.y (mais la c'est l'opposé qu'on utilisera).

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Alors merci à vous tous d'avoir répondu.
    Un merci * 100 à plegat, le calcule marche nickel, sans avoir à passer par la trigo . Merci pour vos réponses complètes. A la question de savoir en quelle classe je suis, je suis sensé connaître la trigo de collège depuis longtemps .
    Je reviendrai surement à la charge pour quelques questions de math.
    Si vous connaissez des cours-tuto de math qui reprend les math depuis le début je suis preneur.
    Merci encore pour votre aide.

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

Discussions similaires

  1. Problème mathématique avec les nombres
    Par ramirami dans le forum Langage
    Réponses: 51
    Dernier message: 15/02/2007, 23h07
  2. Problème sur key virtuel
    Par BECHE dans le forum Delphi
    Réponses: 2
    Dernier message: 01/02/2007, 18h23
  3. Problème de panier virtuel
    Par zourk dans le forum Langage
    Réponses: 1
    Dernier message: 29/08/2006, 13h41
  4. [POO]Probléme de constructeur virtuel surchargé
    Par Laurent Dardenne dans le forum Delphi
    Réponses: 10
    Dernier message: 15/08/2006, 12h19
  5. Problème mathématique
    Par Appwal dans le forum Mathématiques
    Réponses: 22
    Dernier message: 13/05/2006, 18h06

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