Texture2D 坐标未显示在正确位置
Texture2D Coordinates Not Displaying In Proper Location
我一直在使用 SpriteBatch.Draw() 渲染一些自定义 "buttons"。但是今天我意识到我应该在其上绘制按钮的坐标与我的鼠标声称它们正在呈现的坐标不一致。这是一个问题,因为如果图形渲染关闭,则很难检测按钮是否被单击。另一种可能是鼠标坐标关闭。怎么了?
如果您需要更多信息,请询问。谢谢!
硬编码按钮位置:
/// <summary>
/// The x position at which the left part of the buttons on the main menu begin.
/// </summary>
public static readonly int ButtonX = 20;
/// <summary>
/// How wide the buttons are.
/// </summary>
public static readonly int ButtonWidth = 200;
/// <summary>
/// How tall the buttons are.
/// </summary>
public static readonly int ButtonHeight = 50;
/// <summary>
/// The y position of the top of the new game button.
/// </summary>
public static readonly int NewGameButtonY = 100;
/// <summary>
/// The y position of the top of the new game button.
/// </summary>
public static readonly int QuitButtonY = 200;
获取鼠标位置的方法:
int x = Mouse.GetState().X;
int y = Mouse.GetState().Y;
按钮的呈现方式:
private static void DrawButton(MonoButton button, ref SpriteBatch spBatch)
{
if (button.Visible)
{
spBatch.Draw(button.Image, button.DrawingBounds, colorMask);
RenderingPipe.DrawString(MainMenuLayout.MainMenuFont, button.Text, button.DrawingBounds, Alignment.Center, colorMask, ref spBatch);
}
}
SOMETHING 的视觉显示:
新游戏按钮的左上角应该是(20, 100)。
编辑:我的笔记本电脑的原始分辨率是 1920x1080,但游戏的显示分辨率肯定低于全屏模式下的分辨率。
编辑 #2:我后来意识到,虽然鼠标偏移有效,但将单游戏 window 分辨率简单地设置为显示器的原始分辨率要容易得多。这完全解决了没有鼠标偏移的问题。
您的鼠标报告的坐标是光标的中心,而不是指针的尖端。
要理解原因,请考虑一个人的鼠标是另一个人的触摸屏。
您可以对按钮的点击框应用轻微偏移,但最好只偏移从 GetState 获得的坐标并将其封装到 属性:
int offsetX = 3, offsetY = 2;
MouseState _currentState; // assume this is set by main game loop every call to Update()
int MousePositionX => _currentState.X + offsetX;
int MousePositionY => _currentState.Y + offsetY;
确切的偏移量可能取决于多种因素,包括无意中的坐标转换或现有 Button 组件中的偏移(检查边界框计算),因此可能需要反复试验才能立即解决。如果这样做,请确保在不同的分辨率、DPI 和 HID(人机界面设备,也称为鼠标、触摸、游戏手柄输入)下进行测试
如果确实需要动态计算,您可能会考虑查询环境以获取有关光标图标(如果有)的信息的方法。毕竟,指针并不是人们使用的唯一游标!
我一直在使用 SpriteBatch.Draw() 渲染一些自定义 "buttons"。但是今天我意识到我应该在其上绘制按钮的坐标与我的鼠标声称它们正在呈现的坐标不一致。这是一个问题,因为如果图形渲染关闭,则很难检测按钮是否被单击。另一种可能是鼠标坐标关闭。怎么了?
如果您需要更多信息,请询问。谢谢!
硬编码按钮位置:
/// <summary>
/// The x position at which the left part of the buttons on the main menu begin.
/// </summary>
public static readonly int ButtonX = 20;
/// <summary>
/// How wide the buttons are.
/// </summary>
public static readonly int ButtonWidth = 200;
/// <summary>
/// How tall the buttons are.
/// </summary>
public static readonly int ButtonHeight = 50;
/// <summary>
/// The y position of the top of the new game button.
/// </summary>
public static readonly int NewGameButtonY = 100;
/// <summary>
/// The y position of the top of the new game button.
/// </summary>
public static readonly int QuitButtonY = 200;
获取鼠标位置的方法:
int x = Mouse.GetState().X;
int y = Mouse.GetState().Y;
按钮的呈现方式:
private static void DrawButton(MonoButton button, ref SpriteBatch spBatch)
{
if (button.Visible)
{
spBatch.Draw(button.Image, button.DrawingBounds, colorMask);
RenderingPipe.DrawString(MainMenuLayout.MainMenuFont, button.Text, button.DrawingBounds, Alignment.Center, colorMask, ref spBatch);
}
}
SOMETHING 的视觉显示:
新游戏按钮的左上角应该是(20, 100)。
编辑:我的笔记本电脑的原始分辨率是 1920x1080,但游戏的显示分辨率肯定低于全屏模式下的分辨率。
编辑 #2:我后来意识到,虽然鼠标偏移有效,但将单游戏 window 分辨率简单地设置为显示器的原始分辨率要容易得多。这完全解决了没有鼠标偏移的问题。
您的鼠标报告的坐标是光标的中心,而不是指针的尖端。
要理解原因,请考虑一个人的鼠标是另一个人的触摸屏。
您可以对按钮的点击框应用轻微偏移,但最好只偏移从 GetState 获得的坐标并将其封装到 属性:
int offsetX = 3, offsetY = 2;
MouseState _currentState; // assume this is set by main game loop every call to Update()
int MousePositionX => _currentState.X + offsetX;
int MousePositionY => _currentState.Y + offsetY;
确切的偏移量可能取决于多种因素,包括无意中的坐标转换或现有 Button 组件中的偏移(检查边界框计算),因此可能需要反复试验才能立即解决。如果这样做,请确保在不同的分辨率、DPI 和 HID(人机界面设备,也称为鼠标、触摸、游戏手柄输入)下进行测试
如果确实需要动态计算,您可能会考虑查询环境以获取有关光标图标(如果有)的信息的方法。毕竟,指针并不是人们使用的唯一游标!