C # mouvement objet lisse
-
26-09-2019 - |
Question
J'ai tout le code nécessaire pour se déplacer et cliquez sur la souris via le code C #, mais je ne veux pas simplement régler la position de la souris pour X
et Y
; qui se penchera saccadée. Au lieu de cela, je veux avoir une transition en douceur du point X1, Y1
au point X2, Y2
secondes sur Z. Similaire à keyframing.
Je suis à la recherche d'une méthode similaire à ceci:
public void TransitionMouse(int x, int y, double durationInSecs)
Il va juste déplacer la souris en douceur de sa position actuelle à x
et y
en secondes durationInSecs
. J'ai une fonction appelée:
public void MoveMouse(int x, int y)
Cela déplace la souris à x
, y
immédiatement.
EDIT
Merci pour l'aide les gars! Voici le fini et testé, code:
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
public void TransitionMouseTo(double x, double y, double durationSecs)
{
double frames = durationSecs*100;
PointF vector = new PointF();
PointF mousePos = Cursor.Position;
vector.X = (float)((x - mousePos.X) / frames);
vector.Y = (float)((y - mousePos.Y) / frames);
for (int i = 0; i < frames; i++)
{
SetCursorPos((int)(mousePos.X += vector.X), (int)(mousePos.Y += vector.Y));
Thread.Sleep((int)((durationSecs / frames) * 1000.0));
}
}
La solution
Vous pouvez le faire de plusieurs façons. Une option serait de calculer le vecteur nécessaire pour déplacer la souris à chaque image et l'appliquer sur la période de temps à la position de la souris.
Alors, si nous sommes en position 5,5 et que vous souhaitez passer à 20,30 plus de 10 cadres, notre vecteur serait le suivant:
val = (cible - début) / trames;
x = (20-5) / 10; y = (30 - 5) / 10;
Vecteur = 1.5,2.5
Ensuite, dans votre méthode de TransitionMouse, vous appliquez le vecteur à la position de la souris lentement sur quelque durée que ce que vous souhaitez, en utilisant la méthode Thread.Sleep pour contrôler la vitesse. Le code pourrait ressembler à ceci:
public void TransitionMouseTo(int x, int y, int durationSecs)
{
int frames = 10;
PointF vector = new PointF();
vector.X = (x - Cursor.Position.X) / frames;
vector.Y = (y - Cursor.Position.Y) / frames;
for (int i = 0; i < frames; i++)
{
Point pos = Cursor.Position;
pos.X += vector.X;
pos.Y += vector.Y;
Cursor.Position = pos;
Thread.Sleep((durationSecs / frames) * 1000);
}
}
Une autre façon de le faire serait d'utiliser Bresenhams algorithme pour calculer tous les points le curseur de la souris se déplace à travers puis une boucle sur chaque point et l'appliquer à nouveau le curseur à l'aide Thread.Sleep pour maintenir le bon timing.
Steve
Autres conseils
vraiment dépend de votre définition de douceur, mais la plupart algorithme de mouvement utilisation spline « lisse » pour interpoler entre 2 ou plusieurs points de données.
cela pourrait aider http://geekswithblogs.net /JuanDoNeblo/archive/2007/10/25/Data-Interpolation-with-SPLINE-in-Csharp.aspx