Table of Contents

鼠标

初级 程序员

**鼠标(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)。

Tip

要获取屏幕的实际尺寸,请访问 IPointerDevice.SurfaceSize。例如:

var surfaceSize = Input.Mouse.SurfaceSize;

查询鼠标按钮状态变化

你可以使用鼠标按钮在项目中触发动作。例如,在第一人称射击游戏中,左键通常用于射击。

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

另请参阅