C#平滑对象移动

标签 c# transition smoothing keyframe

我拥有通过 C# 代码移动和单击鼠标所需的所有代码,但我不想只将鼠标位置设置为 XY;那会看起来生涩。相反,我希望在 Z 秒内从点 X1, Y1 平滑过渡到点 X2, Y2。类似于关键帧。

我正在寻找与此类似的方法:

public void TransitionMouse(int x, int y, double durationInSecs)

它会在 durationInSecs 秒内将鼠标从当前位置平滑移动到 xy。我有一个函数叫做:

public void MoveMouse(int x, int y)

立即将鼠标移动到xy


编辑

感谢大佬们的帮助!这是完成并经过测试的代码:

    [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));
        }
    }

最佳答案

您可以通过多种方式做到这一点。一种选择是计算每帧移动鼠标所需的矢量,并在一段时间内将其应​​用于鼠标位置。

因此,如果我们在位置 5,5 并希望在 10 帧内移动到 20,30,我们的向量将如下所示:

val = (target - start)/frames;

x = (20 - 5)/10; y = (30 - 5)/10;

矢量 = 1.5,2.5

然后,在您的 TransitionMouse 方法中,您可以在您希望的任何持续时间内将矢量缓慢地应用于鼠标位置,使用 Thread.Sleep 方法来控制速度。代码可能如下所示:

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);
    }
}

另一种方法是使用 Bresenhams algorithm计算鼠标光标将移动经过的所有点,然后遍历每个点并使用 Thread.Sleep 再次将其应用于光标以保持时间正确。

史蒂夫

关于C#平滑对象移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015488/

相关文章:

javascript - 为什么 CSS 转换在页面加载时不起作用?

javascript - 在 HTML 中使用 Node.js 模块

R包用于简单内核平滑吗?

c# - 使用非单向方法的 WCF 中的竞争条件

ios - [CALayer 保留] : message sent to deallocated instance?

CSS margin-left 过渡不起作用

c++ - OpenGL 平滑多边形

c# - 让 BLToolkit 与 MySQL 一起工作

c# - .Net开源网格计算库

c# - 在解析期间确定依赖项的目标类型