2016-12-22 1 views
0

J'ai un grand projet de jeu C++ dans lequel je veux ajouter le support pour les contrôleurs Xbox One. J'ai essayé d'utiliser le Windows.Gaming.Input namespace. Cependant, il semble que cela ne soit disponible que pour les projets UWP. Est-ce vrai?Comment utiliser l'espace de noms Windows.Gaming.Input en C++ sans utiliser UWP?

Si tel est le cas, serait-il facile de porter un moteur SDL existant vers UWP?

+0

Sauf si vous avez un besoin important d'utiliser l'API UWP pour cela, je suggère d'aller directement à [ 'XInput'] (https: // msdn. microsoft.com/en-us/library/windows/desktop/hh405053(v=vs.85).aspx) à la place. – Mgetz

Répondre

2

Vous pouvez appeler Windows.Gaming.Input très bien à partir d'applications de bureau - ne sais pas où vous avez eu l'idée qu'il est uniquement disponible pour les applications UWP. Juste inclure l'en-tête et l'utiliser. Voici l'exemple de code pour l'impression des états de bouton sur toutes les manettes de jeu:

#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; 
}