用鼠标移动物体?
Posted
技术标签:
【中文标题】用鼠标移动物体?【英文标题】: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);
我认为这主要是由于我设置 X
和 Y
值的方式。我在这里做的数学是正确的还是导致我的问题的原因是什么?我选择这样写是因为我不希望纹理的原点(0, 0: top, left)跳转到鼠标位置,而是用鼠标从当前位置平滑移动。
清晰度
我分配X
和Y
的数学运算是否正确?
是:还有什么可能导致此跳跃?
否:正确的数学是什么?
在调试和尝试不同的方法时,我了解到:
将Position
设置为仅e.X,Y
可提供流畅的移动。
但是,这会跳转到不需要的鼠标位置。
【问题讨论】:
【参考方案1】:拖动过程阶段:
从 MouseDown 开始:
- 检查对象是否被触摸
- 记住ObjectPos0
, MousePos0
- 设置isDragging
标志(表示 MouseDown 在对象上)
在鼠标移动时(如果 isDragging
):
- ObjectPos = ObjectPos0 + (MousePos - MousePos0)
- 重绘
在 MouseUp 上(如果 isDragging
):
- 修复最终位置
- 做需要的工作
- 清除isDragging
标志
【讨论】:
以上是关于用鼠标移动物体?的主要内容,如果未能解决你的问题,请参考以下文章