跳至内容

使用 XNA 创建游戏/基础知识/输入设备

来自维基教科书,开放世界中的开放书籍

输入设备

[编辑 | 编辑源代码]

输入设备是游戏创建手册中最重要的章节之一。电脑(或 Xbox)游戏依赖于与用户的交互 - 这就是为什么需要一种方法来检查用户输入并让游戏对该输入做出反应。

XNA 使得控制用户设备变得非常容易。它提供了一个易于使用和理解的 API 来访问鼠标、键盘和游戏手柄。使用它,可以在短时间内编写用户交互方案。基本上,XNA 提供了对以下内容的轻松访问:

  • 鼠标
  • 键盘
  • 游戏手柄

所有控制器类型的基本概念都是相同的。XNA 提供了一组静态类(每种类型一个),这些类可用于检索输入设备的状态和所有属性(例如,按下按钮、移动等)。

这种检测通常位于游戏循环的 Update()-方法中,以尽可能频繁地检索状态。将所有输入设备的状态存储在类变量中,允许在其他方法和类中检查状态。在一个类中有一个布尔型变量数组来表示所有控制器的状态,即控制器上按下的按钮、鼠标移动和点击以及键盘上按下的键,这是一个常见的解决方案。

protected override void Update(GameTime gameTime)
{
    KeyboardState kbState = Keyboard.GetState();
    // ...
}

Windows 与 Xbox

[编辑 | 编辑源代码]

Windows 和 Xbox 游戏通常以不同的方式进行。通常,Windows 电脑由鼠标和键盘控制,而 Xbox 通常由游戏手柄控制。因此,需要一个控制结构来确定代码是在 Windows 上还是 Xbox 上执行,以便为游戏设置默认控制器。

#if XBOX
// this code is embedded only in xbox project
#endif

但也可以将鼠标或键盘连接到 Xbox,也可以将 Xbox 控制器连接到 Windows 电脑。因此,在大多数情况下,最好检查例如是否有游戏手柄连接。处理这个问题的另一种方法是将用户选择的控制器存储在一个变量中。因此,用户可以决定使用哪个控制器来玩您的游戏。

无线鼠标

首先,您必须通过调用 Mouse 类的静态 GetState()-方法来获取鼠标状态的实例。现在,这个对象可以让您访问连接鼠标的许多公共属性。

MouseState mouse = Mouse.GetState();
bool leftButton = (mouse.LeftButton == ButtonState.Pressed); // left mouse button
bool middleButton = (mouse.MiddleButton == ButtonState.Pressed); // middle mouse button
bool rightButton = (mouse.RightButton == ButtonState.Pressed); // right mouse button
int x = mouse.X; // horizontal mouse position
int y = mouse.Y; // vertical mouse position
int scroll = mouse.ScrollWheelValue; // scroll wheel value

通过属性“xxxButton”(其中 xxx 代表类型 - 左、中、右)读取鼠标按钮的状态。如果将此值与 ButtonState.Pressed 或 ButtonState.Released 进行比较,您就可以检索此按钮的状态。在上面的示例中,它将每个按钮的状态存储在一个布尔型变量中,如果关联的按钮被按下,该变量为 true。

屏幕上的鼠标位置存储在鼠标对象的 X 和 Y 属性中。此值始终为正(因为它从左上角的 0,0 开始),并且可以与其他鼠标位置(在游戏逻辑中)进行比较以检测鼠标的特定移动。一个简单的示例是:

MouseState mouse = Mouse.GetState();
int x = mouse.X;
int y = mouse.Y;
deltaX = oldX - x; // difference of horizontal positions
deltaY = oldY - y; // difference of vertical positions
oldX = x;
oldY = y;

大多数现代鼠标还具有滚轮,该滚轮通常用于游戏,例如缩放、滚动或在不同武器之间切换。ScrollWheelValue 属性是一个整数,代表鼠标的滚动状态。

要识别滚轮的移动,有必要存储一些旧值并将它们相互比较。该差异的符号指示滚动方向,绝对值指示滚动速度。

樱桃键盘

检查键盘上按键的状态非常简单。首先,您必须通过从 Keyboard 类调用静态方法 GetState 来获取 KeyboardState 对象。现在,此实例可以让您检索特定按键的状态。

KeyboardState keyboard = Keyboard.GetState();
bool keyB = keyboard.IsKeyDown(Keys.B); // key "B" on keyboard
bool keyArrowLeft = keyboard.IsKeyDown(Keys.Left); // arrow left on keyboard

布尔型变量 keyB 和 keyArrowLeft 现在存储“true”(如果特定按键当前被按下)或“false”(如果它没有被按下)。此方法可以重复用于应用程序或游戏中感兴趣的每个按键。

还可以直接获取当前按下键盘上所有按键的数组。调用 GetPressedKeys 方法将返回一个 Keys 数组,可以逐个键进行遍历。

KeyboardState keyboard = Keyboard.GetState();
Keys[] keys = keyboard.GetPressedKeys(); // array of keys

游戏手柄

[编辑 | 编辑源代码]

游戏手柄是在 Xbox 上玩游戏的最便捷方式。尽管 XNA 被设计用来开发 Windows 和 Xbox 游戏,但默认 API 只支持原始 Xbox 控制器。基于这个事实,您必须决定是强制您的用户使用(可能还要购买)Xbox 游戏手柄,还是想支持其他游戏手柄(例如来自罗技)。

这对于用户来说可能更舒适,但对于开发人员来说意味着更多的编码工作。在本章中,我想描述 Xbox 控制器和所有其他控制器的实现方法。

Xbox 游戏手柄

[编辑 | 编辑源代码]
Xbox 360 无线控制器

访问此输入设备几乎与检查鼠标或键盘的状态一样容易。一个(重要的)区别是,XNA 使得能够将多达四个不同的游戏手柄连接到 Xbox 或 Windows 电脑。

因此,有必要(通常)在一个循环中遍历连接的所有游戏手柄,以分别检查它们的状态。以下段落将解释如何执行此操作(以及更多操作)。

GamePadState[] gamePad = new GamePadState[4];
for(int i = 0; i < 4; i++) { // loop over up to 4 gamepads
    gamePad[i] = GamePad.GetState(i); // get state of gamepad
    if(gamePad[i].IsConnected) {
        // gamepad is connected
    }
}

在此循环中,您可以访问所有属性,例如按钮(正面和肩部)、数字板和两个模拟摇杆。以下是操作方法:

bool aButton = (gamePad[0].Buttons.A == ButtonState.Pressed); // button A
bool leftDigital = (gamePad[0].DPad.Right == ButtonState.Pressed); // left button on digital pad
int leftStick = gamePad[0].ThumbSticks.Left.X; // horizontal position of left stick

震动效果可以让游戏手柄振动,并为玩家提供对其在游戏中的行动的特殊反馈。例如,在射击游戏中被对手击中或在赛车游戏中发生碰撞可能会导致这种反馈。第二个和第三个参数控制震动效果的强度。

GamePad.SetVibration(int controllerNr, float leftRumble, float rightRumble); // make the controller rumble

其他游戏手柄

[编辑 | 编辑源代码]
微软 Sidewinder 游戏手柄

XNA 不支持原始 Xbox 控制器以外的其他游戏手柄。但是,可以使用一个名为 SlimDX 的免费库来集成对它们的 support。

此外,您还需要一个可以在 这里 找到的帮助程序类 - 它使用 SlimDX 来检查不是原始 Xbox 控制器控制器的游戏手柄状态。

如果您已下载、安装和集成了 SlimDX 库和帮助程序类,则可以使用以下代码检查游戏手柄状态 - 就像您在 XNA 中对 Xbox 控制器所做的那样。

controller = new GameController(this, 0); // number of gamepad
GameControllerState state = controller.GetState();
bool button1 = state.GetButtons()[1]; // button 1 pressed
Xbox 360 Kinect 独立版

Kinect 是 Xbox 的革命性视频摄像头,可以识别您在电视机前方的动作。这可以用于仅使用您的身体来控制游戏。开发人员可以使用 Kinect 框架将其集成到他们的游戏中。

华夏公益教科书