【问题标题】:Moving object with mouse?用鼠标移动物体?
【发布时间】:2019-04-04 22:24:21
【问题描述】:

我目前正在尝试在 SharpDX 中移动 2D 纹理。我可以成功地移动它,但它每隔几帧就会跳跃很多。例如,如果我从底部、从右到顶部、向左拖动,我会偶尔跳转,图像的原点位于底部 75% 的右侧,然后在几帧后返回到它的位置。在我看来这很奇怪,我认为这可能是由于事件或鼠标位置。

我正在通过表单上的 MouseMove 事件更新纹理的位置:

private void MouseMove(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        testSprite.Position = new Vector2(e.X - testSprite.Position.X,
                                          e.Y - testSprite.Position.Y);
    }
}

我认为这主要是由于我设置 XY 值的方式。我在这里做的数学是正确的还是导致我的问题的原因是什么?我选择这样写是因为我不希望纹理的原点(0, 0: top, left)跳转到鼠标位置,而是用鼠标从当前位置平滑移动。


清晰度

  • 我分配XY 的数学运算是否正确?
    • 是:还有什么可能导致此跳跃
    • 否:正确的数学是什么?

在调试和尝试不同的方法时,我了解到:

  • Position 设置为仅e.X,Y 可提供流畅的移动。
    • 但是,这会跳转到不需要的鼠标位置。

【问题讨论】:

    标签: c# math drag-and-drop mouseevent draggable


    【解决方案1】:

    拖动过程阶段:

    从 MouseDown 开始:
    - 检查对象是否被触摸
    - 记住ObjectPos0, MousePos0
    - 设置isDragging 标志(表示 MouseDown 在对象上)

    在鼠标移动时(如果 isDragging):
    - ObjectPos = ObjectPos0 + (MousePos - MousePos0)
    - 重绘

    在 MouseUp 上(如果 isDragging):
    - 修复最终位置
    - 做需要的工作
    - 清除isDragging 标志

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      相关资源
      最近更新 更多