【问题标题】:Implement drag and drop with mouse in Monogame在 Monogame 中实现鼠标拖放
【发布时间】:2015-09-10 06:50:32
【问题描述】:

我正在尝试在我的测试应用中实现一些窗口,现在我正在尝试使这些窗口能够被拖动。

查看那张很棒的插图,看看我想要做什么,以及实际发生了什么:

首先,我检查鼠标位置是否在窗口顶部,以及是否按住鼠标左键,这里:

if (mouseOver && LastLeftPressed && MouseLeftPressed)
{
     onHoldClick(Events);
}

这是我尝试过的:

private static void onHold(object sender, EventArgs e)
{
    var LastMouse = mousePosition;
    mousePosition = Mouse.GetState().Position;
    var window = sender as Window;
    if (LastMouse != mousePosition)
    {
        var deltaX = mousePosition.X - LastMouse.X;
        var deltaY = mousePosition.Y - LastMouse.Y;
        window.Rectangle = new Rectangle(mousePosition.X - deltaX, mousePosition.Y - deltaY, Width, Height);
    }
}

有时候结果真的很奇怪,比如窗口跳转到随机位置,但通常结果如上图所示。当我点击'n'按住并缓慢移动鼠标时,窗口会立即移动到鼠标的位置。

我想不通。

【问题讨论】:

  • deltaX 和 deltaY 计算被翻转。这对我来说似乎不对?
  • 是的。当它不起作用时,我正在测试可能的组合,然后忘记更改它。正确的应该是mousePosition - LastMouse 和矩形设置为window.Rectangle + delta
  • 编辑得更容易理解。谢谢,@craftworkgames

标签: c# xna monogame


【解决方案1】:

我会做这样的事情......

类字段:

private object grabbedObject;
private Vector2 grabOffset;
private MouseState mouseState; // update each Update() call

当鼠标按下时:

Vector2 mousePosition = new Vector2(this.mouseState.X, this.mouseState.Y);
Vector2 objectPosition = Vector2.Zero;
this.grabbedObject = GetClickedObject(mousePosition, out objectPosition);
if (this.grabbedObject != null)
{
    this.grabOffset = new Vector2(
        mousePosition.X - objectPosition.X,
        mousePosition.Y - objectPosition.Y);
}

private object GetClickedObject(Vector2 pMousePosition, out Vector2 pObjectPosition)
{
    Object clickedObject = null;
    // search first object you clicked on and set to clickedObject  
    pObjectPosition = clickedObject == null ? Vector2.Zero : clickedObject.Position;

    return clickedObject;
}

当鼠标按钮向上时:

if (this.grabbedObject != null)
{
    // process drop action

    this.grabbedObject == null;
    this.grabOffset = Vector2.Zero;
}

绘制时:

if (this.grabbedObject != null)
{
    Vector2 position = new Vector2(
        this.mouseState.X - this.grabOffset.X,
        this.mouseState.Y - this.grabOffset.Y);
    // and so on...
}

【讨论】:

    【解决方案2】:

    我找到了问题所在。我错误地将窗口移动到mousePosition.X - deltaX,但我应该这样做window.Rectangle.X - deltaX

    基本上,我是根据鼠标的位置偏移窗口;但是,正确的方法是根据自己的位置偏移窗口。

    这里是固定线路。

    window.Rectangle = new Rectangle(window.Rectangle.X + deltaX, window.Rectangle.Y + deltaY, Width, Height);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多