簡體   English   中英

在Monogame中用鼠標實現拖放

[英]Implement drag and drop with mouse in Monogame

我正在嘗試在測試應用程序中實現一些窗口,現在我正在嘗試使這些窗口能夠拖動。

檢查那個很棒的插圖,看看我要做什么,以及實際發生了什么: 在此處輸入圖片說明

首先,我檢查鼠標位置是否在窗口頂部,以及是否按住鼠標左鍵,在這里:

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

有時結果確實很奇怪,例如窗口跳到隨機位置,但通常結果如上圖所示。 當我單擊並按住並非常緩慢地移動鼠標時,窗口將立即移動到鼠標的位置。

我不知道這個。

我會做那樣的事...

類字段:

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...
}

我找到了問題所在。 我錯誤地將窗口移到mousePosition.X - deltaX但是我應該將window.Rectangle.X - deltaX

基本上,我是根據鼠標的位置偏移窗口。 但是,正確的方法是根據窗口的位置來偏移窗口。

這是固定電話。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM