2013-06-02 1 views
0

Avec flash et AS3, il semble y avoir un problème avec l'événement de déplacement de la souris en mode plein écran et mouseLock activé que je ne comprends pas comment résoudre.as3: événement mouse_move en mode plein écran et mouseLock sur les mouvements lents de la souris

Quand je rentre en mode plein écran avec Stage.mouseLock propriété enabled et je fais des mouvements très lents avec la souris, les deux propriétés pour déterminer l'emplacement de la souris (MouseEvent.movementX et MouseEvent.movementY) retour à zéro (0).

Une impression de l'événement event.toString() retours:

[MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=2 localX=0 localY=0 stageX=0 stageY=0 relatedObject=null ctrlKey=false altKey=false shiftKey=false buttonDown=false delta=0] 

« La souris peut être déplacé pour autant que je veux toujours retourner 0 pour x et y, si la souris sont déplacés très lent, il est donc impossible de déterminer le mouvement de la souris. " (*) Après un meilleur test j'ai ajouté une correction de cette phrase, ci-dessous dans la "Note". C'est très étrange parce que l'événement est déclenché correctement lorsque la souris est déplacée (aussi avec des mouvements lents), mais le mouvement de retour est 0. On dirait que le mouvement est < 1 mais les mouvements sont seulement des nombres entiers, donc les valeurs sont toujours retourné 0.

J'ai essayé également de changer les paramètres de la souris de OS (Mac OSX) sans succès.

Si vous voulez, je peux vous donner un exemple de code à entrer en mode plein écran et activer les propriétés Stage.mouseLock.

Nous vous remercions de votre suggestion.


Note:

Après avoir testé mieux que j'ai trouvé que flash player (ma version de flash player est 11,7,700,203) a un comportement qui ressemble à un bug: si le mouvement de la souris actuelle (movementX et movementY) est égal au mouvement précédent, que le retour flash movementX=0 et movementY=0. Le prochain mouvement de la souris sera la valeur correcte car elle sera différente de zéro. Pour cette raison, avec un mouvement constant toujours dans la même direction (avec un mouvement très lent est plus facile à reproduire), le joueur montre des "valeurs zéro" tous les deux événements tirés.

At this link vous pouvez tester un exemple de travail (plus rapide que le code vous-même un exemple).

Si le comportement que j'ai trouvé est correct, qu'il est facile de modifier le code pour rectifier ce problème, de toute façon, à mon humble avis, il reste un bug. Je vais le signaler à Adobe.

At this other link (merci à @nemostein) il y a un autre exemple de travail.

J'essaie de mieux m'expliquer: si vous déplacez le curseur très lentement (c'est-à-dire dans la bonne direction), vous recevrez la sortie Movement(X:1 Y:0) lorsque vous déplacez le curseur suffisamment. Si vous déplacez à nouveau le curseur assez à droite, vous recevrez la sortie Movement(X:0 Y:0).Si vous répétez les micro-mouvements, vous allez recevoir le rapport de mouvements toujours avec ce modèle: (x:1,y:0),(x:0,y:0),(x:1,y:0),(x:0,y:0)... au lieu de (x:1,y:0),(x:1,y:0),(x:1,y:0)...

Je pense qu'il est faux de recevoir un mouvement comme (x:0,y:0) me semble que ces valeurs sont renvoyées chaque fois que vous faites un mouvement est égal (à la fois le x et le y) à votre mouvement précédent.

J'espère que cela est compréhensible.

+0

Exemple de code est toujours utile, s'il vous plaît envisager de l'inclure. Ces problèmes disparaissent-ils si vous n'êtes pas en plein écran ou si la propriété 'mouseLock' n'est pas activée? –

+0

Ceci est ma première question en stackoverflow, merci pour la suggestion. J'ai vu que le problème est lié uniquement aux propriétés 'motionX' et' motionY' et n'est pas lié à 'mouseLock' défini sur false. J'ai ajouté une note dans ma question qui, je pense, explique correctement le problème et propose une solution. Vous pouvez utiliser [ce lien] (http://inflagrantedelicto.memoryspiral.com/2012/07/as3-quickie-mouse-lock-and-relative-mouse-coordinates/) pour tester ma découverte. – Rancid

Répondre

0

Il n'y a pas de bug, mais le MouseEvent.movementX/Y (aux côtés de MouseEvent.localX/Y et MouseEvent.stageX/Y) sont un peu trompeuses ...
Bien qu'ils soient Number s, pas int s, il n'y a pas une telle chose comme « demi-pixel », de sorte qu'ils signale toujours les valeurs int.

La précision que vous recherchez (par exemple: movementX == 0.75) ne peut pas être atteinte.

Je ne pouvais pas reproduire le comportement que vous avez décrit à la note ("mouvement de la souris actuelle est égal à la précédente") et here is a working example de Stage.mouseLock = true et .

Notez que si vous déplacez le curseur très lentement, vous finirez par recevoir un MouseEvent.movementX/Y == 1 (lorsque vous avez déplacé le curseur suffisamment).

+0

Désolé pour mon anglais. Dans votre exemple de travail, je peux voir le même problème. Comme vous l'avez dit si vous déplacez le curseur très lentement (c'est-à-dire dans la bonne direction), vous recevrez la sortie 'Mouvement (X: 1 Y: 0)' lorsque vous déplacez le curseur suffisamment. Si vous déplacez à nouveau le curseur assez à droite, vous recevrez la sortie 'Mouvement (X: 0 Y: 0)'. Si vous répétez les micro-mouvements, vous recevrez le rapport des mouvements toujours avec ce modèle: '(x: 1, y: 0), (x: 0, y: 0), (x: 1, y: 0), (x: 0, y: 0) ... 'au lieu de' (x: 1, y: 0), (x: 1, y: 0), (x: 1, y: 0) ... ' – Rancid

+0

I Je ne cherche pas un mouvement avec une précision non entière (par exemple: '0.75'). Je pense qu'il est correct de recevoir des valeurs entières, mais je pense qu'il est faux de recevoir un mouvement comme '(x: 0, y: 0)'. Ces valeurs ne sont renvoyées (il me semble) que lorsque vous faites un mouvement égal à votre mouvement précédent. J'espère que cela est compréhensible. – Rancid

+0

Désolé, je ne sais pas comment vous aider dans cette affaire. Je n'ai pas pu reproduire ce motif "1,0,1,0". Pour moi c'est comme "0,1,1,1". J'ai mis à jour mon exemple de travail pour tenir compte des fois où 'MouseEvent' est distribué. – NemoStein

Questions connexes