鼠标
初级 程序员
**鼠标(Mouse)**是桌面游戏常见的输入设备。
Stride 中有两种处理鼠标输入的方式:
- 查询鼠标按钮状态。
- 对于面向移动设备的跨平台游戏,你可以使用 PointerEvent 列表。 更多信息请参见指针。
你可以在 Input manager 中访问鼠标按钮状态和指针事件列表。
| 类 | 项目类型 | 何时使用 |
|---|---|---|
| InputManager | 仅桌面 | 对于桌面游戏,通常需要处理多个鼠标按钮的输入,因此应使用鼠标按钮状态。 |
| PointerEvent | 跨平台 | 对于移动游戏,通常只用左键模拟指针,因此可以把鼠标输入当作指针来处理,无需创建单独的鼠标专用控件。更多信息请参见指针。 |
有关这些选项的更多信息,请参见输入概述。
检查鼠标是否可用
处理鼠标输入之前,请使用 Input.HasMouse 检查是否连接了鼠标。
获取鼠标位置
你可以以归一化坐标或绝对坐标获取鼠标位置。
归一化坐标
@'Stride.Input.InputManager.MousePosition' 以归一化的 X、Y 坐标返回鼠标指针位置,而不是以像素为单位的实际屏幕尺寸。这意味着指针位置可适配任何分辨率,你无需为不同分辨率编写单独的代码。
- (0,0):指针位于屏幕左上角
- (1,1):指针位于屏幕右下角
绝对坐标
InputManager.AbsoluteMousePosition 以绝对 X、Y 坐标(以像素为单位的实际屏幕尺寸)返回鼠标指针位置。例如,如果指针位于屏幕左上角,值为 (0,0);如果指针位于右下角,值取决于屏幕分辨率(例如 1280, 720)。
查询鼠标按钮状态变化
你可以使用鼠标按钮在项目中触发动作。例如,在第一人称射击游戏中,左键通常用于射击。
Input manager 有若干方法可以检查鼠标按钮的状态(按下、按下保持_或_释放):
| 方法 | 说明 |
|---|---|
| HasDownMouseButtons | 检查当前是否有一个或多个鼠标按钮处于按下状态。 |
| HasPressedMouseButtons | 检查上次更新中是否有一个或多个鼠标按钮被按下。 |
| HasReleasedMouseButtons | 检查上次更新中是否有一个或多个鼠标按钮被释放。 |
| IsMouseButtonDown (MouseButton) | 检查指定的鼠标按钮当前是否处于按下状态。 |
| IsMouseButtonPressed (MouseButton) | 检查指定的鼠标按钮在上次更新中是否被按下。 |
| IsMouseButtonReleased (MouseButton) | 检查指定的鼠标按钮在上次更新中是否被释放。 |
鼠标增量
使用 InputManager.MouseDelta 可以归一化坐标获取自上次更新以来鼠标位置的变化。你可以用它来分析鼠标移动的速度和方向。
鼠标滚轮增量
你可以使用鼠标滚轮在项目中触发动作。例如,在第一人称射击游戏中,滚动鼠标滚轮可以切换武器或缩放摄像机。
当用户向前滚动时,InputManager.MouseWheelDelta 返回正值;向后滚动时返回负值。值为 0 表示没有移动。
锁定鼠标位置
在某些项目中,用户需要将鼠标光标移出屏幕边界。例如,第一人称射击游戏通常需要 360 度摄像机旋转。这种情况下,你可能还希望隐藏鼠标光标。
你可以使用以下属性和方法锁定鼠标位置并隐藏光标:
| 方法或属性 | 说明 |
|---|---|
| LockMousePosition(Boolean) | 锁定鼠标位置,直到下一次调用 UnlockMousePosition() 事件。 |
| UnlockMousePosition() | 解除 LockMousePosition(Boolean) 事件锁定的鼠标位置。 |
| IsMousePositionLocked | 检查鼠标位置是否被锁定。 |
Tip
你可以通过 GameWindow.IsMouseVisible 获取或设置鼠标的可见性。
示例代码
public class MouseInputScript : SyncScript
{
public override void Update()
{
//如果本次更新中按下了左键,则执行某些操作
if (Input.IsMouseButtonDown(MouseButton.Left))
{
}
//如果自上次更新以来按下了中键,则执行某些操作
if (Input.IsMouseButtonPressed(MouseButton.Middle))
{
}
//如果鼠标在 X 方向上移动超过屏幕尺寸的 0.2 个单位,则执行某些操作
if (Input.MouseDelta.X > 0.2f)
{
}
}
}