从 Windows.Xbox.Input 移植到 GameInput
Windows.Xbox.Input
是预 GDK Xbox One 软件开发工具包开发的输入 API。 在概念上,GameInput
以不同方式查看设备和输入读取。 本主题介绍了 Windows.Xbox.Input
与 GameInput
之间的一些关键差异。
以输入为中心对比以设备为中心
Windows.Xbox.Input
和 GameInput
之间的主要区别是,前者要求你首先收集设备和作为设备属性的输入状态。 相比之下,GameInput
从具有关联设备的可筛选输入读取流开始。
查找 A 按钮,按下
在某一游戏首次启动时,用户常常必须按下 A 以表明他们已做好继续准备。 这里有一个比较了在 Windows.Xbox.Input
和 GameInput
中执行此操作的示例。 此示例仅查找游戏板。 请注意,出于演示目的对示例进行了简化。
Windows.Xbox.Input
以下代码示例通过枚举连接到系统的所有游戏板并且将其存储于 gamepads
矢量中来开始。 它然后将在一个循环中循环访问 gamepads
,查看其每个当前输入读取,并且检查每个读取是否为 A。
注意
此代码引用以前的 API。
GameInput
中不存在这些调用。
void PollGamepadInput()
{
// Find all gamepads.
IVectorView<IGamepad^>^ gamepads = Gamepad::GetGamepads();
// Cycle through each gamepad.
for ( unsigned int i = 0; i < gamepads->Size; ++i )
{
// Get the gamepad's current reading.
IGamepadReading^ reading = gamepads->GetAt(i)->GetCurrentReading();
if ( reading->IsAPressed )
{
// Logic for the A button being pressed.
}
}
}
此模型可以改进。 游戏必须存储连接到系统的不同设备的副本。 你必须了解每个设备的细节。 另外,通过存储所有游戏板的本地副本,该代码及时捕获某一状态,而不是获取最新读取。
GameInput
在以下代码示例中,这段代码查找来自任何设备的最近的游戏板读取。 通过调用 GameInputKind 筛选器设置为 GamePad
的 GetCurrentReading,代码会要求 m_gameInput
仅返回游戏板读数。 接下来,代码将查询读取的状态并检查 A 是否按下。
你可能想要跟踪你正在与哪一个游戏板进行交流。 有关更完整的示例,请参阅 GameInput 读取。
IGameInput* g_gameInput = nullptr;
HRESULT InitializeInput()
{
return GameInputCreate(&g_gameInput);
}
void PollGamepadInput()
{
ComPtr<IGameInputReading> reading;
// Get the most current gamepad reading, not filtering by a specific device.
// An error from the GetReading method indicates that no gamepad readings
// were found.
if (SUCCEEDED(g_gameInput->GetCurrentReading(GameInputKindGamepad, nullptr, &reading)))
{
// Read the gamepad state.
GameInputGamepadState state;
reading->GetGamepadState(&state);
if (state.buttons & GameInputGamepadA)
{
// Logic for the A button being pressed.
}
}
}
注意
GameInput
不要求你循环访问设备并检查每个读取。 你可以通过一个方法调用检查最新的输入状态。 你可以选择希望了解的每台物理设备的信息量。