[Resolu] [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
serial_mappeur
Messages : 11
Inscription : 06 Juin 2016 23:00

[Resolu] [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par serial_mappeur » 06 Juin 2016 23:15

Bonsoir / Bonjour a tous,

J'ai poster sur openClasseRoom mais je viens ici car ca concerne Unity
Alors j'ai un problème, je suis entrain de faire un petit programme, une sorte de roulette russe avec une flèche.

Tout fonctionne a l'aide du clavier, mais des que j'importe le joystick, ça bug.
C'est a dire que mon problème est :

Que ça fonctionne que dans un sens, je n'arrive a tourner qu'a droite.

Si j'actionne le joystick gauche vers la gauche, ça tourne a droite.
Si je lâche tout, la flèche tourne toute seul dans le bon sens, et dès que je veux encore tourner a gauche, hop elle repart a droite, je relâche hop elle repart a gauche.
Bon pour le deuxième problème c'est parce que dans la condition je dit que, "si je n'utilise pas le joystick alors tourne a gauche"

Je n'arrive pas a déterminer quand la direction du joystick passe a gauche ou a droite de l'axe.

Voici le code:

Code : Tout sélectionner

float joy = Input.GetAxis ("Horizontal");
 
        if (Input.GetKey (KeyCode.RightArrow) || joy !=0)
        {
            vitesseGiration += 0.1f * Time.deltaTime;
        }
        else if (Input.GetKey (KeyCode.LeftArrow) || joy ==0)
        {
            vitesseGiration -= 0.1f * Time.deltaTime;
            giration.transform.Rotate (new Vector3 (0, -joy, 0));
        }
        else
        {
            vitesseGiration -= 0.01f * Mathf.Sign(vitesseGiration) * Time.deltaTime;
 
            if (Mathf.Abs(vitesseGiration) <= vitesseMinimumGiration)
            {
                vitesseGiration = 0.0f;
            }
        }
        giration.transform.Rotate (new Vector3 (0, vitesseGiration, 0));
Merci de m'avoir lu, bonne soirée / journée
Dernière édition par serial_mappeur le 08 Juin 2016 00:06, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6267
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par boubouk50 » 07 Juin 2016 09:30

Tes conditions sont mauvaises:
Dans la première: si joy !=0 (donc si tu touches le joystick) et dans la seconde: si joy ==0 (donc si tu ne touches pas le joystick). Ce qui implique que la 3e ne sera jamais atteinte.
LeftArrow doit être associée à un joy négatif (avec un delta pour les artefacts)
RightArrow doit être associée à un joy positif (avec un delta pour les artefacts)
Ce qui laisse la dernière à joy == 0 (avec un delta pour les artefacts) quand rien n'est touché.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

serial_mappeur
Messages : 11
Inscription : 06 Juin 2016 23:00

Re: [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par serial_mappeur » 07 Juin 2016 12:56

Pour les conditions mauvaises je comprends.
Mais pour les " delta pour les artefacts" je comprend pas, delta c'est time.deltatime?
Et les artefacts qu'est-ce donc?
Quand je tappe "artefact sur unity" j'ai des pages avec assasin's creed xD

j'ai essayer ca, mais ca fonctionne pas :

Code : Tout sélectionner

		float joy = Input.GetAxis ("Horizontal");

		if (Input.GetKey (KeyCode.RightArrow) || joy !=0* Time.deltaTime)
		{
			vitesseGiration += 0.1f * Time.deltaTime;
		}
		else if (Input.GetKey (KeyCode.LeftArrow) || -joy !=0* Time.deltaTime)
		{
			vitesseGiration -= 0.1f * Time.deltaTime;
			giration.transform.Rotate (new Vector3 (0, -joy, 0));
		}
		else
		{
			vitesseGiration -= 0.01f * Mathf.Sign(vitesseGiration) * Time.deltaTime;

			if (Mathf.Abs(vitesseGiration) <= vitesseMinimumGiration)
			{
				vitesseGiration = 0.0f;
			}
		}
		giration.transform.Rotate (new Vector3 (0, vitesseGiration, 0));

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6267
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par boubouk50 » 07 Juin 2016 13:31

artefact. Structure ou phénomène d'origine artificielle ou accidentelle qui altère une expérience ou un examen portant sur un phénomène naturel. Altération du résultat d'un examen due au procédé technique utilisé.
Dans le cas du joystick, quand tu ne le touches pas, il se peut qu'il ne soit pas à zéro mais à 0.08 par exemple. C'est un artefact par définition.
Delta.La lettre majuscule Δ est souvent utilisée en sciences et mathématiques pour décrire une différence entre deux grandeurs, delta étant l'initiale du mot grec διαφορά (diaphorá), « différence ».
Dans le cas du Joystick le delta est la marge que tu donnes à tes valeurs pour ne pas être trop précis. Ici, comme ton joystick peut avoir des artefacts, donc osciller entre -0.08 et 0.08 au lieu d'être exactement 0 par exemple, ta condition doit tenir compte d'un delta pour les tests.
Ce ne sont pas des noms de variables ou de fonctions, ce sont les mots qui définissent le problème que tu as ou que tu vas avoir.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

serial_mappeur
Messages : 11
Inscription : 06 Juin 2016 23:00

Re: [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par serial_mappeur » 07 Juin 2016 13:49

Wow j'aurais du faire d'autres études xD

mmmm je vais regarder et surtout essayer de comprendre.
Merci pour ces précieux conseils

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6267
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par boubouk50 » 07 Juin 2016 14:03

Ton clavier renvoie -1, 0 ou 1. Ton Joystick une valeur entre -1 et 1. Pour éviter donc de refaire la roue avec un joystick, le mieux serait de contraindre ton joystick à 3 valeurs: -1, 0 et 1. Comme cela ton code fonctionnel pour le clavier le sera aussi pour le joystick.
Je ne sais pas si c'est faisable directement depuis le InputManager, sinon tu peux toujours te le coder facilement. Aussi, tu as Input.GetRawAxis () qui te permet d'avoir un Input non lissé et donc tu peux définir ton propre fonctionnement avec plutôt que Input.GetAxis ()
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

serial_mappeur
Messages : 11
Inscription : 06 Juin 2016 23:00

Re: [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par serial_mappeur » 07 Juin 2016 14:58

D'accord merci.

Donc en faite il faudrait que je fasse un truc du genre:

Code : Tout sélectionner

float joyA = Input.GetAxis ("Horizontal");
float joyNegA = joyA-1;
float joyB = Input.GetAxis ("Horizontal");
float joyNegB = joyB-0;
float joyC = Input.GetAxis ("Horizontal");
float joyNegC = joyC+1;
Je parie que ce n'est pas du tout ca xD
C'est embêtant car tout fonctionne sauf que ça tourne que dans un sens^^
Et qu'au clavier tout fonctionne

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6267
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par boubouk50 » 07 Juin 2016 16:37

Effectivement, tu as tout à fait compris que n'as pas compris! :langue2:

Je recommence les explications: Faire en sorte que ton Joystick fonctionne comme un clavier -> 2 touches.
La touche Left correspond à un Input du Joystick négatif.
La touche Right correspond à un Input du Joystick positif.
Donc 2 booléens qui récupèrent ce test.
Ainsi:

Code : Tout sélectionner

	float joy = Input.GetAxis ("Horizontal");
	float delta = 0.15f; //Ici on considère que le joystick est nul s'il est poussé à 15%. A toi de choisir ton delta
	bool leftJoystick = joy < 0f - delta ? true : false; //Si le joystick est vers la gauche alors true sinon false
	bool rightJoystick = joy > delta ? true : false;   //Si le joystick est vers la droite alors true sinon false

      if (Input.GetKey (KeyCode.RightArrow) || rightJoystick)
      {
         vitesseGiration += 0.1f * Time.deltaTime;
      }
      else if (Input.GetKey (KeyCode.LeftArrow) || leftJoystick)
      {
         vitesseGiration -= 0.1f * Time.deltaTime;
      }
      else
      {
         vitesseGiration -= 0.01f * Mathf.Sign(vitesseGiration) * Time.deltaTime;

         if (Mathf.Abs(vitesseGiration) <= vitesseMinimumGiration)
         {
            vitesseGiration = 0.0f;
         }
      }
      giration.transform.Rotate (new Vector3 (0, vitesseGiration, 0));
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

serial_mappeur
Messages : 11
Inscription : 06 Juin 2016 23:00

[Resolu] [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par serial_mappeur » 07 Juin 2016 17:31

Merci ça fonctionne impeccable, en faite même si ce n'est pas compliqué, je n'aurais jamais trouver.
Car il y a une syntaxe que je ne connais pas c'est le "?" et le ":"
Je vais regarder a quoi ça sert, pour que je puisse le faire dans d'autre cas.

Encore merci pour ta patience et ton aide

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6267
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Joystick, Gamepad, axe que je ne maitrise pas

Message par boubouk50 » 07 Juin 2016 17:37

C'est juste un raccourci pour écrire les if et les else.

Code : Tout sélectionner

bool leftJoystick = joy < 0f - delta ? true : false;
c'est la même chose que:

Code : Tout sélectionner

bool leftJoystick;
if (joy < 0f - delta)
	leftJoystick = true;
else
	leftJoystick = false;
Donc rien de méchant.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « (C#) CSharp »