MonoGame la lecture des gestes tactiles
Je suis en train d'écrire un jeu en utilisant le fantastique monogame cadre. Je vais avoir du mal à réagir à la touche entrée correctement. Lorsqu'un utilisateur fait glisser horizontalement ou verticalement, je veux effectuer une action une fois par glisser. Le problème, c'est le geste devient émises à plusieurs reprises pour chaque glisser. Voici mon code:
var gesture = default(GestureSample);
while (TouchPanel.IsGestureAvailable)
gesture = TouchPanel.ReadGesture();
if (gesture.GestureType == GestureType.VerticalDrag)
{
if (gesture.Delta.Y < 0)
return new RotateLeftCommand(_gameController);
if (gesture.Delta.Y > 0)
return new RotateRightCommand(_gameController);
}
if (gesture.GestureType == GestureType.HorizontalDrag)
{
if (gesture.Delta.X < 0)
return new RotateLeftCommand(_gameController);
if (gesture.Delta.X > 0)
return new RotateRightCommand(_gameController);
}
J'ai déplacé l'ensemble de ce code dans un seul bloc pour les besoins de cet exemple. Le RotateRightCommand ou RotateLeftCommand qui est retourné est exécuté par le code appelant, qui fait tourner l'objet sur l'écran. L'ensemble de ce bloc de code est exécuté dans la mise à jour en boucle dans monogame. Je pense que je suis absent quelque chose en termes de réinitialisation de la saisie tactile et c'est pourquoi je me fais 3 ou 4 RotateCommands retourné pour une traînée. Ce que je fais mal?
OriginalL'auteur Kevin Holditch | 2013-02-02
Vous devez vous connecter pour publier un commentaire.
Edit: Vous n'êtes pas à l'aide de gestes correctement ici. Un geste de glissement est générée à chaque fois qu'un doigt se déplace à travers l'écran. Si vous déplacez votre doigt d'un côté de l'écran à l'autre (Très rapidement), vous allez obtenir un grand nombre de petites glisser gestes. C'est de cette façon XNA et MonoGame travail.
C'est la logique que vous cherchez:
Si vous préférez faire des gestes, il vous suffit de faire ceci:
De toute façon va vous donner le comportement que vous cherchez. Vous avez encore besoin de mettre de la logique à l'intérieur de la boucle, comme je l'ai dit dans le post original, parce que vous pouvez avoir plusieurs gestes en file d'attente, et vous ne voulez pas de supposer que le dernier de la pile est de le faire glisser. (Merci à multitouch, vous pouvez avoir traîne, robinets, faites glisser complet, etc).
Je ne suis pas sûr à 100% si c'est votre problème... mais votre logique est faux ici. Le CodeFormatting patron est en train de me battre ici, mais il devrait être plus comme ceci:
En ne mettant pas l'écran Tactile.ReadGesure() à l'intérieur d'une boucle, vous êtes seulement à la lecture d'un gesure par image. La disposition des gestes sont mis dans une file d'attente, et n'a retiré que lorsque ReadGesture() est appelée. Par conséquent, si votre framerate hoquet, ou si vous ne pouvez pas lire un geste aussi rapide que vous le système d'exploitation peut le lire (ce Qui est très possible), vous travaillerez avec les anciennes informations. Vous pouvez voir que ici. Pour cette application, je vous suggère de prendre chaque geste, et en les combinant en un seul ou deux, puis de décider ce que vous devez faire sur cette base.
Il vous manque quelque chose. À la fois le geste de lecture et de traitement doit être dans la même boucle while. Ce que le code que vous avez posté n'est lu gestes jusqu'à ce qu'il n'est plus disponible, alors le processus de la dernière lecture. Si il y avait 3 gestes dans la file d'attente, vous jetterais les deux premières, puis de traiter la troisième. Ce que vous devez faire, c'est la lecture de la première, de la traiter. Lire le deuxième, processus, etc. Vous êtes de jeter des données, qui peut facilement être une partie du problème. Edit: sur Quelle plateforme vous travaillez avec? J'ai écrit beaucoup de MonoGame du code d'entrée et peuvent jeter un oeil sur elle.
En fait, je connais le problème. Je vais modifier ma réponse.
Merci beaucoup pour votre aide de Rayons qui les a triées. Le problème était comme vous l'avez justement fait ma mauvaise compréhension de la façon dont les gestes travaillé. J'ai pensé qu'il ne serait que de vous donner les gestes complets. Le problème que je voyais était qu'une longue traînée a été interprétés comme des 3 ou 4 plus petits traîne comme vous l'avez dit. Je n'étais pas au courant que vous avez le code pour cela. Je vous remercie beaucoup pour votre aide.
J'ai juste essayé de brancher ce code et je vais avoir un problème, parce que le Delta est toujours de 0, 0 pour les DragComplete événement. Je suis donc avoir à se souvenir de l'événement avant et à l'utilisation de la delta. Je ne sais pas si c'est volontaire ou pas, donc je pensais que je serais point.
OriginalL'auteur RayBatts
Je suppose que cela dépend de ce que vous considérez comme une traînée. MonoGame et XNA envisager la détection de changement de saisie tactile d'une mise à jour à la prochaine glisser la souris. Donc, si vous pensez que vous recevrez un Geste partir du moment où vous touchez votre doigt à l'écran jusqu'à ce que vous l'enlever, ce serait incorrect de XNA et MonoGame termes. Le Geste qui revient est le Delta de T-1 à T, où T est Maintenant et T-1 est l'appel précédent de mise à Jour.
Essayez d'inclure vos "si" la ", tandis que" avec la ReadGesture(). J'ai vu de meilleurs résultats. Toutefois, cela ne fonctionne toujours pas attendre jusqu'à ce que vous vous êtes fait glisser. VerticalDrag et HorizontalDrag sont juste des versions limitées de FreeDrag et donc vous aurez de multiples gestes si vous faites un glisser le long de l'écran.
OriginalL'auteur borrillis