Je suis en train de créer une API gui pour les jeux et une fonctionnalité demandée était un tremblement. Essentiellement un événement très similaire à Aero Shake de Windows 7. Lorsque la souris est enfoncée, si elle est rapidement déplacée dans les deux directions, l'événement est déclenché. Je ne suis pas sûr quel type de psedocode irait dans cela?Implémentation d'un événement de tremblement?
Répondre
je pourrais envisager quelque chose comme ceci:
- toujours créer un vecteur pour la direction de la souris a voyagé sur son dernier mouvement
- toujours garder un enregistrement du vecteur avant immédiatement, comme vous rassemblez le vecteur suivant (ce qui signifie que vous avez toujours deux vecteurs à évaluer).
- faire un produit scalaire des deux vecteurs, à chaque arrivée de la souris. Si le point-produit est positif, alors ignorez-le. Si elle est négative, alors définissez une valeur de temps avec elle et stockez dans un tableau qui stocke peut-être jusqu'à cinq de ces horodatages.
- répéter la séquence ci-dessus. Si le tableau d'horodatage a un ensemble d'horodatages consécutifs qui diffèrent chacun par un epsilon, alors vous pouvez supposer que quelqu'un est en train de secouer quelque chose. :)
Je peux me tromper, mais dans (4) ne veux-tu pas dire delta, au lieu d'epsilon? – ocodo
@slomojo: par 'epsilon' je voulais juste dire un très petit delta. Compte tenu de son utilisation dans le calcul, peut-être epsilon est une sur-déclaration. :) –
Vous devez compter les changements dans le mouvement de la souris. Si la souris change de direction plus de 3 fois en moins de, disons, 0,7 secondes, alors c'est un tremblement. Pour détecter le changement de direction suivre pour toujours les 5 dernières coordonnées de la souris. Si le point P0 est le dernier et P5 cinquième pour durer, alors calculer un angle fait entre P0-P3 et P3-P5. Si l'angle est inférieur à 5 degrés, la souris change de direction.
quelque chose comme ceci sera probablement la meilleure solution. Ce n'est pas une science exacte après tout. – rtpg
Dépend de la taille et de la fréquence de l'échantillon. Chaque mouvement de la souris peut potentiellement générer des événements. Si les échantillons se rapprochent trop, vous finissez avec ce qui ressemble plus à une courbe qu'à un angle aigu. D'autant plus que peu de gens sont capables de déplacer le curseur exactement dans la direction opposée - le mouvement se termine souvent un peu. – cHao
L'idée générale serait quelque chose comme ceci:
Sur la souris vers le bas:
- magasin la position actuelle comme
(x0, y0)
. - Définissez
slope = 0
. - Définissez
start time = current time
.
Le déplacement de la souris:
- Stocker la position actuelle comme
(x, y)
. - Définissez
newSlope = abs((y - y0)/(x - x0))
. (Ceci indique la direction du mouvement de la souris par rapport à la position de départ) - Si
abs(newSlope - slope) < some threshold
alors l'utilisateur est toujours en mouvement dans la même direction: alors vérifiez sicurrent time - start time > shake time
, si oui, déclenchez l'événement de secousse et réinitialisezstart time
. - Sinon, l'utilisateur a changé de direction. Définissez
slope = newSlope
et réinitialisezstart time = current time
.
Attention cependant à l'éventualité d'un déplacement de la souris exactement verticalement, cependant - me semble que cela pourrait facilement provoquer une exception/erreur "division par zéro". – cHao
J'ai trouvé plus élégant et plus à la réponse de point. Suivre les dernières positions de la souris N (disons 20). Ces positions sont délimitées par un rectangle dont le sommet est le minimum (P (N) .top), le fond = le maximum (P (N) .bottom), etc. Calculez la distance totale parcourue par la souris pendant ces derniers N derniers temps. Si la distance totale parcourue est plus de K fois plus grande que le périmètre de ce rectangle, alors c'est un tremblement.
Quels systèmes d'exploitation ciblez-vous? Quel framework de jeu utilisez-vous, le cas échéant? –
Il ne devrait pas être spécifique à la plate-forme, je peux créer des événements chronométrés, obtenir la position de la souris etc, – jmasterx