[英]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.