V3 : déplacer en fonction de l'inclinaison

Durée estimée: 10 minutes

Règles du jeu

Dans cette nouvelle version, la deuxième balle va se déplacer selon l'inclinaison du smartphone :

  1. vers la droite si on penche le smartphone vers la droite,
    vers la gauche si on penche le smartphone vers la gauche,
    vers le bas si on redresse le smartphone vers soi,
    vers le haut du smartphone si on penche le smartphone vers l'avant,
  2. d'autant plus vite que le smartphone est incliné
Les autres règles sont inchangées.

Analyse

Pour mesurer l'inclinaison du smartphone, on va utiliser un capteur : l'accéléromètre.
On va déplacer la balle à intervalles réguliers avec une horloge qui déclenche un évènement chronomètre toutes les 50ms.

L'accéléromètre mesure la force exercée sur le smartphone, qui s'oppose à la gravité. Quand on le tient ou qu'on le pose, cette force est égale à son poids. Cette force est nulle si le smartphone est en chute libre (n'essayez pas).
Les mesures de l'accéléromètre correspondent à cette force, divisée par la masse du téléphone (9,81 m/s2 arrondi à 10). Elle se décompose selon les 3 axes x,y,z selon l'orientation du smartphone :
x y z Conditions
0 0 0 en chute libre (croyez le sans essayer)
0 0 10 posé à l'horizontale face visible sur une table,
0 0 -10 posé à l'horizontale face cachée sur une table,
0 10 0 tenu à la verticale, tête en haut
0 -10 0 tenu à la verticale, tête en bas
10 0 0 penché à 90° à gauche sur la tranche
-10 0 0 penché à 90° à droite sur la tranche
balle3/assets/img/smartphoneAxes.png

Solution retenue

  • le smartphone est à l'horizontale (acc.x = 0 et acc.y = 0) la balle ne bouge pas,
  • on penche le smartphone vers la gauche (acc.x > 0) la balle va vers la gauche (x diminue),
  • on penche le smartphone vers la droite (acc.x < 0) la balle va vers la droite (x augmente),
  • on penche le smartphone vers le haut (acc.y > 0) la balle va vers le bas (y augmente),
  • on penche le smartphone tête en bas (acc.y < 0) la balle va vers le bas (y diminue),
  • on déplace la balle à intervalles réguliers, aux impulsions d'une horloge,

On va réaliser la solution en 2 temps :

  • d'abord afficher les accélérations en x et y dans un label pour vérifier leurs valeurs,
  • puis ajouter ou soustraire les valeurs de X et Y aux coordonnées de la balle.

Design (ajouts)

Nom du projet : balle3 (dans project properties)

Composants : ajout d'un 2° label pour l'accélération, d'un accéléromètre et d'une horloge.

type catégorie Nom rôle propriété valeur
Label Interface LabelAccelero affich.accel. couleur fond
taille police
hauteur
largeur
Texte
aucune
24
automatique
automatique
accelero : 0,0
accéléromètre Capteurs accéléromètre1 sensibilité
actif
legacy
intervalle min
forte
oui (coché)
non
400
horloge Capteurs HorlogeAccelero always fires
chrono active
intervalle
non
oui
50

Codage - étape 1 - affichage des mesuresde l'accéléromètre

Dans cette étape, on va afficher les valeurs arrondies de l'accélération pour observer ses composantes en x et y, en fonction de l'inclinaison du smartphone.
On va actualiser les valeurs affichées à chaque déclenchement du chronomètre de l'horloge :
Quand HorlogeAccelero.chronomètre
       afficher dans la propriété LabelAccelero.Texte,
            l'arrondi de l'accélération sur x Accéléromètre.Xaccel,
            suivi d'une virgule
            et de l'arrondi de l'accélération sur x Accéléromètre.Xaccel.

Quand HorlogeAccelero.chronomètre
   mettre labelAccelero.Texte à concaténation de
      ← Acc x :
      ← arrondi de Accéléromètre1.Xaccel
      ← y :
      ← arrondi de Accéléromètre1.Yaccel

balle3/assets/img/blocsAccelA.png

balle3/assets/img/blocJoint.png A noter :
Vous n'avez peut-être pas encore vu le bloc Joint : il fait la jointure ou l'assemblage des informations collées en paramètres à sa droite. En cliquant sur la roulette bleue de ce bloc, vous pouvez ajouter autant de lignes que vous voulez. Le retour à la ligne s'écrit \n

Transférez cette version sur le smartphone et évaluez

Depuis l'horizontale

  • inclinez le smartphone vers la gauche pour vérifier les valeurs positives de X
  • inclinez le smartphone vers la droite, et vérifiez les valeurs négatives de X
  • redressez le smartphone verticalement tête en haut, et vérifiez les valeurs positives de Y
  • inclinez le smartphone verticalement tête en bas pour vérifier les valeurs négatives de Y

En conséquence

  • Quand on penche le téléphone à gauche, on veut que la balle aille vers la gauche,
    donc quand l'accélération en x est positive, l'abscisse x doit diminuer,
    donc, il faut soustraire l'accélération à l'abscisse précédent.
  • Quand on redresse le téléphone tête en haut, on veut que la balle aille vers le bas,
    donc quand l'accélération en y est positive, on veut que l'ordonnée y augmente,
    donc il faut ajouter cette accélération en y à l'ordonnée précédente.

Codage - étape 2

Pour que le déclenchement des déplacements se fasse à intervalles réguliers, on va

  • remplacer l'évènement Quand Accelerometre1.acceleration changée
    par l'évènement Quand Horloge.chronomètre
  • et dans ce script, remplacer
    • le paramètre xAccel par la propriété Accelerometre1.xAccel
    • le paramètre yAccel par la propriété Accelerometre1.yAccel
Pour obtenir :

balle3/assets/img/blocsAccelB.png

Transférez cette version sur le smartphone et testez

balle3/assets/img/blocsBalle3.png

(Option) Des réglages pour améliorer ?

  • est-ce que la balle se déplace assez vite ?
  • est-ce que ça va marcher pareil sur tous les smartphones ?

On peut faire des changements pour que l'application fonctionne à peu près de la même manière sur tous les smartphones. La taille des balles et leur déplacement doivent être proportionnés à la largeur ou la hauteur du cadre ou de l'écran Screen1.width et Screen1.height.

Donc au démarrage de l'application, pour l'évènement quand Screen1.initialize on va définir la taille de balles et un coefficient que l'on appliquera aux déplacments en x et y. La largeur définie par défaut d'un écran étant de 320 pixels (Fixed) on va corriger pour la largeur ou la hauteur réelle width et height

Dans les blocs ci-dessous :

  • on a défini 2 variables 'coeffx' et 'coeffy' qui sont proportionnels à la largeur et la hauteur de l'écran et on les utilise plus loin dans la procédure de déplacement Aller à ,
  • on redéfinit le rayon des balles en proportion de la largeur de l'écran en pixels, au démarrage de l'application, quand Screen1.Initialize
  • on a désactivé et réduit (clic droit) les blocs de déplacement par glissement de la balle.

balle3/assets/img/blocsBalle3a.png

Envoyer un commentaire