2010-10-28 9 views
0

Je crée une animation interactive d'un chat, vous pouvez caresser, frotter, pousser, etc.geste Actionscript 3.0 suivi

J'ai mis en œuvre certaines fonctions de base pour tenter de reconnaître les différents gestes, je me sers de la souris vers le bas et souris des événements pour suivre la durée et la distance du clic. Mon problème avec ceci est que la 'distance' est mesurée à partir du point de départ et du point final du clic, donc si elle se termine près de là où elle a commencé, vous ne serez pas capable de dire combien de fois le clic a ' frotté 'd'avant en arrière.

Est-il possible de suivre la distance en fonction du chemin complet du clic? Mon code est ci-dessous, est-ce que quelqu'un a des suggestions?

this.stage.addEventListener(MouseEvent.MOUSE_DOWN, pressed); 
this.stage.addEventListener(MouseEvent.MOUSE_UP, released); 

var firsttime:Number; 
var lasttime:Number; 
var firstx:Number; 
var lastx:Number; 
var firsty:Number; 
var lasty:Number; 
var duration:Number; 
var distance:Number; 

function pressed(e:MouseEvent):void { 
    firsttime = new Date().getTime(); 
    firstx = mouseX; 
    firsty = mouseY; 
    trace("mouse down"); 
} 

function released(e:MouseEvent):void { 
    lasttime = new Date().getTime(); 
    lastx = mouseX; 
    lasty = mouseY; 
    duration = lasttime - firsttime; 
    distance = pythagoras((firstx-lastx), (firsty-lasty)); 
    trace("mouse up"); 
    trace(duration); 
    trace(distance); 
    trace(gesture(duration, distance)); 
} 

function pythagoras(xlen:Number, ylen:Number):Number { 
    return Math.sqrt((xlen*xlen) + (ylen*ylen)); 
} 

function gesture(duration:Number, distance:Number):String { 
    if (distance < 1){ 
     if (duration < 200){ 
      return "Sharp Poke"; 
     } 
     return "Slow Poke"; 
    } 
    if (duration < 500) { 
     return "Stroke"; 
    } 
    return "Rub"; 
} 

Répondre

0

A partir des données que vous recueillez il n'y a aucun moyen de savoir ce qui se passe. Fondamentalement, vous n'avez pas d'autres données que [position de départ + heure] et [position de fin + heure]

vous aurez besoin de rassembler l'emplacement de la souris tout au long du geste.

créer un événement chronométré chaque fois que la souris est vers le bas (et détruire après la mise de la souris) à un intervalle de 50 ms (juste une supposition, vous devez jouer avec cela)

chaque fois que les feux de minuterie et la souris est en bas enregistrer l'emplacement (et le temps si la vitesse est importante)

puis à la souris d'analyser les données dans le tableau. vous pouvez même faire une dérivée des données pour x et y pour voir s'il y a eu un changement de direction.

bonne chance

0

est le lien ici qui peuvent vous aider à résoudre votre problème

http://www.bytearray.org/?p=91

+0

J'ai vu toutes ces classes de gestes pour l'alphabet, etc. Ce n'est pas ce que je suis après. Je suis après quelque chose de beaucoup plus simple, j'ai juste besoin de savoir si la direction de la «traînée» a changé. – Rumpleteaser

+0

Je ne veux pas alourdir l'animation avec du code supplémentaire inutile. Il sera très lourd et doit pouvoir rester en place pendant une journée entière sans s'écraser. – Rumpleteaser