我有一个大型C ++游戏项目,我希望在其中添加对Xbox One控制器的支持。我尝试使用Windows.Gaming.Input namespace。但是,似乎这仅适用于UWP项目。这是真的吗?
如果是这种情况,是否可以轻松将现有SDL引擎移植到UWP?
答案 0 :(得分:2)
你可以从桌面应用程序调用Windows.Gaming.Input - 不知道你认为它只适用于UWP应用程序。只需包含标题并使用它。以下是在所有游戏手柄上打印按钮状态的示例代码:
#include <assert.h>
#include <cstdint>
#include <iostream>
#include <roapi.h>
#include <wrl.h>
#include "windows.gaming.input.h"
using namespace ABI::Windows::Foundation::Collections;
using namespace ABI::Windows::Gaming::Input;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;
#pragma comment(lib, "runtimeobject.lib")
int main()
{
auto hr = RoInitialize(RO_INIT_MULTITHREADED);
assert(SUCCEEDED(hr));
ComPtr<IGamepadStatics> gamepadStatics;
hr = RoGetActivationFactory(HStringReference(L"Windows.Gaming.Input.Gamepad").Get(), __uuidof(IGamepadStatics), &gamepadStatics);
assert(SUCCEEDED(hr));
ComPtr<IVectorView<Gamepad*>> gamepads;
hr = gamepadStatics->get_Gamepads(&gamepads);
assert(SUCCEEDED(hr));
uint32_t gamepadCount;
hr = gamepads->get_Size(&gamepadCount);
assert(SUCCEEDED(hr));
for (uint32_t i = 0; i < gamepadCount; i++)
{
ComPtr<IGamepad> gamepad;
hr = gamepads->GetAt(i, &gamepad);
assert(SUCCEEDED(hr));
GamepadReading gamepadReading;
hr = gamepad->GetCurrentReading(&gamepadReading);
assert(SUCCEEDED(hr));
std::cout << "Gamepad " << i + 1 << " buttons value is: " << gamepadReading.Buttons << std::endl;
}
return 0;
}